微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame 精灵跳跃时不动

如何解决Pygame 精灵跳跃时不动

我很困惑为什么我的精灵在跳跃时没有移动。我已经检查了几次并一遍又一遍地更改了我的代码,但没有运气。我的代码在下面,包含 3 个页面,第一个包含主循环,第二个包含播放器类,第三个包含一些游戏功能

主要

import pygame
from player import Player
import game_functions as gf
import sys
import time

def run_game():
    # Intialise the game and start the screen
    pygame.init()   
    screen = pygame.display.set_mode((800,600))
    pygame.display.set_caption("Amarcreep")
    
    player = Player(screen)
    
    # Main loop
    while True:
        
        # Navy screen
        screen.fill((0,128))
        
        
        for event in pygame.event.get():
            # Check if user wants to quit
            if event.type == pygame.QUIT:
                sys.exit()
            gf.responses(screen,player,event)
            
        player.p_movements()
        
        
        # Make the player appear
        player.draw_player()
        
        
        # Make the newly made screen visible
        pygame.display.flip()
    
run_game()

玩家

import pygame
from pygame.sprite import Sprite


class Player(Sprite):
    # Initialise the main player
    
    def __init__(self,screen):
        super(Player,self).__init__()
        
        self.screen = screen
        self.screen_rect = screen.get_rect()
        
        # Specifying the position of the player at start 
        self.rect = pygame.Rect(0,30,30)
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = 590
        
        self.moving_left = False
        self.moving_right = False
        self.moving_up = False
        self.y = 30
        self.y_ud = 5
        
        
    def p_movements(self):
        
        if self.moving_left and self.rect.x > 5:
            self.rect.x -= 1
        if self.moving_right and self.rect.x < 765:
            self.rect.x += 1    
        if self.moving_up:
            self.rect.y -= self.y
            self.y -= 2
            if self.y == -30:
                self.moving_up = False
                self.y = 30
                self.rect.bottom = 590
            pygame.time.delay(20)   
        
                
            
            
            
    def draw_player(self):
        ''' Draw the player on the screen'''
        pygame.draw.rect(self.screen,(255,255,255),self.rect)
    

游戏功能

import pygame


def responses(screen,event):
    ''' Check for responses'''
    
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP:
            player.moving_up = True
            
                
        if event.key == pygame.K_LEFT:
            player.moving_left = True
                
        if event.key == pygame.K_RIGHT:
            player.moving_right = True
                
    elif event.type == pygame.KEYUP:
        
                
        if event.key == pygame.K_LEFT:
            player.moving_left = False
                
        if event.key == pygame.K_RIGHT:
            player.moving_right = False
        

解决方法

实际上,当您跳跃时,玩家会移动,但在“self.moving_up”的情况下,由于pygame.time.delay(20)而几乎不明显。
从您的代码中删除 delay,但增加玩家的移动:

class Player(Sprite):

    def p_movements(self):
        
        if self.moving_left and self.rect.x > 5:
            self.rect.x -= 5                         # <---
        if self.moving_right and self.rect.x < 765:
            self.rect.x += 5                         # <--- 
        if self.moving_up:
            self.rect.y -= self.y
            self.y -= 2
            if self.y == -30:
                self.moving_up = False
                self.y = 30
                self.rect.bottom = 590
            # pygame.time.delay(20)                    <--- DELETE

但是使用 pygame.time.Clock 来控制每秒帧数,从而控制游戏速度。

tick() 对象的方法 pygame.time.Clock 以这种方式延迟游戏,即循环的每次迭代消耗相同的时间段。见pygame.time.Clock.tick()

这个方法应该每帧调用一次。

def run_game():
    # [...]
    
    # Main loop
    clock = pygame.time.Clock()
    while True:
        clock.tick(60)

        # [...]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。