Python外星人入侵游戏(四):飞船左右移动
2020-03-15 本文已影响0人
微风细雨007
今日任务:
- 控制飞船
动手前思考
- 1.如何实现左右移动;游戏是通过循环来刷新界面,那就需要在循环中更新飞船的位置,更新位置是通过按键的点击,所以操作应该在监听按键和页面刷新中完成
- 2.考虑到习惯,我们通常点击后不松开就会一直移动;移动不能出屏幕,考虑好之后,代码如下
实现代码
alien_invasion.py
import sys
import pygame
from setting import Settings
from ship import Ship
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("外星人入侵")
# 创建一艘飞船
ship = Ship(ai_settings, screen)
# 开始游戏主循环
while True:
check_events(ship)
ship.update()
update_screen(ai_settings, screen, ship)
# 监测事件
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 check_keydown_events(event, ship):
"""响应按键"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
if 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
if 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()
run_game()
ship.py
import pygame
class Ship:
def __init__(self, ai_settings, screen):
"""初始化飞船并设置初始位置"""
self.screen = screen
# 加载飞船图像并设置其初始位置
self.image = pygame.image.load('img/ship.png')
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.ai_settings = ai_settings
# 移动标志
self.moving_right = False
self.moving_left = False
def update(self):
"""根据移动标志调整飞船位置"""
if self.moving_right and self.rect.right < self.screen_rect.right:
self.rect.centerx += self.ai_settings.ship_speed_factor
elif self.moving_left and self.rect.left > 0:
self.rect.centerx -= self.ai_settings.ship_speed_factor
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image, self.rect)
小结
Python 使用不是main函数哦,注意变量的使用,到这里,我终于知道,为什么要建一个设置类,去存储常量,不是Java随便找个地方设置一个全局变量了。
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。