BOSS 说一个人的舞台,好寂寞,没有对手的日子,好孤独,神呀,赐予我一个 吧。
我们的英雄该登场了。
英雄的代码前面的日志里已经写过了,稍微改下,就能用了。加了生命条的显示。
完整代码如下:
""" 英雄机的类
基本的调用函数
set_pos(self,x,y) 设置飞机初始位置
press_move(self) 持续移动
"""
from setting import *
from lifebar import *
class HeroPlane(pygame.sprite.Sprite):
def __init__(self):
self._layer = 1
self.groups = allgroup, herogroup
pygame.sprite.Sprite.__init__(self, self.groups)
# 默认图像及尺寸
self.image = pygame.image.load('images/hero/hero.png')
self.rect = self.image.get_rect()
self.mask = pygame.mask.from_surface(self.image)
#动起来的速度是 2,设置成零的话,以后就动不了了。
self.speed = 6
#飞机的x,y初始速度,不动。
self.x_speed = 0
self.y_speed = 0
# 移动按键储存
self.key_down_list = []
self.HP = 100
self.HPFULL = 100
lifebar = Lifebar(self)
#计算飞机位置,精灵组会自动调用
def update(self):
"""
更新飞机位置
飞机位置超出 scene时,不进行运算
"""
#计算飞机的位置
self.rect.x += self.x_speed
self.rect.y += self.y_speed
#限制飞机在场景scene
if self.rect.x <= 0:
self.rect.x = 0
elif self.rect.x > SCENEWIDTH - self.rect.width:
self.rect.x = SCENEWIDTH - self.rect.width
elif self.rect.y <= 0:
self.rect.y = 0
elif self.rect.y > SCENEHEIGHT - self.rect.height:
self.rect.y = SCENEHEIGHT - self.rect.height
def set_speed(self,speed = 4):
self.speed = speed
#设置飞机位置,场景初始化时用
def set_pos(self, x, y):
"""
设置飞机位置
x 左上角x点坐标
y 左上角y点坐标
"""
self.rect.x = x
self.rect.y = y
#计算飞机的位置,挨揍用
def get_pos(self):
"""
返回 vector2的值
example:
pos1 = get_pos()
print(pos1.x ,pos1.y)
"""
return vect(self.rect.x, self.rect.y)
#飞机移动,把移动的记录存到列表里,在场景的按键里判断,做出反应
def move(self, direction):
"""
移动飞机
direction 方向,可以为string值
RIGHT
LEFT
UP
DOWN
example: move("RIGHT")
"""
#先把字符串全转换为大写
# x,y方向上不动的,必须设置成 0
direction = direction.upper()
if direction == 'RIGHT':
self.x_speed = self.speed
self.y_speed = 0
elif direction == 'LEFT':
self.x_speed = -self.speed
self.y_speed = 0
elif direction == "UP":
self.x_speed = 0
self.y_speed = -self.speed
elif direction == 'DOWN':
self.x_speed = 0
self.y_speed = self.speed
else:
pass
#移动按键按下,存到list里
def key_down(self, key):
self.key_down_list.append(key)
#移动按键松开,清空列表,初始化速度
def key_up(self, key):
if len(self.key_down_list) != 0:
try:
self.key_down_list.remove(key)
#速度再次初始,speed不能初始,不然动不了了。
# self.speed = 0
self.x_speed = 0
self.y_speed = 0
except Exception:
pass
#持续移动
#如果移动键列表不为零,则根据列表数据,相应移动
def press_move(self):
if len(self.key_down_list) != 0:
if self.key_down_list[0] == pygame.K_a:
self.move('LEFT')
elif self.key_down_list[0] == pygame.K_d:
self.move('RIGHT')
elif self.key_down_list[0] == pygame.K_w:
self.move('UP')
elif self.key_down_list[0] == pygame.K_s:
self.move("DOWN")
在main.py里添加一下代码。
from setting import *
from background import *
from boss import *
from heroplane 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("自学飞机大战--精灵组版")
#载入地图
Background(vect(0, 0)) # from (0,0),lefttop coordinate
BossPlane()
self.hero = HeroPlane()
self.hero.set_pos(SCENEWIDTH // 2 - 50, SCENEHEIGHT - 100)
#绘制各个元素
def draw(self):
allgroup.draw(self.scene)
def update(self):
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)
self.hero.press_move()
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__)
好了,有对手了,可以好好表现了。这里有个BUG,英雄飞机在特定的位置可以隐藏。
想了想,不改这个BUG了,还是保留着吧,自娱自乐用。