天天看點

pygame飛機大戰用精靈組層編寫敵機系列(二)用貝塞爾曲線畫設定一組飛機的運作軌迹

敵機也是機,又不是象棋裡的兵和卒,他也會走八字,跳廣場舞的,隻要你想,沒有什麼軌迹是做不到的。

貝塞爾曲線的基本公式上篇日志已經實作了,現在來利用到遊戲裡。

建立一個飛機類enemyplane.py,為了比較,實作了兩個模式,一個是基本的直接往下,一個是貝塞爾曲線。setting.py,bezier.py見前面的日志。

from setting import *
from bezier import *

# 敵人飛機


class EnemyPlane(pygame.sprite.Sprite):
    # 初始化敵人飛機
    def __init__(self):
        self._layer = 2
        self.groups = allgroup
        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
        #當采用路徑時,輸入的控制點
        self.points= []
        #飛機路徑上的點 point(x,y)
        self.path_points = []
        #飛機正常方式
        self.path_type = 'normal'
        #飛機用路徑描述的最大的點,目前點
        self.max_point = 500
        self.current_point = 0

    # 設定飛機位置
    def set_pos(self, x, y):

        self.rect.x = x
        self.rect.y = y

    def set_bezier_path(self, points):
        self.path_type = 'bezier'
        self.points = points
        for v in range(0, self.max_point+1):
            t = v / self.max_point
            self.path_points.append(bezier(self.points, t))
            

    def update(self):
        """ 
        更新位置
            計算位置,精靈組自動調用
            超出螢幕,自毀
        """
        if self.path_type == 'bezier':
            if self.current_point == self.max_point:
                self.current_point = 0

            # print(self.path_points[self.current_point][0])
            self.rect.x = self.path_points[self.current_point][0]
            self.rect.y = self.path_points[self.current_point][1]
            self.current_point += 1
        else:
            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()
           

在來建立一個飛機組enemyunit.py,最多包括6加飛機。

from setting import *
from enemyplane import *


class EnemyUnit(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.count = 0
        #設定飛機出現間隔用
        self.interval = 1000
        self.start_time = pygame.time.get_ticks()
        #用了sprite必須有個image ,用了個投機的辦法,放到螢幕外面去了。
        self.set_pos(-300,-300)
        #控制飛行軌迹的點
        self.points = [(-10, -10), (200, 800), (300, 200), (1000, 200)]

    def set_pos(self,x,y):
        self.rect.x = x
        self.rect.y = y

    def update(self):
        cur_time = pygame.time.get_ticks()
        if cur_time - self.start_time < self.interval:
            return
        self.start_time = cur_time
        enemy = EnemyPlane()
        enemy.set_bezier_path(self.points)
        enemy.set_pos(-10,-10)
        self.count  +=1
        #大于6架,就退出了
        if self.count > 6:
            self.kill()
           

建立一個簡單的main.py來測試

from setting import *
from sys import exit
from pygame import gfxdraw
# from demo import *
from enemyunit 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("自學飛機大戰--精靈組版")
        self.scene.fill((0,0,0))
        enemy = EnemyPlane()
        enemy.set_pos(200,0)
        enemyunit = EnemyUnit()
        
        # ene.set_path()
        
    #繪制各個元素
    def draw(self):
        
        self.scene.fill((0,0,0))
        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
                   
                else:
                    pass
               


    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.update()
            # pygame.time.delay(100)


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

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

最終效果如下:

pygame飛機大戰用精靈組層編寫敵機系列(二)用貝塞爾曲線畫設定一組飛機的運作軌迹

 定義不同的控制點,就可以做出形形色色的飛行軌迹了

繼續閱讀