首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

上节课中,我们的飞机已经可以发射子弹了,尽管只有一颗。为什么我只加了一颗?试着多加几颗你就会发现,你得用好几个变量去分别记录它们的xy坐标,在主循环中判断每一颗子弹的状态。...于是乎,我之前煞费苦心讲解的面向对象就该派上用场了。我要把子弹相关的东西都封装在一起。 先看看目前子弹相关的有哪些东西:x、y坐标,一张图片,好像就这么多。然后,还有一段处理子弹运动状态的代码。...来建一个Bullet类,把x、y、image作为成员变量,再提供一个叫做move的成员函数,处理子弹的运动。...move(self): #处理子弹的运动 if self.y < 0: mouseX, mouseY = pygame.mouse.get_pos...在原本加载子弹图片、初始化位置的地方,直接创建一个Bullet的实例。 bullet = Bullet() 在主循环中处理子弹运动的地方,调用Bullet的move方法。

70780

【Pygame 第5课】 游戏中的运动

本来,在上一次pygame的教程中,我只是顺手拿了微信“打飞机”里的图来演示用鼠标控制图片位置的操作。...2.子弹被发射的位置是飞机的位置,也就是鼠标的位置。注意,要让它们的中心点对齐,而不是左上角对齐,处理方法我们已经说过。 3.让这个子弹往上运动。...还记得我在第2课《游戏的本质》里面说的吗:在游戏主循环中,要处理物理运动。所以在程序中要做的就是,每次循环里,把子弹图片的y坐标减少一个量(因为屏幕左上角的坐标是(0,0))。...5.为了看起来更符合常理,你得把子弹的图片放在飞机的图片下面,这样看上去才会是从飞机上发射出去,而不是凭空冒出来的。在程序中,就是先绘制子弹,再绘制飞机,像是画油画,后画的会覆盖掉先画的。...6.我在一开始就将子弹的位置设到屏幕上方之外,这样它就会自动被循环内的条件判断给重置位置,而不需要我再额外手动去初始化它的位置。 理清了如上的思路之后,能不能搞定代码了?

84550
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Pygame 第8课】 火力全开

    即使现在这个小游戏中它还不至于影响到体验,也应该养成节约的良好习惯。 我们今天要解决的就是两个问题:定时和回收。 python中有定时运行的方法。但这里,我不打算用它。...我们有现成的循环在这儿,只要设定好隔多少次循环运行,就简单地实现了定时的效果。尽管在游戏中,每次循环的时间并不相同,这么做会有潜在的问题:间隔的真实时间会受电脑运行速度的影响。...(发射子弹代码) interval_b = 100 关于子弹的重复利用,我们增加一个变量active,只有active为True的子弹,我们才去处理它的运动。...修改一下Bullet类,增加active,并根据active的状态处理运动。增加一个restart方法,用来重新发射子弹。...#创建子弹的list bullets = [] #向list中添加5发子弹 for i in range(5): bullets.append(Bullet()) #子弹总数 count_b =

    78760

    2018年8月3日pygame的安装和快速入门,飞机大战

    )à screen.blit(hero, hero_rect) 游戏核心操作 游戏运行过程中-> 核心~图片在运动-> 大量的图片在运动 抽象:图片在运动 游戏:图片、位置、速度 pygame...游戏正式开始 游戏背景处理: 游戏背景的运动,需要两张一样的图片上下叠加,完成整体运动效果图。...游戏背景:也是游戏资源的一种,所以让 背景 继承游戏精灵类型 游戏背景类型中,初始化方法定义背景的图片信息,重写update()方法完成自定义运动 windows中pygame的安装 pip install...英雄子弹操作 子弹:一个独立的对象,依赖于英雄飞机 所以将子弹精灵组对象,做成英雄飞机的一个属性 子弹:如果飞出边界~销毁 销毁一个对象[python中如果一个对象不再使用自动销毁(没有变量指向)] pygame...在子弹的继承的update()函数中,重写边界判断,一旦超出边界~移除自己! 敌方飞机出场! 敌方飞机~类型,敌人精灵-> 创建多个敌人-> 精灵组-> 渲染展示窗口中! 多长时间出现一个敌机?

    3.1K20

    【Pygame 第7课】 多变的宿敌

    它与本机、子弹构成了这个游戏的三个要素: 本机会发射子弹,子弹向上运动 敌机会不停产生,向下运动 子弹碰到敌机,敌机和子弹都销毁,加分 本机碰到敌机,本机和敌机都销毁,游戏结束 这节课就来创造这个宿敌...敌机开始在屏幕中部周而复始地自上向下运动。 这宿敌也太呆了吧! 这样的游戏谁要玩! 所以我们要加点随机性。 让敌机的出现位置有变化,让它的速度有变化。...这样,它的行为开始有了变化。这里用到了random模块,记得在程序开头import它。 restart在__init__函数以及飞出屏幕下方时调用。后面,在敌机被击中的时候,也会要调用它。...再次运行程序,看上去有那么点意思了。如果敌机再多一点,子弹再多一点,就更好了。这个,留在下节课中说。 ? ? ?...面向零基础初学者的编程课 每天5分钟,轻松学编程 回复『 p 』查看python课程 回复『 g 』查看pygame课程 回复『 t 』查看习题

    49690

    Python小游戏--外星人大战(一)

    haha,可惜我们今天的主题跟这两个游戏一毛钱关系都没有,在接下来的几篇文章中,我会把去年我用Python做的一个小游戏整理下,然后以推文的形式发布出来,希望给小伙伴们一 nei nei灵感吧~ 这个游戏我给它起了个骚气无敌的名字小粉丝大战最帅的我...下面对这款游戏的细节做下简单的概述: 你要了解的: 本游戏使用的是Pygame模块,对于某些API(比如名称设置--"pygame.display.set_caption('我是游戏名')")的调用不会进行分享...对于该游戏:(只对主要部分进行分析) 游戏的主人翁:飞船、子弹、外星人 最基本的三个类:ship、bullet、alien(考虑各个类的属性和方法,对类进行合适的封装)还有一个必不可少的类:alien_invasion...要求:(游戏开始后) 点击Play按钮开始游戏,按下键盘上的Q键退出游戏 外星人按照S形从屏幕上方开始向底部运动,且随着用户得分和等级的提高运动速度越来越快 飞船一次发射的子弹控制在10个以内,且只能在屏幕范围内进行移动...游戏画面左上方有玩家得分、等级的显示,右上方有玩家剩余机会次数的显示 游戏音效的添加 问题解决: 对于游戏中飞船和外星人的处理为什么都以矩形处理呢?

    97930

    pygame 笔记-4 代码封装&发射子弹

    继续之前的内容,随着游戏的内容越来越复杂,有必要把代码优化一下,可以参考OOP的做法,把人物类抽象出来,弄成一个单独的类,这们便于代码维护,同时我们给小人儿,加个发射子弹的功能,代码如下:(看上去略长,...但是绝大多数,都是上节的代码) import pygame import os pygame.init() WIN_WIDTH, WIN_HEIGHT = 500, 500 win = pygame.display.set_mode...# 向右走的图片数组 walkRight = [pygame.image.load(img_base_path + 'actor/R1.png'), pygame.image.load...,要切换不同的子弹图片 if man.left: win.blit(bullet_left, (self.x, self.y)) else:...if man.t < 0: a = -1 # 后半段加速下落 man.y -= 0.5 * a * (man.t ** 2) # 匀加速直线运动的位移公式

    60420

    小甲鱼《零基础学习Python》课后笔记(三十八):类和对象——继承

    3.假设已经有鸟类的定义,现在我要定义企鹅类继承于鸟类,但我们知道企鹅是不会飞的,我们应该如何屏蔽父类(鸟类)中飞的方法?...4.super函数有什么“超级”的地方? super函数超级之处在于你不需要明确给出任何基类的名字,它会自动帮你找出所有基类以及对应的方法。...5.多重继承使用不当会导致重复调用(也叫钻石继承、菱形继承)的问题,请分析以下代码在实际编程中有可能导致什么问题?...from pygame.sprite import Sprite class Bullet(Sprite): """一个对飞船发射的子弹进行管理的类""" def __init__...pygame.display.flip() def update_bullets(bullets): """更新子弹的位置,并删除已经消失的子弹""" # 更新子弹位置

    70720

    关于“Python”的核心知识点整理大全32

    我 们使用函数float()将self.rect.centerx的值转换为小数,并将结果存储到self.center中。...self.rect.centerx将只存储self.center的整数部分,但对显示飞船 而言,这问题不大。...这两个函数的代码是从check_events()中复制而来的,因此我们将函数check_events 中相应的代码替换成了对这两个函数的调用。...12.7 简单回顾 下一节将添加射击功能,这需要新增一个名为bullet.py的文件,并对一些既有文件进行修改。 当前,我们有四个文件,其中包含很多类、函数和方法。...子弹应从飞船顶部射出,因此我 们将表示子弹的rect的top属性设置为飞船的rect的top属性,让子弹看起来像是从飞船中射出的 (见3)。

    16110

    Python 项目实践一(外星人入侵小游戏)第三篇

    下面来修复这种问题,让飞船到达屏幕边缘后停止移动。...表示飞船的图像存储在文件夹images下的文件ship.bmp中。 四 射击子弹 下面来添加射击功能。我们将编写玩家按空格键时发射子弹(小矩形)的代码。子弹将在屏幕中向上穿行,抵达屏幕上边缘后消失。...方法update()管理子弹的位置。发射出去后,子弹在屏幕中向上移动,这意味着y坐标将不断减小,因此为更新子弹的位置,子弹发射后,其x坐标始终不变,因此子弹将沿直线垂直地往上穿行。...下面是对game_functions.py所做的相关修改: import sys from bullet import Bullet import pygame def check_keydown_events...()  先写到这里吧,不知不觉天已经黑了,太耗时了,要去做饭了,对了最后的效果如下所示(为了截图我把子弹的速度调的非常慢,所以看起来有点怪): ?

    2.7K90

    用 Python 实现打飞机,让子弹飞吧!

    这里写类比较麻烦一点 Player的出现 首先要明确一点,这个类需要什么。 我们之前对 player 有什么操作?定义了他的图片和他出现的位置。所以我们的构造方法就要初始化这些值。...这样我们就能对飞机进行判断 这里的 move 是我们对飞机的移动的位移定义的常量。 让子弹飞 子弹要沿着发射方向射出去。可以在屏幕上一直移动,直到移出屏幕。...敌机和玩家碰撞在一起 子弹和敌机碰撞在一起 无论是那种情况的碰撞,其实就是两张图片有了交集。如图pygame 给我们提供了碰撞检测的方法。首先两个对象必须是 sprite 。...pygame 在处理背景音乐的时候都在 pygame.mixer 方法中。其中播放音乐的play中的参数,第一个为播放几次,-1 为循环播放,后面的浮点表示 从第几秒开始播放。...我有一个微信公众号,经常会分享一些python技术相关的干货;如果你喜欢我的分享,可以用微信搜索“python语言学习”关注 欢迎大家加入千人交流答疑裙:699+749+852

    1.8K31

    童年游戏大回顾:飞机大战

    在游戏里所向披靡的我(当年的我属实是有点东西的)不管多依依不舍,到“某一时刻”总会迅速地把游戏机收拾好,关上电视并用湿毛巾擦擦降温(我想起那天夕阳下的奔跑,那是我逝去的青春...)然后营造出认真学习的情景...拥有一部掌中宝游戏机就能成为班中的红人,曾经的我为了能玩上一把飞机大战,斥重金求同桌,给我的同桌买了一包价值5毛的辣条。 今天我站起来了,可以实现少年时梦想,飞机大战玩到爽~....游戏机制: 飞机移动: 玩家通过键盘或触摸屏控制飞机的移动,可以是上下左右四个方向的移动。 发射子弹: 玩家可以按下特定的键或触摸屏幕来发射子弹,子弹向上飞行,与敌机碰撞时,敌机被击中。...加载图像: 加载了玩家飞机、敌机和子弹的图像,并对它们进行了缩放以适应游戏界面。 定义玩家飞机的初始位置和速度: 初始化玩家飞机的初始位置为窗口中间的水平位置,纵坐标为窗口底部。...事件处理部分检测玩家的键盘输入,并根据按键移动玩家飞机或发射子弹。 敌机和子弹的移动和绘制是在游戏循环中进行的。 在循环中检查子弹是否击中敌机,如果击中,则销毁敌机和子弹,并生成新的敌机。

    47342

    如何用 Python 打飞机 ?

    就是 pygame 实现一个打飞机的游戏 ,优秀的我啊 ! 我们知道 pygame 框架可以用于管理图形 、动画声音等 ,能够利用它来轻松地开发复杂的游戏 ,可以让我们更加专注于面向对象编程 。...此项目是基于 pygame 框架搭建的一个小游戏 ,在此文中将实现此项目的 50% ,后续会有跟进 ,源代码已经放在我的 GitHub 中 ,并在进行中将会不断对代码结构进行优化 ,对样式进行优化 。...继承是对已有类的一种复用 ,子类继承父类 ,可以对父类中的方法和数据进行重写 ,也可以新定义只属于子类的成员变量 。...子弹编组用来管理屏幕中的所有子弹 ,其实用列表来管理子弹对象也是可以实现的 ,但是 pygame 自带的 Group 已经定义了一些函数 ,更加方便 。...fill函数填充屏幕严肃 ,参数rgb 需要说明的是 bullets 子弹编组需要更新判断子弹是否超出屏幕 ,以从编组中删除 ,否则会影响效率 鼠标和键盘监听事件pygame.event.get();

    2.2K61

    关于“Python”的核心知识点整理大全33

    当你对编组调用update()时,编组将自动对其中的每个精灵调用update(),因此代码行 bullets.update()将为编组bullets中的每颗子弹调用bullet.update()。...为在屏幕上绘制发射的 所有子弹,我们遍历编组bullets中的精灵,并对每个精灵都调用draw_bullet()(见5)。...可在settings.py中修改子弹的尺寸、颜色和 速度。 12.8.5 删除已消失的子弹 当前,子弹抵达屏幕顶端后消失,这仅仅是因为Pygame无法在屏幕外面绘制它们。...这些子 弹实际上依然存在,它们的y坐标为负数,且越来越小。这是个问题,因为它们将继续消耗内存 和处理能力。 我们需要将这些已消失的子弹删除,否则游戏所做的无谓工作将越来越多,进而变得越来越 慢。...请再次运行alien_invasion.py,确认发射子弹时依然没有错误 12.9 小结 在本章中,你学习了:游戏开发计划的制定;使用Pygame编写的游戏的基本结构;如何设 置背景色,以及如何将设置存储在可供游戏的各个部分访问的独立类中

    14410

    手把手教你使用Pygame制作飞机大战小游戏,4万字超详细讲解!

    ,在用户按下方向键的时候小飞机的坐标进行有规律的变化 控制小飞机移动 当用户按键时,都会在pygame中注册一个事件,任何一个事件都是通过pygame.event.get()获取的,因此可以在函数体内,...类,此类可以将游戏中的元素进行编组,可以同时操作编组中的所有元素 将子弹存储到编组中 首先在plane_war.py中创建一个编组,用于存储所有有效的子弹,以便能够管理发射出去的子弹;这个编组是pygame.sprite.Group...,然后再将其删除 对plane_war.py中的while语句中添加下面这一句 # 删除已经消失的子弹 for bullet in bullets.copy(): if bullet.rect.bottom...在这里我们使用game.sprite.groupcollide()方法,此方法检测两个rect是否有元素重叠,并返回一个字典 检测子弹与飞船碰撞 子弹击中飞船后飞船需要马上消失,所以需要在更新子弹的位置后面检测碰撞...(bullets, spaceships, setting, screen, plane) 测试效果 我这里为了测试我将子弹的宽度给修改了自己写的游戏想怎么改就怎么改,游戏意思,哈哈~ 总结 游戏结束

    6.1K10

    手把手教你使用Pygame制作飞机大战小游戏,4万字超详细讲解!

    中的__init__方法中添加以下数据 # 子弹的设置 self.bullet_speed = 3 # 速度 self.bullet_width = 3 # 子弹的宽 self.bullet_height...类,此类可以将游戏中的元素进行编组,可以同时操作编组中的所有元素 将子弹存储到编组中 首先在plane_war.py中创建一个编组,用于存储所有有效的子弹,以便能够管理发射出去的子弹;这个编组是pygame.sprite.Group...,然后再将其删除 对plane_war.py中的while语句中添加下面这一句 # 删除已经消失的子弹 for bullet in bullets.copy(): if bullet.rect.bottom...在这里我们使用game.sprite.groupcollide()方法,此方法检测两个rect是否有元素重叠,并返回一个字典 检测子弹与飞船碰撞 子弹击中飞船后飞船需要马上消失,所以需要在更新子弹的位置后面检测碰撞...为其增加参数 fg.update_bullets(bullets, spaceships, setting, screen, plane) 测试效果 我这里为了测试我将子弹的宽度给修改了自己写的游戏想怎么改就怎么改

    12K30

    【Pygame 第11课】 GAME OVER

    本书是微信公众账号“MacTalk”中的文章经重新审阅、校订、整理、排版后的合集。不管你是一个mac用户、一个程序员、还是一个对技术感兴趣的人,这本书都是物超所值的。 继续我们的打飞机游戏。...完成了子弹和敌机之间的碰撞检测之后,自然还要来处理敌机与本体之间的碰撞检测,这决定了游戏是否结束。 之前我们没有把plane作为一个对象来处理,现在为了能更方便地做碰撞检测,我们还是要把它封装一下。...这和我们之前对bullet和enemy所做的操作类似。...,因为敌机和本体都有一定的面积,不能像子弹一样忽略长宽。...但如果两张图片一旦有重合就算是碰撞,会让游戏看上去有些奇怪:有时候你觉得并没有撞上,而实际已经有了重合,游戏就失败了。所以为了避免这一现象,我们要给plane的长宽打上一点折扣。

    816120
    领券