前言
飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。
子弹模块
子弹和飞船模块,在游戏逻辑中有一种生成与被生成的表面关系,因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中,飞船与子弹并不是is的关系,甚至可以说不是has的关系。因此我们需要将两个对象封装到不同模块来完成我们的功能。
考虑子弹是由飞船’'生成",我们在子弹对象生成渲染的时候,应该将飞船实时位置传递到子弹对象中。
此外,相比于飞船,子弹是需要一直生成的,因此屏幕可以存在多个子弹,我们需要一些容器对子弹进行管理。同时子弹的移动不像飞船到了边界就要停止,通常来说子弹触碰到窗口边界的时候子弹就应该消失,可以直接不管让子弹移动到窗口外不被加载,也可以让子弹在到达边界时自己销毁。
bullet
bullet.py模块的基础信息我们在最开始就写好了,现在我们需要根据我们实际的游戏业务进行填充。
import pygame
class Bullet:
def __init__(self, setting, screen, ship):
super(Bullet, self).__init__()
self.screen = screen
# 创建子弹矩形
self.rect = pygame.Rect(0, 0, setting.bullet_width, setting.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
def move(self):
"""向上移动子弹"""
pass
首先是介绍子弹的属性以及值。
self.screen
游戏窗口信息,这个不多做介绍,毕竟子弹是在窗口上显示的。self.rect
子弹矩形,我们可以将子弹理解为一个实心矩形,并且通过系统设置文件配置子弹的长度和宽度。self.rect.centerx
这个相信大家已经很熟了,子弹矩形的中心x坐标是飞船中心x坐标。self.rect.top
这个应该也不陌生,子弹矩形的顶部,设置等于飞船的顶部。这样就会有一种子弹从飞船出来的感觉。大家也可以改造一下定义一个self.rect.bottom的属性,至于值,大家自己发挥,很简单的我不写出来了。
填充业务代码
上色
我们需要个给子弹上一个颜色!
self.color = setting.bullet_color
移动
子弹是自行移动的,所以我们的移动函数并不需要按键控制,只要每次渲染的时候调用一下move函数即可。
def move(self):
"""向上移动子弹"""
# 更新子弹位置
self.rect.y -= 1
生成子弹
我们需要一个新的函数,在调用这个函数的时候,飞船的上方出现一个子弹。也就是我们说的发射子弹的函数。
函数比较简单,就是在窗口中绘制一个矩形就行。
def draw_bullet(self):
"""在屏幕上绘制子弹"""
pygame.draw.rect(self.screen, self.color, self.rect)
至此,我们的子弹模块已经填充好了。
import pygame
class Bullet:
def __init__(self, setting, screen, ship):
super(Bullet, self).__init__()
self.screen = screen
# 创建子弹矩形
self.rect = pygame.Rect(0, 0, setting.bullet_width, setting.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
# 子弹颜色
self.color = setting.bullet_color
def move(self):
"""向上移动子弹"""
# 更新子弹位置
self.rect.y -= 1
def draw_bullet(self):
"""在屏幕上绘制子弹"""
pygame.draw.rect(self.screen, self.color, self.rect)
发射子弹
在编写这部分代码以前,我们需要理解一下信息:
- 在游戏中,我们定义按下空格发射子弹,因此我们要对空格键按下的进行监听并处理。
- 游戏中并不是只存在一个子弹,我们需要一个能管理多个子弹的容器。
- 子弹会一直往上移动,但是当子弹穿过上边界时,我们需要移除该子弹。如果能容忍资源的浪费,也可以不管。
子弹组
在pygame中,我们要实现组的功能,需要继承Sprite。改造bullet模块代码如下:
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
def __init__(self, setting, screen, ship):
super(Bullet, self).__init__()
self.screen = screen
# 创建子弹矩形
self.rect = pygame.Rect(0, 0, setting.bullet_width, setting.bullet_height)
self.rect.centerx = ship.rect.<

最低0.47元/天 解锁文章
307

被折叠的 条评论
为什么被折叠?



