如何在没有精灵的情况下实施跳跃



我是编程和python和pygame的新手。因此,我对Pygame中的精灵不满意。我正在尝试制作一个游戏,只要按下空格键,块就会跳跃 - 类似于Mario。

我的代码无法正常工作,因为只要按下空格键,块就会逐步向上移动(我添加了一个重力组件),而不是"跳跃"。

import pygame
pygame.init()
game_display = pygame.display.set_mode((800, 800))

# fixed variables at the start
x_pos = 400
y_pos = 400
current_speed = 15
def jump_coords(y_position, speed):
    if speed >= 0:
        #to move up, reduce the y-coordinate
        y_position -= speed
    return y_position
game_exit = False
# main loop
while not game_exit: 
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                y_pos = jump_coords(y_pos, current_speed)
                # 1 represents gravity value
                current_speed -= 1
    rect_one = pygame.Rect(x_pos, y_pos, 10, 10)  
    pygame.draw.rect(game_display, (255, 0, 0), rect_one)
    pygame.display.update()

我知道我必须以某种方式使y_pos在 speed >= 0时继续在while循环中进行更新,但我不确定如何实现。

我对您的代码进行了最小更改,以使块弹跳:

import pygame
pygame.init()
game_display = pygame.display.set_mode((800, 800))
# fixed variables at the start
x_pos = 400
y_pos = 400
x_old = x_pos
y_old = y_pos
current_speed = 15
def jump_coords(y_position, speed):
    # to move up, reduce the y-coordinate
    y_position -= speed
    if y_position > 400:
        y_position = 400
        global jump_flag
        jump_flag = False
        global current_speed
        current_speed = 15
    return y_position
game_exit = False
jump_flag = False
# main loop
while not game_exit:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                jump_flag = True
            elif event.key == pygame.K_ESCAPE:
                exit(0)
    if jump_flag:
        x_old = x_pos
        y_old = y_pos
        y_pos = jump_coords(y_pos, current_speed)
        # 1 represents gravity value
        current_speed -= 1
    rect_old = pygame.Rect(x_old, y_old, 10, 10)
    pygame.draw.rect(game_display, (0, 0, 0), rect_old)
    rect_one = pygame.Rect(x_pos, y_pos, 10, 10)
    pygame.draw.rect(game_display, (255, 0, 0), rect_one)
    pygame.display.update()

最重要的变化是去除速度大于零的检查。如果块将退后,速度必须呈负。下一个更改是保存旧的X和Y坐标,以便我们可以在旧位置上画一个黑色正方形。我还可以通过按下逃生键退出程序。

我从头开始做这个,我希望它不会太艰巨!

import pygame,sys
pygame.init()
screen = pygame.display.set_mode((800, 800))
tm = 20 # Terminal Velocity
gravity = 1
class Player:
    def __init__(self,speed,x,y):
        self.speed = speed
        self.x = x; self.y = y
        self.yVelocity = 0
        self.xVelocity = 0
    def getKeys(self):
        key = pygame.key.get_pressed()
        if key[pygame.K_a]: self.xVelocity -= self.speed
        if key[pygame.K_d]: self.xVelocity += self.speed
        if key[pygame.K_SPACE]:
            if isGround(self.x,self.y):
                self.yVelocity -= 20
    def move(self,dt):
        if self.x < 0:
            self.x = 0
        if self.x > 800-15:
            self.x = 800-15
        if self.y < 0:
            self.y = 0
        if self.y > 800-10:
            self.y = 800-10
        self.x += self.xVelocity
        self.y += self.yVelocity
        if self.xVelocity != 0:
            self.xVelocity /= 70*dt
        if self.yVelocity < tm and not isBlocking(self.x,self.y+self.yVelocity):
            self.yVelocity += gravity
        if isBlocking(self.x,self.y):
            self.yVelocity = 0
    def draw(self):
        screen.fill((255,0,0),(self.x,self.y,10,10))
def isBlocking(x,y):
    if x < 0 or x > 800 or y < 0 or y > 800:
        return True
    elif y >= 400:
        return True
    else:
        return False
def isGround(x,y):
    if y >= 400:
        return True
    else:
        return False
player = Player(1,400,400)
clock = pygame.time.Clock()
while True:
    dt = clock.tick(60)/1000 # limit to 60 FPS.
    screen.fill((0,0,0))
    if pygame.event.poll().type == pygame.QUIT: pygame.quit(); sys.exit()
    player.getKeys()
    player.move(dt)
    player.draw()
    pygame.display.flip()

希望它有帮助!

最新更新