pygame飞机大战用精灵组层编写英雄系列(二)英雄遇到小兵了,有理也说不清

英雄走上了征途,就遇到了小兵,当然如果你看过前面的日志,直接出个BOSS也未尝不可。

不过目前的英雄没有子弹,没有技能,除了躲闪,别无他招,因此,还是老老实实打怪升级吧。

小兵当然是最杂碎的,所以写起来也简单。

英雄飞机的飞行方式,见前面的日志。

pygame之飞机大战按键操作解决方案比较

https://blog.csdn.net/hailler1119/article/details/88133283

https://blog.csdn.net/hailler1119/article/details/88137624

https://blog.csdn.net/hailler1119/article/details/88205228

在setting.py里添加 一下,setting.py完整代码如下

import pygame
from sys import exit
import random
import math
vect = pygame.math.Vector2
FPS = 60
#define sprite groups. Do this before creating sprites

herogroup = pygame.sprite.Group()
selectgroup = pygame.sprite.Group()
enemygroup = pygame.sprite.Group()

# only the allgroup draws the sprite, so i use LayeredUpdates() instead Group()
# more sophisticated, can draw sprites in layers
allgroup = pygame.sprite.LayeredUpdates()
SCENEWIDTH = 600
SCENEHEIGHT =800
SCENERECT = pygame.sprite.Rect(0,0,SCENEWIDTH,SCENEHEIGHT)

CREATE_ENEMY_TIME = pygame.USEREVENT + 1

最后一条语句等下讲。

enemyplane.py

扫描二维码关注公众号,回复: 5880660 查看本文章

代码如下:

from setting import *

# 敌人飞机

class EnemyPlane(pygame.sprite.Sprite):
    # 初始化敌人飞机
    def __init__(self):
        self._layer = 2
        self.groups = allgroup,enemygroup
        pygame.sprite.Sprite.__init__(self,self.groups)
        self.image = pygame.image.load('./images/enemy/enemy0.png')
        self.rect = self.image.get_rect()
        self.HP = 1
        self.speed = 2
        self.x_speed = 0
        self.y_speed = 2
   

    
    # 设置飞机位置
    def set_pos(self, x, y):
        self.rect.x = x
        self.rect.y = y

    def update(self):
        """ 
        更新位置
            计算位置,精灵组自动调用
            超出屏幕,自毁
        """
        self.rect.x += self.x_speed
        self.rect.y += self.y_speed
        if self.HP <= 0:
            self.kill()
        if not self.rect.colliderect(SCENERECT):
            self.kill()

层在第二层,其实在哪里都无所谓,比背景大就行。

group在allgroup,用来显示图像,更新位置。在enemygroup用来碰撞检查。

小兵建立好了,就该出场了,为了能不停的刷新,建立一个pygame的用户的消息,时间一到,自动触发事件。

在setting.py里添加

CREATE_ENEMY_TIME = pygame.USEREVENT + 1

CREATE_ENEMY_TIME为事件的名称,用户可以自己随便定义,方便记忆和理解就行。

pygame.USEREVENT 为pygame为用户自定义事件用的起始值,为int属性,我们要在这个值后面取值,第一个事件就 +1吧,

以后的时间可以+2,+3……

在主函数main.py的初始化里添加

pygame.time.set_timer(CREATE_ENEMY_TIME,500)

意思是,每隔500毫秒,触发事件。为什么要这么短的时间呢?听我解释。如果是定期触发,敌人飞机的出现时间很固定,会很无趣,为此后面敌人出现的函数里,添加了随机函数,满足一定条件才出现敌机,这样看起来,敌人飞机的出现也很随机了。

在时间处理函数里添加

elif event.type == CREATE_ENEMY_TIME:
    self.createEnemy()

如果是用户自定义的时间,则调用createEnemy()函数。该函数代码如下:
 

    def createEnemy(self):
        if random.randint(0,3)==1:
            enemy = EnemyPlane()
            enemy.set_pos(random.randint(0,SCENEWIDTH)-50,-20)

本来是500毫秒一次敌机出现,现在大致上是500,~1500毫秒之间,随机出现。可以调节randint来变更频率。

main.py完整代码如下:

from setting import *
from gamebackground import *
from heroplane import *
from selecthero import *
from enemyplane import *


class MainScene(object):
    #初始化
    def __init__(self):
        pygame.mixer.pre_init()
        pygame.init()
        pygame.mixer.init()
        pygame.font.init()
        # pygame.mouse.set_visible(False)
        self.scene = pygame.display.set_mode((SCENEWIDTH, SCENEHEIGHT), 1, 32)
        # self.scene = pygame.display.set_mode((SCENEWIDTH, SCENEHEIGHT), pygame.FULLSCREEN, 32)
        pygame.display.set_caption("自学飞机大战--精灵组版")
        #载入地图
        b = SelectHero(self.scene)
        b.run()
        hero_index = b.hero_index
        b.kill()
        self.bground = Background(self.scene)

        self.hero = HeroPlane(hero_index)
        print(self.hero.speed, self.hero.damage, self.hero.HP)
        self.hero.set_pos(SCENEWIDTH // 2 - 50, SCENEHEIGHT - 100)

        pygame.time.set_timer(CREATE_ENEMY_TIME,500)

    #绘制各个元素
    def draw(self):
        self.bground.draw()
        allgroup.draw(self.scene)

    def update(self):
        self.bground.update()
        allgroup.update()

    def collideEvent(self):
        pass

    #处理键盘和鼠标相应
    def handleEvent(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_j:
                    #普通射击
                    pass
                elif event.key == pygame.K_a:
                    self.hero.key_down(pygame.K_a)
                elif event.key == pygame.K_d:
                    self.hero.key_down(pygame.K_d)
                elif event.key == pygame.K_w:
                    self.hero.key_down(pygame.K_w)
                elif event.key == pygame.K_s:
                    self.hero.key_down(pygame.K_s)
                #ESC 退出
                elif event.key == pygame.K_ESCAPE or event.key == pygame.K_F4:
                    pygame.quit()
                    exit()
            #按键松开
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_j:
                    pass
                elif event.key == pygame.K_a:
                    self.hero.key_up(pygame.K_a)
                elif event.key == pygame.K_d:
                    self.hero.key_up(pygame.K_d)
                elif event.key == pygame.K_w:
                    self.hero.key_up(pygame.K_w)
                elif event.key == pygame.K_s:
                    self.hero.key_up(pygame.K_s)
            elif event.type == CREATE_ENEMY_TIME:
                self.createEnemy()

        self.hero.press_move()
    def createEnemy(self):
        if random.randint(0,3)==1:
            enemy = EnemyPlane()
            enemy.set_pos(random.randint(0,SCENEWIDTH)-50,-20)

    def runScene(self):
        # pygame.mixer.music.load('music/bgm.mp3')
        # pygame.mixer.music.play(-1)
        clock = pygame.time.Clock()
        while True:
            clock.tick(60)
            self.draw()
            self.update()
            self.collideEvent()
            self.handleEvent()
            pygame.display.flip()


if __name__ == "__main__":
    play = MainScene()
    play.runScene()

else:
    print("i was imported by", __name__)

运行效果如下:

 小兵的出现,看起来至少是不规律的。

源代码见链接

https://gitee.com/hailler/hero/tree/master

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/89047931