pygame飞机大战用精灵组(sprite)的层(layer)编写(九)BOSS寂寞了,想要对手

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了,还是保留着吧,自娱自乐用。

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88935474
今日推荐