Python学习笔记45:游戏篇之外星人入侵(六)

前言

飞船模块的功能基本已经完成。今天继续完成子弹模块的功能。

子弹模块

子弹和飞船模块,在游戏逻辑中有一种生成与被生成的表面关系,因为子弹在游戏中是由飞船发射的。但是在我们实际抽象的过程中,飞船与子弹并不是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

首先是介绍子弹的属性以及值。

  1. self.screen
    游戏窗口信息,这个不多做介绍,毕竟子弹是在窗口上显示的。
  2. self.rect
    子弹矩形,我们可以将子弹理解为一个实心矩形,并且通过系统设置文件配置子弹的长度和宽度。
  3. self.rect.centerx
    这个相信大家已经很熟了,子弹矩形的中心x坐标是飞船中心x坐标。
  4. 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.<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值