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数据库操作常用功能使用详解(创建表/插入数据/获取数据)
Dec 06 Python
python基于pyDes库实现des加密的方法
Apr 29 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
python如何重载模块实例解析
Jan 25 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
Python json模块dumps、loads操作示例
Sep 06 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
JS实现self的resend
2010/07/22 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python+django实现文件下载
2016/01/17 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Python循环结构的应用场景详解
2019/07/11 Python
python 类之间的参数传递方式
2019/12/20 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Python join()函数原理及使用方法
2020/11/14 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
网络编辑岗位职责
2014/03/18 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
python 常用的异步框架汇总整理
2021/06/18 Python
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python