python及pygame雷霆战机游戏项目实战02 敌人精灵

在这个系列中,将制作一个雷霆战机游戏。

GIF.gif

敌人精灵

首先定义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)

这里的关键是为小怪物初始化一个好的位置。选择一个高于顶部的值(y <0)和一个介于左右两边之间的x的随机值。

在update函数中,更新精灵y轴的坐标,向下移动精灵;精灵离开底部时,通过将精灵移回顶部上方的随机位置来制造下一个精灵。

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)

一群敌机

使用for语句,循环创建一些怪物,并将它们添加到精灵组中:

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

现在应该有一群怪物涌入屏幕,如下所示:

这很棒,但让小怪直接向下移动有点无聊。让在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 self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:

你的游戏现在应该是这样的:image
整合到一起

# 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()

在下一课中,将学习如何检测两个精灵何时碰到对方(碰撞)并让玩家回击怪物。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pygame是一个用于开发2D游戏Python库。它提供了一系列功能强大的工具和函数,使开发者能够轻松创建游戏。下面是对Pygame的介绍: 1. 游戏循环:Pygame提供了一个主循环,用于处理游戏的逻辑和更新游戏状态。开发者可以在主循环中处理用户输入、更新游戏对象的位置和状态,并在每一帧中绘制游戏画面。 2. 精灵精灵组:Pygame中的精灵游戏中的可移动对象,如角色、敌人等。精灵组是一种方便管理和操作多个精灵的方式,可以实现碰撞检测、碰撞反应等功能。 3. 图像和动画:Pygame支持加载和显示图像,可以使用图像作为游戏中的背景、角色等元素。此外,Pygame还提供了动画功能,可以实现平滑的移动效果和过渡动画。 4. 声音和音乐:Pygame可以播放声音和音乐文件,可以为游戏添加音效和背景音乐,提升游戏的体验。 5. 键盘和鼠标输入:Pygame可以捕获键盘和鼠标事件,开发者可以根据用户的输入来控制游戏对象的行为。 6. 碰撞检测:Pygame提供了简单的碰撞检测功能,可以检测精灵之间的碰撞,并根据需要进行相应的处理。 7. 文字和字体:Pygame支持在游戏中显示文字,可以使用不同的字体和样式来呈现游戏信息和提示。 8. 扩展性:Pygame是一个开源库,拥有庞大的社区支持和丰富的扩展库。开发者可以利用这些扩展库来增加游戏的功能和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值