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学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
Python中函数参数调用方式分析
Aug 09 Python
Python实现App自动签到领取积分功能
Sep 29 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
在Django中实现添加user到group并查看
Nov 18 Python
python global和nonlocal用法解析
Feb 03 Python
Python-jenkins模块之folder相关操作介绍
May 12 Python
Python实现简单的俄罗斯方块游戏
Sep 25 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
快速配置PHPMyAdmin方法
2008/06/05 PHP
PHP中的array数组类型分析说明
2010/07/27 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
jquery实现加载等待效果示例
2013/09/25 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
python映射列表实例分析
2015/01/26 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
python区块及区块链的开发详解
2019/07/03 Python
python如何基于redis实现ip代理池
2020/01/17 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
巴西最大的珠宝连锁店:Vivara
2019/04/18 全球购物
请解释流与文件有什么不同
2016/07/29 面试题
Linux文件操作命令都有哪些
2015/02/27 面试题
班干部演讲稿
2014/04/24 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
高三英语复习计划
2015/01/19 职场文书
我爱我班主题班会
2015/08/13 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python