1.6.9 【实战】模拟二维矢量移动小游戏
一、思路
在二维矢量游戏中,一般使用二维矢量保存玩家的位置,使用矢量可以计算出玩家移动的位置
首先实现二维矢量对象
接着构造玩家对象
最后使用矢量对象和玩家对象共同模拟玩家移动的过程
二、实现二纬矢量对象
矢量是数据中的概念,二位矢量用友两个方向的信息,同事可以进行加、减、乘(缩放)、距离、单位化等计算
在计算中,使用拥有X和Y两个分量的Vector结构体实现数学中二纬向量的概念
type Vector struct { X float32 Y float32 } // 坐标点相加 func (vector1 Vector) add(vector2 Vector) Vector { return Vector{vector1.X + vector2.X, vector1.Y + vector2.Y} } // 坐标点相减 func (vector1 Vector) sub(vector2 Vector) Vector { return Vector{vector1.X - vector2.X, vector1.Y - vector2.Y} } // 坐标点相乘 func (vector1 Vector) multi(Speed float32) Vector { return Vector{vector1.X * Speed, vector1.Y * Speed} } // 计算距离 func (vector1 Vector) distanceTo(vector2 Vector) float32 { dX := vector1.X - vector2.X dY := vector1.Y - vector2.Y distance := math.Sqrt(float64(dX*dX + dY*dY)) return float32(distance) } // 矢量单位化 func (vector1 Vector) normalize() Vector { mag := vector1.X*vector1.X + vector1.Y*vector1.Y if mag > 0 { oneOverMag := 1 / float32(math.Sqrt(float64(mag))) return Vector{vector1.X * oneOverMag, vector1.Y * oneOverMag} } else { return Vector{0, 0} } }
三、实现玩家对象
通过矢量计算获取玩家移动后的新位置,步骤如下
使用矢量减法,将目标位置减去当前位置即可计算出位于两个位置之间的新矢量
使用
normalize()方法将方向矢量变为模为1的单位化矢量然后用单位化矢量乘以玩家的速度,就得到玩家每次分别在X,Y方向上移动的长度
将目标当前位置的坐标与移动的坐标相加,得到新位置的坐标,并做出修改
四、主程序
Last updated