Pygame游戏开发之太空射击实战敌人精灵篇


Posted in Python onAugust 05, 2022

视频

观看视频

敌人精灵

这是我们“Shmup”项目的第2部分!在本课中,我们将添加一些敌人的精灵供玩家躲避。在本系列课程中,我们将使用Python和Pygame构建一个完整的游戏。它适用于已经了解Python基础知识并希望加深对Python的理解并学习编程游戏基础知识的初学者。

敌人精灵

在这一点上,我们不需要担心我们的敌人精灵是什么,我们只想让它们出现在屏幕上。你可能会认为你的游戏是关于宇宙飞船躲避流星或独角兽躲避飞行的比萨饼 - 就代码而言,这并不重要。

记住这一点,我们将在代码中将敌人的精灵命名为Mob通用名称。MOB-Mobile原指游戏中所有由电脑控制的角色,现也引申指一般指怪物,任何游戏怪物都可叫MOB。

我们将从定义精灵属性开始:

class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30, 40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(1, 8)

这里的关键是选择一个适合Mob出现的地方。我们不希望它们只是突然出现,所以我们选择一个位于顶部上方的y值(y<0),以及一个位于两侧之间的x的随机值。

Pygame游戏开发之太空射击实战敌人精灵篇

现在,对于update(),我们可以快速移动精灵,但是当精灵从底部消失时呢?我们可以删除该精灵,然后生成另一个精灵,或者通过将精灵移回顶部上方的随机位置来获得完全相同的效果:

def update(self):
        self.rect.y += self.speedy
        if self.rect.top > HEIGHT + 10:
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 8)

生成敌人

我们将希望有很多敌人,所以我们将建立一个新的mobs组来控制所有敌人。这也将在以后的步骤中使我们的编程更轻松。然后,我们生成一些Mob并将其添加到组中:

all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)

现在你应该有源源不断的Mob从屏幕上下来,就像这样:

Pygame游戏开发之太空射击实战敌人精灵篇

这很好,但是让Mob都直接向下移动有点无聊。让我们在 x 方向上添加一点运动:

class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30, 40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(1, 8)
        self.speedx = random.randrange(-3, 3)
    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 8)

请注意,我们需要更改if语句以便在Mob离开屏幕时重新生成Mob。对角线移动的Mob在离开底部之前就已经离开侧面,所以我们需要当Mob离开屏幕时快速地重置它。

您的游戏现在应如下所示:

Pygame游戏开发之太空射击实战敌人精灵篇

在下一课中,我们将学习如何检测两个精灵何时相互碰撞(碰撞),并使玩家能够向Mob开枪。

此部分的完整代码

# KidsCanCode - Game Development with Pygame video series
# Shmup game - part 2
# Video link: https://www.youtube.com/watch?v=-5GNbL33hz0
# Enemy sprites
import pygame
import random
WIDTH = 480
HEIGHT = 600
FPS = 60
# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
# initialize pygame and create window
pygame.init()
# pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shmup!")
clock = pygame.time.Clock()
class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0
    def update(self):
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -8
        if keystate[pygame.K_RIGHT]:
            self.speedx = 8
        self.rect.x += self.speedx
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
class Mob(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30, 40))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(1, 8)
        self.speedx = random.randrange(-3, 3)
    def update(self):
        self.rect.x += self.speedx
        self.rect.y += self.speedy
        if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
            self.rect.x = random.randrange(WIDTH - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, 8)
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
for i in range(8):
    m = Mob()
    all_sprites.add(m)
    mobs.add(m)
# Game loop
running = True
while running:
    # keep loop running at the right speed
    clock.tick(FPS)
    # Process input (events)
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False
    # Update
    all_sprites.update()
    # Draw / render
    screen.fill(BLACK)
    all_sprites.draw(screen)
    # *after* drawing everything, flip the display
    pygame.display.flip()
pygame.quit()

第3部分:碰撞(和子弹)

到此这篇关于Pygame游戏开发之太空射击实战敌人精灵篇的文章就介绍到这了,更多相关Pygame敌人精灵内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
简单讲解Python中的闭包
Aug 11 Python
Python爬取网易云音乐热门评论
Mar 31 Python
python验证码识别教程之滑动验证码
Jun 04 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
python实现自动化上线脚本的示例
Jul 01 Python
python线程中的同步问题及解决方法
Aug 29 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
如何清空python的变量
Jul 05 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
python开根号实例讲解
Aug 30 Python
python爬虫爬取图片的简单代码
Jan 18 Python
python playwrigh框架入门安装使用
Jul 23 #Python
python playwright之元素定位示例详解
Jul 23 #Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 #Python
Python中的 No Module named ***问题及解决
Jul 23 #Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 #Python
Python+pyaudio实现音频控制示例详解
Jul 23 #Python
python高温预警数据获取实例
Jul 23 #Python
You might like
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
php获取文章上一页与下一页的方法
2014/12/01 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
python类的继承实例详解
2017/03/30 Python
python实现自动发送报警监控邮件
2018/06/21 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
英国日常交易网站:Wowcher
2018/09/04 全球购物
师范应届生语文教师求职信
2013/10/29 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
继承公证书样本
2014/04/04 职场文书
英文升职感谢信
2015/01/23 职场文书
社区国庆节活动总结
2015/03/23 职场文书
只用Python就可以制作的简单词云
2021/06/07 Python
一条慢SQL语句引发的改造之路
2022/03/16 MySQL