这是我的程序源代码。如有必要,请浏览它:
import pygame, sys
import time
pygame.init()
screen = pygame.display.set_mode([1500,750])
background = pygame.Surface(screen.get_size())
background.fill([255, 255, 255])
class Attacker(pygame.sprite.Sprite):
def __init__(self, image_file, location):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image_file)
self.rect = self.image.get_rect()
self.x_pos, self.y_pos = location
self.rect.x, self.rect.y = location
self.jumping = False
self.falling = False
self.direction = 1
def jump(self):
if self.y_pos > CEILING:
self.x_pos += 1*self.direction
self.y_pos -= 5
else:
self.jumping = False
self.falling = True
self.update_pos()
def fall(self):
if self.y_pos < FLOOR:
self.x_pos += 1*self.direction
self.y_pos += 5
else:
self.falling = False
self.update_pos()
def InvisWalls(self):
if self.rect.left < 0:
self.direction = -self.direction
if self.rect.right > screen.get_width():
self.direction = -self.direction
self.update_pos()
def update_pos(self):
self.rect.x = self.x_pos
self.rect.y = self.y_pos
FLOOR = 700
CEILING = 10
my_ball = Attacker('wackyball.bmp',[300, FLOOR])
delay = 100
interval = 50
pygame.key.set_repeat(delay, interval)
running = True
while running:
if my_ball.jumping:
my_ball.jump()
if my_ball.falling:
my_ball.fall()
else:
my_ball.InvisWalls()
screen.blit(my_ball.image, my_ball.rect)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
my_ball.y_pos -= 25
elif event.key == pygame.K_DOWN:
my_ball.y_pos += 25
elif event.key == pygame.K_RIGHT:
my_ball.direction = 1
my_ball.x_pos += 25
elif event.key == pygame.K_LEFT:
my_ball.direction = -1
my_ball.x_pos -= 25
elif event.key == pygame.K_SPACE:
if not my_ball.falling:
my_ball.jumping = True
my_ball.update_pos()
screen.blit(background, (0, 0))
screen.blit(my_ball.image, my_ball.rect)
pygame.display.flip()
pygame.quit()
我的问题是,当我的球跳起时,它会以一条直线向上移动并且也会直线下降。我试图让球在曲线上跳跃的尝试只是失败了,只是让跳得更快。如何让球在连续曲线上上下移动,就像真正的球一样?
答案 0 :(得分:1)
当我制作一个基本的平台游戏时,我遇到了类似的问题。我通过一个垂直速度变量解决了它(不跳时为零)。当玩家跳跃时,我将速度设置为最大值,然后在每次刷新屏幕时将其减小(当它低于零时,然后开始下降)。当我检测到玩家已经着陆时,我将其设置为零。
注意:如果您需要,可以设置最大向下速度检查,以模拟&#34;终端速度&#34;对象。如果你想要一些非常酷的东西,你也可以很好地研究“重力”。风格设计,但更高级。
答案 1 :(得分:0)
你的球以直线移动,因为它具有恒定的y
速度。为了使它像真正的球一样弯曲,你需要在模型中加入一些物理。也就是说,根据重力引起的球加速度改变y
- 速度。必要的等式是:v_y = v_y(0) - gt其中v_y(0)是时间t = 0时的初始y速度,g是重力加速度(地球上10 ms ^ -2)。
如果不对代码进行大的更改,请查看更改行self.y_pos += 5
和self.y_pos -= 5
,以便在途中向y位置添加越来越小的数字而不是常数±5在向下的路上向上并减去越来越大的数字。