敵機也是機,又不是象棋裡的兵和卒,他也會走八字,跳廣場舞的,隻要你想,沒有什麼軌迹是做不到的。
貝塞爾曲線的基本公式上篇日志已經實作了,現在來利用到遊戲裡。
建立一個飛機類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__)
最終效果如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1UEVNhXSYp1c4dVYohmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5UTM1UDO1YTMzEDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
定義不同的控制點,就可以做出形形色色的飛行軌迹了