手把手讲解超详细python入门游戏项目‘打外星飞船’(三)

 2023-09-05 阅读 29 评论 0

摘要:手把手讲解超详细python入门游戏项目‘打外星飞船’(三) 第三部分我们讲解一下飞船需要射出子弹,那么子弹的部分是怎么操作呢?接下来我直接把项目的四个文件展示出来,以注释的形式在旁边讲解。因为有很多代码在前面都已经打过注释 了ÿ

手把手讲解超详细python入门游戏项目‘打外星飞船’(三)

第三部分我们讲解一下飞船需要射出子弹,那么子弹的部分是怎么操作呢?接下来我直接把项目的四个文件展示出来,以注释的形式在旁边讲解。因为有很多代码在前面都已经打过注释 了,这次我们就只在新加的代码旁边打注释了

任务三:按空格键的时候发射子弹,一个屏幕上最多发射三颗子弹,子弹向上飞行,到屏幕后消失

主文件()

import sysimport pygamefrom settings import Settings
from ship import Ship
#这里我们创建了管理子弹的类,要引入主文件使用
from bullet import Bulletclass AlienInvasion:def __init__(self):pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().heightpygame.display.set_caption("Alien Invasion")self.ship = Ship(self)#这里创建用于储存子弹控制的编组self.bullets = pygame.sprite.Group()def run_game(self):while True:self._check_events()self.ship.update()#把子弹的函数加入主文件self._update_bullets()self._update_screen()def _check_events(self):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()#这里是键盘按到空格键会返回KEYDOWN,此时调用开火函数elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)def _check_keydown_events(self, event):if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self, event):if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _fire_bullet(self):#这是一个判断语句,如果子弹数小于三,我们就可以执行下面的函数if len(self.bullets) < self.settings.bullets_allowed:#创建一个子弹新的bullet,把它加入到编组bullet储存new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_bullets(self):# 更新子弹的位置函数self.bullets.update()#不断循环删除子弹,子弹这里是他的y轴超出了屏幕,我们就删除for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)def _update_screen(self):self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()pygame.display.flip()if __name__ == '__main__':ai = AlienInvasion()ai.run_game()

子弹的控制类

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):"""创建一个管理子弹的类"""def __init__(self, ai_game):"""在飞船的当前所在的位置创建出一个子弹的图像"""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_color# 现在原点处创建一颗子弹,同时子弹的宽高在设置类的参数里引入self.rect = pygame.Rect(0, 0, self.settings.bullet_width,self.settings.bullet_height)#子弹的初始位置设置成了飞船的初始位置self.rect.midtop = ai_game.ship.rect.midtop# 用float储存这个位置self.y = float(self.rect.y)def update(self):"""子弹向上飞"""# 每一次子弹向上移动,y轴在不断地自减self.y -= self.settings.bullet_speed# 把最新的位置给子弹self.rect.y = self.ydef draw_bullet(self):"""画出子弹,参数是用self里面储存的参数填充的"""pygame.draw.rect(self.screen, self.color, self.rect)

设置类文件

class Settings:def __init__(self):# Screen settingsself.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230)# Ship settingsself.ship_speed = 1.5# 这里在设置子弹的一系列的参数,等会直接调用这个类self.bullet_speed = 1.0self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)#最大的子弹数为3self.bullets_allowed = 3

飞船的参数设置文件

import pygameclass Ship:def __init__(self, ai_game):self.screen = ai_game.screenself.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()# Load the ship image and get its rect.self.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()# Start each new ship at the bottom center of the screen.self.rect.midbottom = self.screen_rect.midbottom# Store a decimal value for the ship's horizontal position.self.x = float(self.rect.x)# Movement flagsself.moving_right = Falseself.moving_left = Falsedef update(self):# Update the ship's x value, not the rect.if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speed# Update rect object from self.x.self.rect.x = self.xdef blitme(self):self.screen.blit(self.image, self.rect)

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/1414.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息