用 python 寫一個模擬玩家移動的示例

實例:二維矢量模擬玩家移動

在遊戲中,通常使用二維矢量保存玩家的位置,使用矢量計算能夠計算出玩家移動的位置,下面的 demo 中,首先實現二維矢量對象,接着構造玩家對象,最後使用矢量對象和玩家對象共同模擬玩家移動的過程python

1)實現二維矢量結構spa

矢量是數據中的概念,二維矢量擁有兩個方向的信息,同時能夠進行加、減、乘(縮放)、距離、單位化等計算orm

在計算機中,使用擁有 x 和 y 兩個份量的 Vecor2 結構體實現數學中二維向量的概念,以下:對象

# coding=utf-8
import math
import time


# 座標類
class Vector(object):
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    
    # 相加
    def add(self, vector):
        self.x += vector.x
        self.y += vector.y
    
    # 相減
    def sub(self, vector):
        x = self.x - vector.x
        y = self.y - vector.y
        return Vector(x, y)

    # 相乘
    def multi(self, speed):
        self.x *= speed
        self.y *= speed
        return self

    # 計算距離
    def distance(self, vector):
        dx = self.x - vector.x
        dy = self.y - vector.y
        return math.sqrt(dx ** 2 + dy ** 2)

    # 矢量單位化
    def normalize(self):
        mag = self.x ** 2 + self.y ** 2
        if mag > 0:
            one_over_mag = 1 / math.sqrt(mag)
            vector = Vector(x=self.x * one_over_mag, y=self.y * one_over_mag)
        else:
            vector = Vector()
        return vector

 

2)實現玩家對象blog

玩家對象負責存儲玩家的當前位置、目標位置和移動速度,使用 moveTo() 爲玩家設定目的地座標,使用 update() 更新玩家座標遊戲

# 玩家類
class Player(object):
    def __init__(self, current_vector=None, target_vector=None, speed=0):
        self.current_vector = current_vector
        self.target_vector = target_vector
        self.speed = speed

    # 獲取玩家座標
    def get_current_vector(self):
        return self.current_vector

    # 判斷是否到達終點
    def is_arrived(self):
        return self.current_vector.distance(self.target_vector) < self.speed

    # 更新玩家位置
    def update_vector(self):
        # 獲取方向矢量(固定值)
        direction_vector = self.target_vector.sub(self.current_vector)
        # 矢量單位化(固定值)
        normalize_vector = direction_vector.normalize()
        # 根據速度計算 x, y 方向上前進的長度
        ongoing_vector = normalize_vector.multi(self.speed)
        # 更新位置
        self.current_vector.add(ongoing_vector)

更新座標稍微複雜一些,須要經過矢量計算得到玩家移動後的新位置,步驟以下:utf-8

  1. 使用矢量減法,將目標位置(targetPos)減去當前位置(currPos)便可計算出位於兩個位置之間的新矢量
  2. 使用 normalize() 方法將方向矢量變爲模爲 1 的單位化矢量
  3. 而後用單位化矢量乘以玩家的速度,就能獲得玩家每次分別在 x, y 方向上移動的長度
  4. 將目標當前位置的座標與移動的座標相加,獲得新位置的座標,並作修改

 

3)主程序get

玩家移動是一個不斷更新位置的循環過程,每次檢測玩家是否靠近目標點附近,若是尚未到達,則不斷地更新位置,並打印出玩家的當前位置,直到玩家到達終點數學

if __name__ == '__main__':
    p = Player()
    p.current_vector = Vector(0, 0)
    p.target_vector = Vector(2, 2)
    p.speed = 0.2

    while not p.is_arrived():
        p.update_vector()
        print(f"({p.current_vector.x}, {p.current_vector.y})")
        time.sleep(1)

    print("arrive at the destination")
  1. 將 Player 實例化,設定玩家終點座標,當前座標
  2. 更新玩家位置
  3. 每次移動後,打印玩家的位置座標
  4. 延時 1 秒(便於觀察效果)

 

end~it

相關文章
相關標籤/搜索