pygame动画3

这是一个完整的示例 但是没有加入声音

import pygame
import random
from pygame import *
from sys import exit

WIDTH, HEIGHT = 600, 480
FPS = 30
jet_image = "D:\\workspace\\game\\data\\jet.png"
cloud_image = "D:\\workspace\\game\\data\\cloud.png"
missile_image = "D:\\workspace\\game\\data\\missile.png"


class GameSprite(pygame.sprite.Sprite):
    """游戏精灵基类"""

    def __init__(self, speed=1):
        # 调用父类的初始化方法
        super().__init__()

        # 加载图像 一个30*30的绿色小方块
        self.surf = pygame.image.load(jet_image)
        self.surf.set_colorkey((255, 255, 255), RLEACCEL)
        # 设置尺寸
        self.rect = self.surf.get_rect()
        # 记录速度
        self.speed = speed

    def update(self, pressed_keys):
        if pressed_keys[K_UP]:
            self.rect.move_ip(0, -5)
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0, 5)
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-5, 0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(5, 0)

        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.top <= 0:
            self.rect.top = 0
        if self.rect.bottom >= HEIGHT:
            self.rect.bottom = HEIGHT


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy, self).__init__()
        self.surf = pygame.image.load(missile_image)
        self.surf.set_colorkey((255, 255, 255), RLEACCEL)
        self.rect = self.surf.get_rect(
            center=(
                random.randint(WIDTH + 20, WIDTH + 100),
                random.randint(0, HEIGHT),
            )
        )
        self.speed = random.randint(5, 20)

    def update(self):
        self.rect.move_ip(-self.speed, 0)
        if self.rect.right < 0:
            self.kill()


class Cloud(pygame.sprite.Sprite):
    """
    背景的云
    """
    def __init__(self):
        super(Cloud, self).__init__()
        self.surf = pygame.image.load(cloud_image)
        self.surf.set_colorkey((0, 0, 0), RLEACCEL)
        self.rect = self.surf.get_rect(
            center=(
                random.randint(WIDTH + 20, WIDTH + 100),
                random.randint(0, HEIGHT),
            )
        )

    def update(self):
        self.rect.move_ip(-5, 0)
        if self.rect.right < 0:
            self.kill()


def main():
    pygame.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    clock = pygame.time.Clock()

    # 精灵和精灵组
    game = GameSprite()
    enemies = pygame.sprite.Group()
    clouds = pygame.sprite.Group()
    all_sprites = pygame.sprite.Group()
    all_sprites.add(game)

    # 自定义事件
    # 每隔250毫秒生成敌人
    ADDENEMY = pygame.USEREVENT + 1
    pygame.time.set_timer(ADDENEMY, 250)
    # 每隔一秒生成云
    ADDCLOUD = pygame.USEREVENT + 2
    pygame.time.set_timer(ADDCLOUD, 1000)
    # 事件队列
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
            elif event.type == ADDENEMY:
                # 创建新的敌人 并且加入到精灵组中
                new_enemy = Enemy()
                enemies.add(new_enemy)
                all_sprites.add(new_enemy)
            elif event.type == ADDCLOUD:
                # 创建新的云并且加入到精灵组中
                new_cloud = Cloud()
                clouds.add(new_cloud)
                all_sprites.add(new_cloud)
        clock.tick(FPS)

        pressed_keys = pygame.key.get_pressed()
        # 屏幕背景色
        screen.fill((135, 206, 250))
        # 将我们的小方框绘制到屏幕中
        screen.blit(game.surf, game.rect)
        # 调用update方法来触发事件

        # 将玩家和敌人绘制到屏幕中
        for entity in all_sprites:
            screen.blit(entity.surf, entity.rect)

        # 调用update方法每帧更新一次
        game.update(pressed_keys)
        enemies.update()
        clouds.update()
        # 碰撞检测 检测玩家是否和敌人相撞
        if pygame.sprite.spritecollideany(game, enemies):
            # If so, then remove the player and stop the loop
            pygame.time.wait(1200)
            print("Game Over!")
            game.kill()
            exit()
        pygame.display.update()


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值