如何在pygame中使对象“跳转”

时间:2018-07-21 22:34:09

标签: python pygame

我试图按照马里奥的方式创作一些东西,这远非我所知。无论如何,在尝试使用“跳转”方法时,我遇到了一个问题-跳转无法达到我预期的工作方式。当我单击空格键时,我的红色方块会随机上下移动,我必须按下空格键并按住它才能完成跳跃,即使这样也不完美。有时,当我按住空格键太长时间时,红色方块会继续跳下去。有什么办法解决这个问题?非常感谢您的帮助。

import pygame, time, math, random, sys
from pygame.locals import *

background = pygame.image.load("assets/MarioBackground.png")

def events():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

W, H = 640, 400
HW, HH = W / 2, H / 2
AREA = W * H
FPS = 60
bg_x = 0
isJump = False
jumpCount = 10

pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((W,H))
pygame.display.set_caption("Mario")

class Mario():

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def draw(self):
        pygame.draw.rect(screen, (255,0,0), (self.x, self.y, 40, 40))

    def move(self):
        global bg_x
        if pressed_keys[K_RIGHT] and bg_x > -920:
            if self.x > 490:
                bg_x -= 5
            else:
                self.x += 5
        if pressed_keys[K_LEFT] and self.x > 5:
            self.x -= 5

    def jump(self):
        global jumpCount, isJump
        if pressed_keys[K_SPACE]:
            if jumpCount >= -10:
                isJump = True
                print(jumpCount)
                neg = 1
                if jumpCount < 0:
                    neg = -1
                self.y -= (jumpCount ** 2) * 0.1 * neg
                jumpCount -= 1
            else:
                isJump = False
                jumpCount = 10




mario = Mario(50, 270)

while True:
    clock.tick(FPS)
    events()
    pressed_keys = pygame.key.get_pressed()

    screen.blit(background, (bg_x,0))


    mario.move()
    mario.draw()
    mario.jump()



    pygame.display.update()

2 个答案:

答案 0 :(得分:3)

您可以通过执行以下规则来修复它:

  • 您只有在触摸地板时才能开始跳跃
  • 您可以通过按下空格键(设置一个变量)开始跳跃,并在触摸地板时停止跳跃
  • 如果不按下键,您将开始按下键(pygame.KEYDOWN)。

一些代码段:

开始跳转

for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE and self.y == 0:
            isJump = True

结束跳转

if self.y == 0:
    isJump = False

使用此规则,您只能在地板上跳。您无需按住空格键,只要将空格键保持很长就不会第二次跳

答案 1 :(得分:2)

只需检查isJump是否为真,然后以jump方法执行跳转代码。我还建议将isJumpjumpCount作为属性添加到Mario,这样就不必修改全局变量。

要防止在按下空格时连续跳跃,必须处理事件队列中的按键。然后,每次按下按键时仅触发一次跳跃动作,而在按住该键时不会触发。

import pygame, time, math, random, sys
from pygame.locals import *

background = pygame.Surface((640, 400))
background.fill((30, 90, 120))

W, H = 640, 400
HW, HH = W / 2, H / 2
AREA = W * H
FPS = 60
bg_x = 0

pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((W,H))


class Mario():

    def __init__(self, x, y):
        self.x = x
        self.y = y
        # isJump and jumpCount should be attributes of Mario.
        self.isJump = False
        self.jumpCount = 10

    def draw(self):
        pygame.draw.rect(screen, (255,0,0), (self.x, self.y, 40, 40))

    def move(self):
        global bg_x
        if pressed_keys[K_RIGHT] and bg_x > -920:
            if self.x > 490:
                bg_x -= 5
            else:
                self.x += 5
        if pressed_keys[K_LEFT] and self.x > 5:
            self.x -= 5

    def jump(self):
        # Check if mario is jumping and then execute the
        # jumping code.
        if self.isJump:
            if self.jumpCount >= -10:
                neg = 1
                if self.jumpCount < 0:
                    neg = -1
                self.y -= self.jumpCount**2 * 0.1 * neg
                self.jumpCount -= 1
            else:
                self.isJump = False
                self.jumpCount = 10


mario = Mario(50, 270)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                # Start to jump by setting isJump to True.
                mario.isJump = True

    clock.tick(FPS)
    pressed_keys = pygame.key.get_pressed()
    screen.blit(background, (bg_x,0))
    mario.move()
    mario.draw()
    mario.jump()
    pygame.display.update()