专栏首页Crossin的编程教室【Pygame 第6课】 面向对象的游戏设计

【Pygame 第6课】 面向对象的游戏设计

上节课中,我们的飞机已经可以发射子弹了,尽管只有一颗。为什么我只加了一颗?试着多加几颗你就会发现,你得用好几个变量去分别记录它们的xy坐标,在主循环中判断每一颗子弹的状态。你可以用list把程序写得稍稍不那么复杂,但这还没完。别忘了你打飞机的对手--敌机还没有加入到游戏。到时候你又需要更多的变量去记录它们的坐标,去判断它们的状态,去处理敌机、子弹、玩家飞机之间的关系。想想都觉得头大。

于是乎,我之前煞费苦心讲解的面向对象就该派上用场了。我要把子弹相关的东西都封装在一起。

先看看目前子弹相关的有哪些东西:x、y坐标,一张图片,好像就这么多。然后,还有一段处理子弹运动状态的代码。来建一个Bullet类,把x、y、image作为成员变量,再提供一个叫做move的成员函数,处理子弹的运动。

#定义一个Bullet类,封装子弹相关的数据和方法

class Bullet:

def __init__(self):

#初始化成员变量,x,y,image

self.x = 0

self.y = -1

self.image = pygame.image.load('bullet.png').convert_alpha()

def move(self):

#处理子弹的运动

if self.y < 0:

mouseX, mouseY = pygame.mouse.get_pos()

self.x = mouseX - self.image.get_width() / 2

self.y = mouseY - self.image.get_height() / 2

else:

self.y -= 5

代码的内容基本和之前一样,只是改为了面向对象的写法。如果你对__init__,self这些字眼感到陌生的话,请发送数字47到50,回顾一下关于python面向对象的课程。

接下来,程序主体就可以瘦身了。在原本加载子弹图片、初始化位置的地方,直接创建一个Bullet的实例。

bullet = Bullet()

在主循环中处理子弹运动的地方,调用Bullet的move方法。

bullet.move()

绘制子弹的时候,从bullet实例中取数据。

screen.blit(bullet.image, (bullet.x, bullet.y))

就这么简单。

运行程序看看效果是否正常。相比昨天,游戏的功能没有任何进展,但在结构上清晰了许多。之后,可以放心地添加更多子弹和敌机,而不会导致代码变成一坨。

面向零基础初学者的编程课

每天5分钟,轻松学编程

回复『 p 』查看python课程

回复『 g 』查看pygame课程

回复『 t 』查看习题

本文分享自微信公众号 - Crossin的编程教室(crossincode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2013-08-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信小游戏“跳一跳”,Python“外挂”已上线

    微信又一次不声不响地搞了个大事情: “小游戏”上线了! ? 于是,在这辞旧迎新的时刻,毫无意外的又火了。 今天有多少人刷了,让我看到你们的双手! ? 喏,我已经...

    Crossin先生
  • 这些年,你们一起踩过的坑(2)

    上次我们踩坑总结文章 这些年,你们一起踩过的坑(1) 受到了不少同学的认可。我也确信文中所涉及的问题是非常具有普遍性的,对绝大多数初学者都会有帮助。

    Crossin先生
  • 【Pygame 第8课】 火力全开

    游戏中的几个主要角色我们都有了,接下来就是去完善它们,用它们来组成一个完整的游戏。 首先我们要处理的是子弹。只有一发子弹显然是不够的,群众表示要火力全开! 所以...

    Crossin先生
  • 初始python单元测试框架unittest与webdriver的关系(一)

    unittest是属于python的单元测试框架,和java的junit,c#的nunit雷同,unittest的详细说明,具体见官方的地址...

    无涯WuYa
  • leecode刷题(13) -- 字符串中的第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

    希希里之海
  • 每日一练(2017/5/15)

    Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 课前导读 ●回复“每日一练”获取以前的题目! ●答案公布时间:为每期发布题目的第二...

    Java学习
  • ECCV 2018 | 微软亚洲研究院与北京大学共同提出用于物体检测的可学习区域特征提取模块

    作者:Jiayuan Gu、Han Hu、Liwei Wang、Yichen Wei、Jifeng Dai

    机器之心
  • 从一道动态规划题带你领略『卡特兰数』是如何秒杀算法题的

    思路:从 1 开始到 n ,每次以这个数为根,左子树存放比它小的数,右子树存放比它大的数。每个根不重复,因此每个树也必定不重复。

    帅地
  • 快手后台开发面经

    牛客网
  • Python Robot Framewo

    1、使用命令行安装:pip install robotframework -U

    py3study

扫码关注云+社区

领取腾讯云代金券