欢迎光临散文网 会员登陆 & 注册

陨石动效完成!从零开始用Python编程制作飞机大战游戏 P07

2023-01-28 17:24 作者:xiaotiaotiao2011  | 我要投稿
import pygame  # 导入pygame
import random  # 导入random
import os
#bug:石头无法旋转

# 设置常量,常量就是在python中不变的量

FPS = 60  # FPS是指帧数,指在一秒内运行多少次
WIDTH = 500
HEIGHT = 600
WHITE = (255, 255, 255)  # 这是一个RGB,R表示red,G表示green,B表示blue,数值是一个元组,必须带括号
GREEN = (0, 255, 0)
RED = (225, 0, 0)
YELLOW = (255, 255, 0)
BLACK = (0, 0, 0)



# 初始化pygame

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(
    (WIDTH, HEIGHT))  # 创建一个窗口,宽为WIDTH常量,高为HEIGHT常量
clock = pygame.time.Clock()  # 设置帧数

background_img=pygame.image.load(os.path.join("img", "background.png")).convert()

player_img=pygame.image.load(os.path.join("img","player.png")).convert()

rock_img=pygame.image.load(os.path.join("img","rock.png")).convert()

bullet_img=pygame.image.load(os.path.join("img","bullet.png")).convert()

pygame.display.set_caption('plane_war')  # 窗口标题为字符串“plane_war”,引号是英文

hoot_sound=pygame.mixer.Sound(os.path.join("sound","shoot.wav"))
expl_sounds=[pygame.mixer.Sound(os.path.join("sound","expl0.wav")),
             pygame.mixer.Sound(os.path.join("sound","expl1.wav"))]

pygame.mixer.music.load(os.path.join("sound","background.ogg"))
pygame.mixer.music.set_volume(0.3)
class Player(pygame.sprite.Sprite):  # 设置一个类,继承父类pygame.sprite.Sprite

    def __init__(self):  # 设置初始化内容

        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.transform.scale(player_img,(50,40))

        self.image.set_colorkey((BLACK))

        self.rect = self.image.get_rect()  # 获取长方形的矩形位置

        self.rect.centerx = WIDTH/2  # 设置长方形中心在x轴的中心

        self.rect.bottom = HEIGHT-20  # 设置长方形的底部在y轴的580位置

        self.speedx = 8  # 设置每次移动的像素(px)

    def update(self):  # 定义update函数

        key_pressed = pygame.key.get_pressed()  # 获取键盘状态

        # 判断键盘状态

        if key_pressed[pygame.K_RIGHT]:  # 判断键盘右键是否按下

            self.rect.x += self.speedx

        if key_pressed[pygame.K_LEFT]:  # 判断键盘左键是否按下

            self.rect.x -= self.speedx

        # 判断位置

        if self.rect.right > WIDTH:  # 如果右边的位置大于宽

            self.rect.right = WIDTH

        if self.rect.left < 0:  # 如果左边小于宽

            self.rect.left = 0

    def shoot(self):

        bullet = Bullet(self.rect.centerx, self.rect.centery)
        all_sprites.add(bullet)
        bullets.add(bullet)
        hoot_sound.play( )

    def k_shoot(self):
        for i in range(100):
            偏差 = random.randrange(-250, 250)
            bullet = Bullet(self.rect.centerx+偏差, self.rect.centery)
            all_sprites.add(bullet)
            bullets.add(bullet)
            hoot_sound.play( )

class Rock(pygame.sprite.Sprite):  # 设置一个类,继承父类pygame.sprite.Sprite

    def __init__(self):  # 设置初始化内容

        pygame.sprite.Sprite.__init__(self)
        self.image_origin=rock_img
        self.image_origin.set_colorkey(BLACK)
        self.image=self.image_origin.copy()
        self.big_or_small=random.randint(30,70)
        self.image = pygame.transform.scale(rock_img, (self.big_or_small, self.big_or_small))

        self.image.set_colorkey((BLACK))

        self.rect = self.image.get_rect()  # 获取长方形的矩形位置

        # 随机生成位置和速度

        try:

            self.rect.x = random.randint(0, WIDTH-self.rect.x)
            self.rect.y = random.randint(-40, -10)
            self.speedy = random.randint(2, 10)  # 设置每次移动的像素(px)
            self.speedx = random.randint(-3, 3)

        except:

            self.rect.x = random.randint(0, 470)
            self.rect.y = -10
            self.speedy = random.randint(2, 10)
            self.speedx = random.randint(-3, 3)

        self.total_degree=0
        self.rot_degree=random.randrange(-3,3)
    def rotate(self):
        self.total_degree+=3
        self.total_degree%=360
        self.image=pygame.transform.rotate(self.image_origin,self.rot_degree)
        center=self.rect.center
        self.rect=self.image.get_rect()
        self.rect.center=center
    def update(self):  # 定义update函数

        self.rect.y += self.speedy  # y轴增加

        self.rect.x += self.speedx  # x轴增加

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

            try:

                self.rect.x = random.randint(0, WIDTH-self.rect.x)

                self.rect.y = random.randint(-40, -10)

                self.speedy = random.randint(2, 10)  # 设置每次移动的像素(px)

                self.speedx = random.randint(-3, 3)

            except:

                self.rect.x = random.randint(0, 470)

                self.rect.y = -10

                self.speedy = random.randint(2, 10)

                self.speedx = random.randint(-3, 3)

class Bullet(pygame.sprite.Sprite):  # 设置一个类,继承父类pygame.sprite.Sprite

    def __init__(self, x, y):  # 设置初始化内容

        pygame.sprite.Sprite.__init__(self)

        self.image =pygame.transform.scale(bullet_img,(5,20))  # 创建一个宽10,高20的长方形,数值为数组
        self.image.set_colorkey(BLACK)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

        self.speedy = -10  # 速度-10

    def update(self):  # 定义update函数

        self.rect.y += self.speedy  # y轴增加

        if self.rect.bottom < 0:

            self.kill()  # 隐藏


all_sprites = pygame.sprite.Group()  # 创建一个所有精灵列表

rocks = pygame.sprite.Group()

bullets = pygame.sprite.Group()

player = Player()

all_sprites.add(player)
pygame.mixer.music.play(-1)

for i in range(8):

    rock = Rock()

    all_sprites.add(rock)

    rocks.add(rock)


running = True  # 设running为布尔值True,表示真

# 主循环

while running:

    clock.tick(FPS)  # 设置帧数为60/s

    for event in pygame.event.get():  # 判断窗口状态

        if event.type == pygame.QUIT:  # 检测窗口是否关闭

            running = False  # 如果是,将running设为False,停止判断

        elif event.type == pygame.KEYDOWN:

            if event.key == pygame.K_SPACE:
                player.shoot()
            if event.key==pygame.K_k:
                player.k_shoot()

    # 更新游戏

    all_sprites.update()

    hits_rockandbullet = pygame.sprite.groupcollide(
        rocks, bullets, True, True)  # 检测子弹与陨石是否碰撞
    for hit in hits_rockandbullet:
        # 打中一个再生成一个
        random.choice(expl_sounds).play()
        r = Rock()
        all_sprites.add(r)
        rocks.add(r)

    # 显示画面
    hits_rockandbullet=pygame.sprite.spritecollide(player,rocks,False)
    if hits_rockandbullet:
        running=False#True
    screen.fill(BLACK)
    screen.blit(background_img,(0,0))
    all_sprites.draw(screen)

    pygame.display.update()  # 窗口刷新


pygame.quit()


陨石动效完成!从零开始用Python编程制作飞机大战游戏 P07的评论 (共 条)

分享到微博请遵守国家法律