在本篇文章中,将学习如何创建子弹移动的元素,如何在屏幕中让子弹向上飞驰,如何删除超过屏幕边界的子弹。

1.编程思路

1.1 创建一个子弹

功能描述:玩家将按空格键时发射子弹,子弹在屏幕中向上穿行,抵达屏幕边缘后消失。
在settings.py文件中,的init方法中加入子弹(Bullet)的值:速度,宽度、高度、颜色、允许发射的最大子弹数量

#子弹设置self.bullet_speed_factor = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)self.bullets_allowed = 3

在project中新建一个bullet.py ,用来存储Bullet类。该类主要用于在游戏中同时操作编组中的所有元素,为创建子弹实例,传递参数,并调用了super()来继承Sprite。
用小矩形框来代替子弹,使用pygame.Rect(),从空白创建一个宽为3,高为15像素的矩形,子弹的初始位置取决于飞船的当前位置,并应从飞船顶部射出,将子弹的top属性设置为飞船的top属性,让子弹看起来像是从飞船中射击的。将子弹的y坐标设为小数,并把子弹的颜色和速度设置分别存储在self.color和self.speed_factor中。

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):"""一个对飞船发射的子弹进行管理的类"""def __init__(self, ai_settings,screen, ship):"""在飞船所处的位置创建一个子弹对象"""super(Bullet, self).__init__()self.screen = screen#在(0,0)处创建一个表示子弹的矩形,再设置正确的位置self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top#储存用小数表示子弹的位置self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factor

1.2 将子弹发射出来

接下来我们要让子弹更新在屏幕中,方法update()管理子弹的位置。发射出去后,子弹在屏幕中向上移动,这意味着y坐标将不断减小,因此为更新子弹的位置,我们从self.y中减去self.speed_factor的值。子弹发射后,其x坐标始终不变,因此子弹将沿直线垂直地往上穿行。
调用draw_bullet()来绘制子弹。self.color中的颜色填充表示子弹占据的屏幕部分。

def update(self):"""向上移动子弹"""#更新表示子弹位置的小数值self.y -= self.speed_factor#更新表示子弹的rect的位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制子弹"""pygame.draw.rect(self.screen, self.color, self.rect)

1.3 将子弹添加进弹膛

在玩家每次按空格键时都射出一发子弹。首先,我们将在alien_invasion.py中创建一个编组(group),用于存储所有有效的子弹,以便能够管理发射出去的所有子弹。在主循环中,我们将使用这个编组在屏幕上绘制子弹,以及更新每颗子弹的位置:

"""游戏主循环"""while True:"""监视键鼠事件"""gf.check_events(ai_settings, screen, ship, bullets)ship.update()#print(len(bullets))gf.update_bullets(bullets)gf.update_screen(ai_settings, screen, ship, bullets)

1.4 开火

在game_functions.py中,我们需要修改check_keydown_events(),以便在玩家按空格键时发射一颗子弹。还要把超出屏幕的子弹删除,控制子弹的发射数量

def fire_bullet(ai_settings, screen, ship, bullets):"""如果还没有达到限制,就发射一颗子弹"""# 创建一颗子弹,并将其加入到编组bulletsif len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)
def update_bullets(bullets):"""更新子弹的位置,删除已消失的子弹"""#更新子弹位置bullets.update()# 删除已经消失的子弹for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)
def check_keydown_events(event, ai_settings,  screen, ship, bullets):"""响应按键"""if event.key == pygame.K_RIGHT:# 向右移动飞船ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)

在check_keydown_events()中,检测到空格键按下时,就会发射出一颗子弹,并且子弹的数量不能超过3颗。

3.源代码

alien_invasion.py

import sys    #退出游戏
import pygame #包含开发所需功能
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
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("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()#print(len(bullets))gf.update_bullets(bullets)gf.update_screen(ai_settings, screen, ship, bullets)run_game()

game_functions.py

import sys
import pygame
from bullet import Bullet
def 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 check_keydown_events(event, ai_settings,  screen, ship, bullets):"""响应按键"""if event.key == pygame.K_RIGHT:# 向右移动飞船ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)def check_keyup_events(event, ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef update_screen(ai_settings, screen, ship, bullets):#更新屏幕图像# 每次循环时都重绘屏幕screen.fill(ai_settings.bg_color)#在飞船和外星人后面重绘所有子弹for bullets in bullets.sprites():bullets.draw_bullet()ship.blitme()# 让最近绘制的屏幕可见pygame.display.flip()  # 不断更新屏幕def 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):"""如果还没有达到限制,就发射一颗子弹"""# 创建一颗子弹,并将其加入到编组bulletsif len(bullets) < ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)

bullet.py

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):"""一个对飞船发射的子弹进行管理的类"""def __init__(self, ai_settings,screen, ship):"""在飞船所处的位置创建一个子弹对象"""super(Bullet, self).__init__()self.screen = screen#在(0,0)处创建一个表示子弹的矩形,再设置正确的位置self.rect = pygame.Rect(0, 0, ai_settings.bullet_width,ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.top#储存用小数表示子弹的位置self.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):"""向上移动子弹"""#更新表示子弹位置的小数值self.y -= self.speed_factor#更新表示子弹的rect的位置self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制子弹"""pygame.draw.rect(self.screen, self.color, self.rect)

settings.py

class Settings():#用于存储该项目设置的所有的类def __init__(self):#初始化设置#屏幕设置self.screen_width = 1200self.screen_height = 800self.bg_color = (230,230,230)#飞船设置self.ship_speed_factor = 1.5#子弹设置self.bullet_speed_factor = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)self.bullets_allowed = 3

4.实现效果

基于pygame的射击小游戏制作(二)射击子弹相关推荐

  1. 基于pygame的射击小游戏制作(一)让飞船动起来

    基于pygame的射击小游戏制作(一)让飞船动起来 一.文件结构 alien_invasion.py 是整个系统的主文件,用来创建游戏中的一系列对象,ai_settings存储设置.screen存储显 ...

  2. 基于Pygame的Python小游戏,《这是一场滑稽与阴险的较量》

    选用贴吧最火的表情包滑稽和阴险表情包,肯定都认得出吧,背景由胡大佬提供,添加了很多细节,一款射击闯关类小游戏,滑稽会不断逼近阴险,在这之前你必须把阴险全部击落,左上角是你的生命,被滑稽撞到则减少一生命 ...

  3. 基于pygame做的小游戏

    最近一边学习pygame模块一边做了个小游戏,完成功能如下: 鼠标右键控制移动 人物跟随鼠标方向转动 鼠标左键控制攻击 动画效果 血量计数效果 画面比较乱入,请自行过滤.直接上代码: # coding ...

  4. 基于pygame的滑雪小游戏

    import pygame import sys import random from pygame.locals import * class SkierClass(pygame.sprite.Sp ...

  5. 基于pygame的射击小游戏制作(四)击杀外星人

    在本篇文章中,主要学习射击子弹时外星人消失,达到击杀外星人的效果 一.编程思路 1.1击杀 我们需要在碰撞发生后让外星人立即消失,故在更新子弹的位置后检测碰撞.我们创建一个字典,这个字典的每一个键都是 ...

  6. 基于pygame的射击小游戏制作(三)让外星人动起来

    在本篇文章中,将学习如何创建一群外星人,如何使用嵌套循环来创建元素网格,如何移动外星人 1.编程思路 1.1 创建外星人 创建Alien.py 文件,该文件配置与Ship.py类似,每个外星人最初都出 ...

  7. 基于pygame的射击小游戏制作(五)绘制开始按钮

    在本篇文章中,主要学习如何在Pygame中绘制按钮,并点击按钮开始游 一.编程思路 1.1 修改游戏活动状态 在上篇文章中,我们通过game_active标志来控制游戏的进行与停止.我们需要在点击&q ...

  8. java游戏界面制作_软件设计之基于Java的连连看小游戏(二)——游戏基础界面的制作及事件的添加...

    上次完成到游戏首页的制作,今天完成了游戏基础界面的制作以及事件的简单添加.由于功能尚未完全实现,因此游戏界面的菜单列表只是简单地添加了一下,其余菜单列表以及倒计时等在后续的制作中逐一完善. 1.首先在 ...

  9. 基于cocos2dx的横版动作游戏制作(二)

    基于cocos2dx的横版动作游戏制作(二) 如果你看过第一部分介绍,你应该大体知道一个横版游戏该怎么样去做,需要什么东西了....本部分介绍一些细节设计... 第一个:单例对象我们应该怎么设计才比较 ...

最新文章

  1. [LeetCode]--118. Pascal#39;s Triangle
  2. 圆柱属于能滚动的物体吗_中班科学活动教案:滚动的物体教案(附教学反思)
  3. 【Python】1054 求平均值(Python异常处理练习)
  4. Java输出彩色字符
  5. 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针
  6. DOM 事件深入浅出(二)
  7. SpringBootAdmin服务端
  8. c语言怎么实现模块化vc,原创:在C语言中大概实现VC++中的CArray部分功能的两种方法...
  9. access中布局为阶梯怎么设计_access模拟题1 -
  10. python画3d图-Python 绘制酷炫的三维图步骤详解
  11. memcache的安装,配置和使用
  12. Linux下安装mysql(yum、二进制包、源码包)
  13. Linux 更新 CPU microcode
  14. mysql数据库 怎么替换_mysql数据库替换
  15. DES加密算法介绍(含例子)
  16. Hibernate技术书写
  17. 对于操作系统32位amp;64位寻址地址的理解
  18. Spring Boot框架
  19. 怎么从已有文件中挑选需要的文字重新生成新文件_word 中如何实现 一个正文位置输入 另一个正文地方自动生成一样的...
  20. mysql查询平均工资最低的部门_查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名...

热门文章

  1. laravel 查询
  2. [USACO14OPEN]GPS的决斗Dueling GPS's
  3. git stash封存分支 以及关于开发新功能的处理
  4. glance部署及操作
  5. mybaties xml 的头部
  6. 数据结构50:二分查找法(折半查找法)
  7. (转)利用CAS算法实现通用线程安全状态机
  8. jquery easyUi简单介绍
  9. 各种好用的代码生成器
  10. Some functions worth remembered in C Library (Updating)