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基于pygame模块播放MP3的方法示例
Sep 30 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
python读取文本绘制动态速度曲线
Jun 21 Python
python画双y轴图像的示例代码
Jul 07 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
简单了解python中的与或非运算
Sep 18 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
基于python-pptx库中文文档及使用详解
Feb 14 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
Nov 18 Python
pytorch 实现在测试的时候启用dropout
May 27 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
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
代码生成器 document.write()
2007/04/15 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
Python函数返回不定数量的值方法
2019/01/22 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
大学生优秀的自我评价分享
2013/10/22 职场文书
银行工作检查书范文
2014/01/31 职场文书
数学国培研修感言
2014/02/13 职场文书
亲属关系公证书
2014/04/08 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
民事答辩状格式范文
2015/05/21 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL