Python pygame中的摩擦力和引力
我希望玩家1有一个恒定的向下加速度作用在他身上。我尝试了几种方法,但并没有按照我的意愿真正起作用。当我给球员一个向上的速度时,他会越来越高。我试着改变速度和重力值,它看起来好一点,但我不确定它是否正确。我还希望当player1在屏幕底部时,会有一个摩擦力作用在player1上,但因为摩擦力取决于法向力,而法向力取决于重力(如果我错了,请纠正我),所以我还不能这样做,所以我只是在player1上有一个恒定的摩擦力,但这也有点“奇怪”。我希望它在速度达到0时停止播放1,而不是反向加速Python pygame中的摩擦力和引力,python,pygame,Python,Pygame,我希望玩家1有一个恒定的向下加速度作用在他身上。我尝试了几种方法,但并没有按照我的意愿真正起作用。当我给球员一个向上的速度时,他会越来越高。我试着改变速度和重力值,它看起来好一点,但我不确定它是否正确。我还希望当player1在屏幕底部时,会有一个摩擦力作用在player1上,但因为摩擦力取决于法向力,而法向力取决于重力(如果我错了,请纠正我),所以我还不能这样做,所以我只是在player1上有一个恒定的摩擦力,但这也有点“奇怪”。我希望它在速度达到0时停止播放1,而不是反向加速 import
import sys
import pygame
pygame.init()
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
screen_rect = screen.get_rect()
clock = pygame.time.Clock()
fps = 30
class Character(object):
def __init__(self, surface, velo, accel, gravity, friction):
self.surface = surface
self.velo = velo
self.accel = accel
self.gravity = gravity
self.friction = friction
self.timestep = 1/fps
self.vel = (0, 0)
self.pos = ((screen_width / 2), (screen_height / 2))
self.size = (10, 10)
def velocity_right(self):
self.pos = (self.pos[0] + self.velo, self.pos[1])
def velocity_left(self):
self.pos = (self.pos[0] - self.velo, self.pos[1])
def velocity_up(self):
self.pos = (self.pos[0], self.pos[1] - self.velo)
def velocity_down(self):
self.pos = (self.pos[0], self.pos[1] + self.velo)
def velocity(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_i]:
self.velocity_up()
if keys[pygame.K_j]:
self.velocity_left()
if keys[pygame.K_k]:
self.velocity_down()
if keys[pygame.K_l]:
self.velocity_right()
def accelerate_right(self):
self.vel = (self.vel[0] + self.accel, self.vel[1])
self.pos = (self.pos[0] + self.vel[0], self.pos[1])
def accelerate_left(self):
self.vel = (self.vel[0] - self.accel, self.vel[1])
self.pos = (self.pos[0] + self.vel[0], self.pos[1])
def accelerate_up(self):
self.vel = (self.vel[0], self.vel[1] - self.accel)
self.pos = (self.pos[0], self.pos[1] + self.vel[1])
def accelerate_down(self):
self.vel = (self.vel[0], self.vel[1] + self.accel)
self.pos = (self.pos[0], self.pos[1] + self.vel[1])
def accelerate(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
self.accelerate_up()
if keys[pygame.K_a]:
self.accelerate_left()
if keys[pygame.K_s]:
self.accelerate_down()
if keys[pygame.K_d]:
self.accelerate_right()
if self.pos[0] <= 0 or self.pos[0] >= screen_width:
self.vel = (self.vel[0] * -1, self.vel[1])
if self.pos[1] <= 0 or self.pos[1] >= screen_height:
self.vel = (self.vel[0], self.vel[1] * -1)
self.character = pygame.Rect((self.pos[0], self.pos[1]), self.size)
self.character.clamp_ip(screen_rect)
def display(self):
pygame.draw.rect(self.surface, (255, 255, 255), self.character)
def reset(self):
(x_pos, y_pos) = pygame.mouse.get_pos()
self.pos = (x_pos, self.pos[1])
self.pos = (self.pos[0], y_pos)
self.vel = (0, 0)
def apply_gravity(self):
self.vel = (self.vel[0], self.vel[1] + self.accel)
self.pos = (self.pos[0], self.pos[1] + self.vel[1])
# self.vel = (self.vel[0], self.vel[1] + self.gravity * self.timestep)
# self.pos = (self.pos[0], self.pos[1] + self.vel[1] * self.timestep + 0.5 * self.gravity * self.timestep**2)
def apply_friction(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_w] or keys[pygame.K_i]:
self.vel = (self.vel[0], self.vel[1] + self.friction)
self.pos = (self.pos[0], self.pos[1] + self.vel[1])
if keys[pygame.K_a] or keys[pygame.K_j]:
self.vel = (self.vel[0] + self.friction, self.vel[1])
self.pos = (self.pos[0] + self.vel[0], self.pos[1])
if keys[pygame.K_s] or keys[pygame.K_k]:
self.vel = (self.vel[0], self.vel[1] - self.friction)
self.pos = (self.pos[0], self.pos[1] + self.vel[1])
if keys[pygame.K_d] or keys[pygame.K_l]:
self.vel = (self.vel[0] - self.friction, self.vel[1])
self.pos = (self.pos[0] + self.vel[0], self.pos[1])
def main():
player1 = Character(screen, 10, 1, .5, .4)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
player1.reset()
player1.apply_gravity()
player1.apply_friction()
player1.velocity()
player1.accelerate()
screen.fill((0, 0, 0))
player1.display()
pygame.display.update(screen_rect)
clock.tick(fps)
if __name__ == "__main__":
main()
导入系统
导入pygame
pygame.init()
屏幕宽度=640
屏幕高度=480
screen=pygame.display.set_模式((屏幕宽度、屏幕高度))
screen\u rect=screen.get\u rect()
clock=pygame.time.clock()
fps=30
类字符(对象):
定义初始(自身、表面、速度、加速度、重力、摩擦力):
self.surface=曲面
self.velo=velo
自加速=加速
重力
自摩擦
self.timestep=1/fps
self.vel=(0,0)
self.pos=((屏幕宽度/2),(屏幕高度/2))
self.size=(10,10)
def速度_右(自):
self.pos=(self.pos[0]+self.velo,self.pos[1])
def速度_左(自):
self.pos=(self.pos[0]-self.velo,self.pos[1])
def速度_上升(自):
self.pos=(self.pos[0],self.pos[1]-self.velo)
def速度下降(自):
self.pos=(self.pos[0],self.pos[1]+self.velo)
def速度(自):
keys=pygame.key.get_pressed()
如果键[pygame.K_i]:
self.velocity_up()
如果键[pygame.K_j]:
self.velocity_left()
如果键[pygame.K_K]:
自速度_down()
如果键[pygame.K_l]:
self.velocity_right()
def右加速(自):
self.vel=(self.vel[0]+self.accel,self.vel[1])
self.pos=(self.pos[0]+self.vel[0],self.pos[1])
def加速_左(自):
self.vel=(self.vel[0]-self.accel,self.vel[1])
self.pos=(self.pos[0]+self.vel[0],self.pos[1])
def加速(自):
self.vel=(self.vel[0],self.vel[1]-self.accel)
self.pos=(self.pos[0],self.pos[1]+self.vel[1])
def加速下降(自):
self.vel=(self.vel[0],self.vel[1]+self.accel)
self.pos=(self.pos[0],self.pos[1]+self.vel[1])
def加速(自):
keys=pygame.key.get_pressed()
如果键[pygame.K_w]:
自我加速
如果键[pygame.K_a]:
自加速左()
如果键[pygame.K_s]:
self.accelerate_down()
如果键[pygame.K_d]:
自我加速(右)
如果self.pos[0]=屏幕宽度:
self.vel=(self.vel[0]*-1,self.vel[1])
如果self.pos[1]=屏幕高度:
self.vel=(self.vel[0],self.vel[1]*-1)
self.character=pygame.Rect((self.pos[0],self.pos[1]),self.size)
self.character.climp\u ip(屏幕显示)
def显示(自):
pygame.draw.rect(self.surface,(255,255,255),self.character)
def重置(自):
(x_pos,y_pos)=pygame.mouse.get_pos()
self.pos=(x_pos,self.pos[1])
self.pos=(self.pos[0],y_pos)
self.vel=(0,0)
def施加重力(自身):
self.vel=(self.vel[0],self.vel[1]+self.accel)
self.pos=(self.pos[0],self.pos[1]+self.vel[1])
#self.vel=(self.vel[0],self.vel[1]+self.gravity*self.timestep)
#self.pos=(self.pos[0],self.pos[1]+self.vel[1]*self.timestep+0.5*self.gravity*self.timestep**2)
def施加摩擦(自):
keys=pygame.key.get_pressed()
如果键[pygame.K_w]或键[pygame.K_i]:
self.vel=(self.vel[0],self.vel[1]+自摩擦)
self.pos=(self.pos[0],self.pos[1]+self.vel[1])
如果键[pygame.K_a]或键[pygame.K_j]:
self.vel=(self.vel[0]+self.摩擦力,self.vel[1])
self.pos=(self.pos[0]+self.vel[0],self.pos[1])
如果键[pygame.K_s]或键[pygame.K_K]:
self.vel=(self.vel[0],self.vel[1]-自摩擦)
self.pos=(self.pos[0],self.pos[1]+self.vel[1])
如果键[pygame.K_d]或键[pygame.K_l]:
self.vel=(self.vel[0]-self.摩擦力,self.vel[1])
self.pos=(self.pos[0]+self.vel[0],self.pos[1])
def main():
player1=字符(屏幕,10,1,5,4)
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type==pygame.MOUSEBUTTONDOWN:
player1.reset()
播放者1.应用重力()
播放者1.施加摩擦()
player1.velocity()
player1.加速
屏幕填充((0,0,0))
player1.display()
pygame.display.update(屏幕显示)
时钟滴答声(fps)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
我认为你可以将你的速度和加速度建模为向量,这对我来说很有用(仅举一个timestep=1 fps的例子,简化方程式): 导入系统 导入pygame pygame.init() 屏幕宽度=640 屏幕高度=480 screen=pygame.display.set_模式((屏幕宽度、屏幕高度)) screen\u rect=screen.get\u rect() clock=pygame.time.clock() fps=30 摩擦=0.8 将numpy作为np导入 类字符(对象): 定义初始(自身、表面、加速度、重力): self.surface=曲面 self.accel=np.array(加速度) self.gravity=np.array([0.0,浮点(重力)]) self.vel=np.array([0.0,0.0]) self.pos=np.array([(屏幕宽度/2.0),(屏幕高度/2.0)])
import sys
import pygame
pygame.init()
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
screen_rect = screen.get_rect()
clock = pygame.time.Clock()
fps = 30
FRICTION = 0.8
import numpy as np
class Character(object):
def __init__(self, surface, accel, gravity):
self.surface = surface
self.accel = np.array(accel)
self.gravity = np.array([0.0,float(gravity)])
self.vel = np.array([0.0,0.0])
self.pos = np.array([(screen_width / 2.0), (screen_height / 2.0)])
self.size = (10, 10)
def move_right(self):
self.vel += np.array([1,0])
self.accel += np.array([1,0])
def move_left(self):
self.vel += np.array([-1,0])
self.accel += np.array([-1,0])
def move_up(self):
self.vel += np.array([0,-1])
self.accel += np.array([0,-1])
def move_down(self):
self.vel += np.array([0,1])
self.accel += np.array([0,1])
def move(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_w]:
self.move_up()
if keys[pygame.K_a]:
self.move_left()
if keys[pygame.K_s]:
self.move_down()
if keys[pygame.K_d]:
self.move_right()
if self.pos[0] <= 0 or self.pos[0] >= screen_width:
self.vel[0] *= -FRICTION
self.accel[0] *= -FRICTION
if self.pos[0] <= 0:
self.pos[0] = 0
elif self.pos[0] >= screen_width:
self.pos[0] = screen_width
elif self.pos[1] <= 0 or self.pos[1] >= screen_height:
self.vel[1] *= -FRICTION
self.accel[1] *= -FRICTION
if self.pos[1] <= 0:
self.pos[1] = 0
elif self.pos[1] >= screen_height:
self.pos[1] = screen_height
else:
self.vel = self.vel + (self.gravity+self.accel)
if self.vel.dot(self.vel) < 1e-5:
self.vel = np.zeros(2)
self.accel *= FRICTION
if self.accel.dot(self.accel) < 1e-5:
self.accel = np.zeros(2)
self.pos = self.pos + self.vel + 0.5*self.gravity+self.accel
#print self.pos, self.vel, self.accel
self.character = pygame.Rect((self.pos[0], self.pos[1]), self.size)
self.character.clamp_ip(screen_rect)
def display(self):
pygame.draw.rect(self.surface, (255, 255, 255), self.character)
def reset(self):
self.pos = np.array(pygame.mouse.get_pos())
self.vel = np.array([0,0]);
def main():
player1 = Character(screen, [0.0, 0.0], .5)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
player1.reset()
player1.move()
screen.fill((0, 0, 0))
player1.display()
pygame.display.update(screen_rect)
clock.tick(fps)
if __name__ == "__main__":
main()