python - 无法控制游戏中的物体

标签 python pygame

我是 Python 新手,目前正在使用 Python 速成类(class)创建游戏。我的项目涉及开发一款入侵游戏,我在其中控制一艘宇宙飞船。然而,我在有效管理飞船的方向方面遇到了困难。

外星人游戏.py

import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf


def run_game():
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("TemplAReeb's First Game")
    ship = Ship(ai_settings, screen)
    bg_color = (230, 230, 230)

    while True:
        gf.check_events(ship)
        ship.update()
        gf.update_screen(ai_settings, screen, ship)
        screen.fill(bg_color)
        ship.blitme()
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                sys.exit()
        screen.fill(bg_color)
        ship.blitme()
        pygame.display.flip()
run_game()

game_functions.py

import sys
import pygame
def check_keydown_events(event, ship):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = True
    elif event.key == pygame.K_LEFT:
        ship.moving_left = True

def check_keyup_events(event, ship):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False
    elif event.key == pygame.K_LEFT:
        ship.moving_left = False

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

        elif event.type==pygame.KEYDOWN:
            check_keydown_events(event, ship)

        elif event.type==pygame.KEYUP:
            check_keyup_events(event, ship)

def update_screen(ai_settings, screen, ship):
    bg_color = (230, 230, 230)
    screen.fill(bg_color)
    ship.blitme()
    pygame.display.flip()

船舶.py

import pygame
class Ship():
    def __init__(self, ai_settings, screen):
        self.screen = screen
        self.ai_settings = ai_settings
        self.image = pygame.image.load('D:/Python/Pycharm Projects/GameAlien/images/ship.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
        self.center = float(self.rect.centerx)
        self.moving_right=False
        self.moving_left=False

    def update(self):
        if self.moving_right and self.rect.right<self.screen_rect.right:
            self.center += self.ai_settings.ship_speed_factor
        if self.moving_left and self.rect.left>0:
            self.center -= self.ai_settings.ship_speed_factor
        self.rect.centerx = self.center
    def blitme(self):
        self.screen.blit(self.image, self.rect)

当我按下向左箭头键时,船应该向左移动,相应地,当我按下向右箭头键时,它应该向右移动。不幸的是,该船的运动行为目前不稳定;它要么不可预测地移动,要么在不响应进一步输入的情况下向一个方向发起移动,从而基本上陷入困境。

最佳答案

问题是您多次调用 pygame.event.get() 在主循环中。注意,pygame.event.get()获取所有消息并将它们从队列中删除,因此第一个或第二个调用随机获取事件,而另一个调用则什么也得不到。

在主循环中获取一次事件并将它们传递给函数 check_events :

def check_events(ship, events):

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

        elif event.type==pygame.KEYDOWN:
            check_keydown_events(event, ship)

        elif event.type==pygame.KEYUP:
            check_keyup_events(event, ship)
while True:

    # the one and only call to `pygame.event.get()`
    # get the pending events and clear the event  queue
    events = pygame.event.get()

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

    check_events(ship, events)

    # [...]

但请注意,可以使用 pygame.key.get_pressed() 来简化代码:

def check_events(ship):

    keys = pygame.key.get_pressed()
    ship.moving_right = keys[pygame.K_RIGHT]
    ship.moving_left  = keys[pygame.K_LEFT]

pygame.key.get_pressed() 返回的状态当事件由 pygame.event.get() 处理时进行评估或 pygame.event.poll()

关于python - 无法控制游戏中的物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57152899/

相关文章:

python - 在 Python 中预分配或不预分配列表

python - 在 pygame 2d 滚动平台游戏中定位和添加敌人?

python - Pygame 边界不工作

python - 改变原点在 PyGame 坐标系中的位置

python - Mac Mojave 上的 Pygame

python - python 文件上的随机选择不起作用

python - 循环绘图,仅获取最后一个绘图

python - 如何在 Keras 中实现具有多个输出的自定义层?

python通过TCP套接字发送/接收十六进制数据

python - 乒乓克隆碰撞检测