pygame飞机大战用精灵组层编写英雄系列(二)英雄遇到小兵了,有理也说不清
英雄走上了征途,就遇到了小兵,当然如果你看过前面的日志,直接出个BOSS也未尝不可。
不过目前的英雄没有子弹,没有技能,除了躲闪,别无他招,因此,还是老老实实打怪升级吧。
小兵当然是最杂碎的,所以写起来也简单。
英雄飞机的飞行方式,见前面的日志。
pygame之飞机大战按键操作解决方案比较
https://blog.****.net/hailler1119/article/details/88133283
https://blog.****.net/hailler1119/article/details/88137624
https://blog.****.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
代码如下:
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__)
运行效果如下:
小兵的出现,看起来至少是不规律的。
源代码见链接