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实现的简单猜数字游戏
Apr 04 Python
浅谈Python单向链表的实现
Dec 24 Python
python编程实现希尔排序
Apr 13 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
python经典趣味24点游戏程序设计
Jul 26 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
Django权限设置及验证方式
May 13 Python
Python实现计算图像RGB均值方式
Jun 04 Python
带你学习Python如何实现回归树模型
Jul 16 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
php学习 字符串课件
2008/06/15 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
学习JS面向对象成果 借国庆发布个最新作品与大家交流
2009/10/03 Javascript
JavaScript中的细节分析
2012/06/30 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
Python字符串对象实现原理详解
2019/07/01 Python
Python 线程池用法简单示例
2019/10/02 Python
python制作朋友圈九宫格图片
2019/11/03 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
革命先烈的英雄事迹材料
2014/02/15 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python
JavaScript 对象创建的3种方法
2021/11/17 Javascript
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL
Java详细解析==和equals的区别
2022/04/07 Java/Android