飞船不能用键盘控制,即使是执行随时附赠的代码也是一样
import sys # 导入 sys 模块,用于退出程序
import pygame # 导入 pygame 模块,用于创建游戏窗口和处理事件
from settings import Settings
from ship import Ship
class AlienInvasion: # 定义一个类,表示外星人入侵的游戏
"""一个管理游戏资源和行为的类"""
def __init__(self) -> None: # 定义初始化方法,设置游戏的属性
"""初始化游戏并创建游戏资源"""
pygame.init() # 初始化 pygame ,准备显示模式和其他设置
self.settings = Settings()
self.clock = pygame.time.Clock() # 创建一个时钟对象,用于控制游戏的帧率
self.screen = pygame.display.set_mode(
(self.settings.screen_height, self.settings.screen_width)
) # 创建一个屏幕对象,设置分辨率为 3842x2160
pygame.display.set_caption("Alien Invasion") # 设置屏幕的标题为“Alien Invasion”
# 设置背景色
# self.bg_color = (230, 230, 230)
self.ship = Ship(self)
def run_game(self):
"""开始游戏的主循环"""
while True:
self._check_events()
self._update_screen()
# 每秒钟最多更新 60 次画面
self.clock.tick(60)
def _check_events(self):
for event in pygame.event.get():
# 如果用户单击了关闭按钮,退出程序
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
self.ship.moving_left = True
# self.ship.rect.x += 1
elif event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
def _update_screen(self):
# 每次循环都重绘屏幕
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
# 更新屏幕上的图像,并切换到新屏幕
pygame.display.flip()
if __name__ == "__main__":
# 创建游戏实例并运行游戏
ai = AlienInvasion()
ai.run_game()
if __name__ == "__main__":
# 创建游戏实例并运行游戏
ai = AlienInvasion()
ai.run_game()
import pygame # 导入 pygame 模块,用于创建游戏窗口和处理图形
class Ship:
"""一个表示飞船的类"""
def __init__(self, ai_game) -> None:
"""初始化飞船并设置其初始位置"""
self.screen = ai_game.screen # 获取游戏窗口对象
self.screen_rect = ai_game.screen.get_rect() # 获取游戏窗口的矩形属性
self.image = pygame.image.load(
"E:/alien_invasion/images/ship.bmp"
) # 加载飞船的图像文件
self.rect = self.image.get_rect() # 获取飞船图像的矩形属性
self.rect.midbottom = self.screen_rect.midbottom # 将飞船的中下方对齐到游戏窗口的中下方
# 移动标志(飞船一开始不移动)
self.moving_right = False
self.moving_left = False
def update(self):
if self.moving_right:
self.rect.x += 1
if self.moving_left:
self.rect.x -= 1
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image, self.rect) # 使用 pygame 的 blit 方法将飞船图像绘制到游戏窗口上
1
cnsdytedison 2023-06-09 07:28:46 +08:00 via Android
你上下左右接打印调试一下呗。
|
2
dlsflh 2023-06-09 09:27:51 +08:00 via Android
这是新手吗?我是新新手。
|
3
Serialize 2023-06-09 10:09:15 +08:00
我也在看看这本书,我直接看那个分析数据的部分了,跳过了做游戏的
|
4
yushenglin 2023-06-09 10:12:05 +08:00
断点看看,按下按键视图有没有刷新了
|
5
zhaoxiaofeng OP @Serialize 这个项目是不是没有必要跟,实际上 pygame 基本上没有人使用吗?
|
6
wliansheng 2023-06-09 11:17:20 +08:00
@zhaoxiaofeng py 在实际生产中,很少做游戏。用来学习 py 可以。一般是后台,数据,网络,方面。
|
7
bloomcannon166 2023-06-09 12:12:05 +08:00
ship 类的 update 方法没加上
|
8
Alias4ck 2023-06-09 12:26:25 +08:00
|
9
lightcreater 2023-06-09 14:33:56 +08:00
我在 B 站黑马课程上也学过用 PYGAME 做飞机大战
按键监听是这样写的,可以正常运行 def __jianting(self): key_pressed = pygame.key.get_pressed() if key_pressed[pygame.K_RIGHT]: self.hero_group.update(-2) elif key_pressed[pygame.K_LEFT]: self.hero_group.update(2) for event in pygame.event.get(): if event.type == pygame.QUIT: self.__gameover() elif event.type == sprite_model.ENEMY_TIMER: enemy1 = sprite_model.enemy() self.enemy_group.add(enemy1) elif event.type == sprite_model.BULL_TIMER: self.hero.fire() # elif event.type == pygame.KEYDOWN and event.KEY == pygame.K_RIGHT: # pass |
10
Serialize 2023-06-09 15:06:59 +08:00
@wliansheng 我的目标是学一下爬虫啥的,所以对游戏那部分不是特别敢兴趣,这个主要是看你自己的目标是啥
|
11
wufumina 2023-06-09 17:59:05 +08:00
代码看起来基本正确,但是在代码中缺少了`Settings`类的定义。这个类是用于管理游戏的设置和属性的。你需要添加`Settings`类的定义,并确保在`AlienInvasion`类的`__init__`方法中实例化一个`Settings`对象并将其赋值给`self.settings`属性。
以下是一个简单的`Settings`类的示例,你可以根据自己的需求进行调整: ```python class Settings: """存储《外星人入侵》的所有设置的类""" def __init__(self): """初始化游戏的设置""" # 屏幕设置 self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230, 230, 230) ``` 将上述`Settings`类的定义添加到你的代码中,并在`AlienInvasion`类的`__init__`方法中添加以下代码来实例化一个`Settings`对象: ```python self.settings = Settings() ``` 这样就能够正常运行游戏,并使用自定义的设置。 |
12
zhaoxiaofeng OP 破案了···经过逐行比对,是 run_game 里面少调用了飞船的 update 方法
,再次谢谢大家 def run_game(self): """开始游戏的主循环""" while True: self._check_events() self.ship.update()#缺的内容 self._update_screen() # 每秒钟最多更新 60 次画面 self.clock.tick(60) |