在游戏中,通常使用二维矢量保存玩家的位置,使用矢量计算能够计算出玩家移动的位置,下面的 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
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")
end~it