【问题标题】:Sprite not moving despite inputs in pygame尽管在 pygame 中输入,Sprite 仍不移动
【发布时间】:2021-01-04 11:12:16
【问题描述】:

我在 pygame 中遇到了一个问题,无论输入如何,精灵都不会移动,我已经检查了好几次,但不知道它有什么问题。一共有3个页面,第一个是游戏的主循环,第二个是玩家精灵的代码,第三个是一些游戏功能。

main---------page-01

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

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:
        # Check if user wants to quit
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
                
        # Navy screen       
        screen.fill((0,0,128))
        
        gf.responses(screen, player)
        player.p_movements()
            
        # Make the player appear
        player.draw_player()
        
        # Make the newly made screen visible
        pygame.display.flip()
    
run_game()

播放器--------------------page-02

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, 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
        
    def p_movements(self):
        
        if self.moving_left:
            self.rect.x -= 5
        if self.moving_right:
            self.rect.x += 5
        if self.moving_up:
            self.rect.y -= 30   
        
    def draw_player(self):
        ''' Draw the player on the screen'''
        pygame.draw.rect(self.screen, (255,255,255), self.rect)
        
            

game_functions-----------------page-03

import pygame


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

【问题讨论】:

    标签: python pygame sprite


    【解决方案1】:

    您在主事件循环中似乎要做的第一件事是在寻找退出事件时完全清除队列。游戏函数文件中的第二个事件循环不一定会很好。

    事实上,有两个事件循环是相当混乱的,其中一个会丢弃任何不是退出事件的东西——这很可能导致丢失事件。

    我怀疑更好的方法是提供一个 response 游戏函数,它只处理 一个 事件(并且根本不触及事件队列):

    def response(screen, player, evt):
        if evt.type == pygame.KEYDOWN:
            blah blah blah
    

    并让主(现在是)事件循环调用它自己不想处理的事件:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        gf.response(screen, player, event)
    

    您可能还需要考虑同时按下向上和向下按钮(或向左和向右,就此而言)时的预期。至少,您可能希望将其作为测试用例 :-)

    【讨论】:

    • 不好意思再说一遍,精灵还是不动
    • 我仍在检查我的代码,但由于它没有运行而出现了一个小错误,但非常感谢@paxdiablo 的帮助
    猜你喜欢
    • 2012-06-30
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多