[python] 小游戏 – play_plane

  GitHub:https://github.com/liqingwen2015/play_plane

  目前只做了第一部分:一个界面,有个飞机,可以左右移动,放子弹。

  暂无计划做第二部分。

  alien_invasion.py

import sysimport pygamefrom settings import Settingsfrom ship import Shipimport game_functions as gffrom pygame.sprite import Groupdef run_game():    # 初始化游戏并创建一个屏幕对象    pygame.init()    ai_settings = Settings()    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screnn_height))    pygame.display.set_caption('Alien Invasion')    # 创建一艘飞船    ship = Ship(ai_settings, screen)    # 创建一个存储的子弹组    bullets = Group()    # 设置背景色    bg_color = (230, 230, 230)    # 开始游戏的主循环    while True:        gf.check_events(ai_settings, screen, ship, bullets)        ship.update()        gf.update_bullets(bullets)        gf.update_screen(ai_settings, screen, ship, bullets)run_game()

  bullet.py

import pygamefrom pygame.sprite import Spriteclass Bullet(Sprite):    def __init__(self, ai_settings, screen, ship):        super(Bullet, self).__init__()        self.screen = screen        self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)        self.rect.centerx = ship.rect.centerx        self.rect.top = ship.rect.top        # 存储用小数表示的子弹位置        self.y = float(self.rect.y)        self.color = ai_settings.bullet_color        self.speed_factor = ai_settings.bullet_speed_factor    def update(self):        self.y -= self.speed_factor        # 更新子弹位置        self.rect.y = self.y    def draw_bullet(self):        pygame.draw.rect(self.screen, self.color, self.rect)

  game_functions

import sysimport pygamefrom bullet import Bulletdef check_events(ai_settings, screen, ship, bullets):    # 监听键盘和鼠标的事件    for event in pygame.event.get():        if event.type == pygame.QUIT:            sys.exit()        elif event.type == pygame.KEYDOWN:            check_keydown_events(event, ai_settings, screen, ship, bullets)        elif event.type == pygame.KEYUP:            check_keyup_events(event, ship)def update_screen(ai_settings, screen, ship, bullets):    # 每次循环时都重绘屏幕    screen.fill(ai_settings.bg_color)    # 在飞船和外星人后面重绘所有子弹    for bullet in bullets.sprites():        bullet.draw_bullet()    ship.blitme()    # 让最近绘制的屏幕可见    pygame.display.flip()def check_keydown_events(event, ai_settings, screen, ship, bullets):    if event.key == pygame.K_RIGHT:        ship.moving_right = True    elif event.key == pygame.K_LEFT:        ship.moving_left = True    elif event.key == pygame.K_SPACE:        # 创建一颗子弹,并将其加入到编组 bullets 中        fire_bullet(ai_settings, screen, ship, bullets)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 = Falsedef update_bullets(bullets):    bullets.update()    # 删除已经消失的子弹    for bullet in bullets.copy():        if bullet.rect.bottom <= 0:            bullets.remove(bullet)def fire_bullet(ai_settings, screen, ship, bullets):    if len(bullets) < ai_settings.bullets_allowed:        new_bullet = Bullet(ai_settings, screen, ship)        bullets.add(new_bullet)

  settings.py

class Settings():    def __init__(self):        # 屏幕设置        self.screen_width = 1200        self.screnn_height = 800        self.bg_color = (230, 230, 230)        self.ship_speed_factor = 1.5        # 子弹设置        self.bullet_speed_factor = 1        self.bullet_width = 3        self.bullet_height = 15        self.bullet_color = 60, 60, 60        self.bullets_allowed = 5

  ship.py

import pygameclass Ship():    def __init__(self, ai_settings, screen):        self.screen = screen        self.ai_settings = ai_settings        # 加载飞船图像并获取其外接矩形        self.image = pygame.image.load('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        # 在飞船的属性 center 中存储小数值        self.center = float(self.rect.centerx)        # 移动标识        self.moving_right = False        self.moving_left = False    def blitme(self):        # 屏幕指定位置绘制飞船        self.screen.blit(self.image, self.rect)    def update(self):        if self.moving_right and self.rect.right < self.screen_rect.right:            self.center += self.ai_settings.ship_speed_factor        elif self.moving_left and self.rect.left > 0:            self.center -= self.ai_settings.ship_speed_factor        # 更新 rect 对象        self.rect.centerx = self.center

于是渐渐开始有些伤怀。

[python] 小游戏 – play_plane

相关文章:

你感兴趣的文章:

标签云: