m0_68180072 2022-04-04 17:26 采纳率: 72.7%
浏览 29
已结题

py教材里pygame外星人游戏无法正确运行

这个是主程序
import pygame
from settings import Settings
from ship import Ship
import game_function 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("Allien Invasion")
    ship = Ship(screen)
    while True:
        gf.check_events(ship)
        ship.update()
        gf.update_screen(ai_settings,screen,ship)
run_game()

game_function.py
import sys
import pygame
def check_events(ship):
    for event in pygame.event.get():
        if event == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:#event.get():获取每一次事件,event的属性type,如果是键盘输入KEYDOWN
            if event.key == pygame.K_RIGHT:#方向右键-->
                #ship.rect.centerx += 1#这里用到了形参ship,所以要在函数的括号内加上形参ship
                ship.moving_right == True
            elif event.key == pygame.K_LEFT:
                ship.moving_left == True
        elif event.type == pygame.KEYUP:#抬起键盘
            if event.key == pygame.K_RIGHT:
                ship.moving_right == False
            elif event.key == pygame.K_LEFT:
                ship.moving_left == False


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

ship.py

import pygame
class Ship():
    def __init__(self,screen):
        self.screen = screen
        self.image = pygame.image.load('images/ship.png')#加载图片
        self.rect = self.image.get_rect()   #获取surface的rect属性
        self.screen_rect = screen.get_rect()

        self.rect.centerx = self.screen_rect.centerx#设置rect的位置
        self.rect.bottom = self.screen_rect.bottom
        '''center top bottom left right属性 加上xy坐标可实现位置的设置
        注意:左上角的坐标为(0,0),往右下增大'''
        self.moving_right = False
        self.moving_left = False
    
    def update(self):
        if self.moving_right == True:
            self.rect.centerx += 1
        elif self.moving_left == True:
            self.rect.centerx -= 1

    def blitme(self):
        self.screen.blit(self.image,self.rect)
        #c.blit(a,b)根据指定位置将a:image按照b:rect的位置(相当于粘贴覆盖)绘制到c:screen上,即显示出来

这个是《从入门到实践》的第一个例子,然后目前就是让飞船通过键盘左右移动。可是并不成功。

一个是不能通过右上的叉关闭。一开始是可以的,就是把 if event.type == pygame.QUIT: sys.exit() 写在主程序里的时候,后来放在function里面再导入就不能用了
还有就是左右移动的功能也根本不能用,而且有时候按左右方向键还会闪退。
我对比了一下,代码应该没有错呀,pygame也是安装好了,可以看到那个飞碟,实在不知道是什么问题了。

  • 写回答

1条回答 默认 最新

  • stripe-python 2022-04-05 10:51
    关注

    按叉关闭的问题加一句pygame.quit
    由于先更新了屏幕后更新位置导致显示不出来

    game_function.py改为:

    import sys
    import pygame
    def check_events(ship):
        for event in pygame.event.get():
            if event == pygame.QUIT:
                pygame.quit()
                sys.exit(0)
            elif event.type == pygame.KEYDOWN:#event.get():获取每一次事件,event的属性type,如果是键盘输入KEYDOWN
                if event.key == pygame.K_RIGHT:#方向右键-->
                    #ship.rect.centerx += 1#这里用到了形参ship,所以要在函数的括号内加上形参ship
                    ship.moving_right == True
                elif event.key == pygame.K_LEFT:
                    ship.moving_left == True
            elif event.type == pygame.KEYUP:#抬起键盘
                if event.key == pygame.K_RIGHT:
                    ship.moving_right == False
                elif event.key == pygame.K_LEFT:
                    ship.moving_left == False
     
     
    def update_screen(ai_settings,screen,ship):
        screen.fill(ai_settings.bg_color)
        ship.blitme()       
    

    然后ship.py改为:

    import pygame
    class Ship():
        def __init__(self,screen):
            self.screen = screen
            self.image = pygame.image.load('images/ship.png')#加载图片
            self.rect = self.image.get_rect()   #获取surface的rect属性
            self.screen_rect = screen.get_rect()
     
            self.rect.centerx = self.screen_rect.centerx#设置rect的位置
            self.rect.bottom = self.screen_rect.bottom
            '''center top bottom left right属性 加上xy坐标可实现位置的设置
            注意:左上角的坐标为(0,0),往右下增大'''
            self.moving_right = False
            self.moving_left = False
        
        def update(self):
            if self.moving_right == True:
                self.rect.centerx += 1
                pygame.display.update()
            elif self.moving_left == True:
                self.rect.centerx -= 1
                pygame.display.update()
     
        def blitme(self):
            self.screen.blit(self.image,self.rect)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 4月4日

悬赏问题

  • ¥15 关于k8s node节点被释放后如何驱逐节点并添加新节点
  • ¥15 subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1
  • ¥15 for循环处理大量数据怎么优化
  • ¥15 笔记本接显卡扩展坞重启报错
  • ¥15 为什么这个指令报错啊,一直弄不懂为什么,想问问该怎么弄,决求解决,ubuntu刚入手
  • ¥15 用百度飞将的paddleyolo库里的yolov7训练自己数据集
  • ¥15 Saber里如何查看磁芯的磁通密度
  • ¥25 关于下拉菜单、数据库、关联选项的问题
  • ¥15 STM32 串口DMA同时收发丢字节
  • ¥15 SBML检验显示文档无效改怎么修改?