我如何允许直线跳跃然后回到地面 pygame



有很多代码,但大部分是必要的。它被命名是为了试图清楚地理解。我试图让它跳跃,但当我到达空间时,它只会上升一点并停留在那里。我想利用空间,让它跳跃相当多,然后用合理的物理原理降落回来。如果有人知道如何做到这一点,那将非常有帮助。我不确定您将如何使用pygame执行此操作。

import pygame, sys, time, random
from pygame.locals import *
class Entity(pygame.sprite.Sprite):
    """Inherited by any object in the game."""
    def __init__(self, x, y, width, height):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        # This makes a rectangle around the entity, used for anything
        # from collision to moving around.
        self.rect = pygame.Rect(self.x, self.y, self.width, self.height)
class Duck(Entity):
    """
    Player controlled or AI controlled, main interaction with
    the game
    """
    def __init__(self, x, y, width, height):
        super(Duck, self).__init__(x, y, width, height)
        self.image = duck
class Player(Duck):
    """The player controlled Duck"""

    def __init__(self, x, y, width, height):
        super(Player, self).__init__(x, y, width, height)
        # How many pixels the Player duck should move on a given frame.
        self.x_change = 0
        # How many pixels the spaceship should move each frame a key is pressed.
        self.x_dist = 5

    def MoveKeyDown(self, key):
        """Responds to a key-down event and moves accordingly"""
        if (key == pygame.K_LEFT or key == pygame.K_a):
            self.x_change += -self.x_dist
        elif (key == pygame.K_RIGHT or key == pygame.K_d):
            self.x_change += self.x_dist
        elif (key == pygame.K_SPACE):
            self.jump()
    def MoveKeyUp(self, key):
        """Responds to a key-up event and stops movement accordingly"""
        if (key == pygame.K_LEFT or key == pygame.K_a):
            self.x_change += self.x_dist
        elif (key == pygame.K_RIGHT or key == pygame.K_d):
            self.x_change += -self.x_dist
        elif (key == pygame.K_SPACE):
            self.jump()
    def jump(self):
        self.rect.y -= 3

    def update(self):
        """
        Moves the duck while ensuring it stays in bounds
        """
        # Moves it relative to its current location.
        self.rect.move_ip(self.x_change, 0)
        # If the duck moves off the screen, put it back on.
        if self.rect.x <= 0:
            self.rect.x = 0
        elif self.rect.x > window_width:
            self.rect.x = window_width

pygame.init()
FPS = 60  # frames per second setting
clock = pygame.time.Clock()
window_width = 1000
window_height = 600
# set up the window
screen = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption('Deterred Journey')
duck = pygame.image.load('walkingduck.png')
duck = pygame.transform.scale(duck, (160, 180))
player = Player(0, (window_height)-175, 120, 160) #Making player object(duck)
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(player)
while True:  # the main game loop
    for event in pygame.event.get(): #Closes game
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYUP:
            player.MoveKeyUp(event.key)
        elif event.type == pygame.KEYDOWN:
            player.MoveKeyDown(event.key)
    all_sprites_list.draw(screen)
    pygame.display.flip()
    pygame.display.update()

有一种非常简单的方法可以将重力实现到您的游戏中。首先,输入一个变量来控制您的速度。在此示例中,它是 y_speed

y_speed = 0

现在,而不是

def jump(self):
    self.rect.y -= 3

使用此代码

def jump(self):
    y_speed = -3
While true:
    y_speed += 1
    self.rect.y +-= y_speed

这样当你跳跃时,你总是会摔倒,就像现实生活一样,你可能会摔得更快。为了确保您不会从屏幕上掉下来,请实现某种冲突检测,如下所示:

def jump(self):
    y_speed = -3
While true:
    y_speed += 1
    self.rect.y +-= y_speed
if self.rect.colliderect([some sort of object representing the ground].rect):
    y_speed = 0

这是一种非常简单的方法,我不太使用Classes,但这应该希望有助于为您提供基本的引力,并能够纵以处理您的代码。

最新更新