1.6.9 【实战】模拟二维矢量移动小游戏

一、思路

  1. 在二维矢量游戏中,一般使用二维矢量保存玩家的位置,使用矢量可以计算出玩家移动的位置

  2. 首先实现二维矢量对象

  3. 接着构造玩家对象

  4. 最后使用矢量对象和玩家对象共同模拟玩家移动的过程

二、实现二纬矢量对象

  1. 矢量是数据中的概念,二位矢量用友两个方向的信息,同事可以进行加、减、乘(缩放)、距离、单位化等计算

  2. 在计算中,使用拥有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}
    	}
    }

三、实现玩家对象

  1. 通过矢量计算获取玩家移动后的新位置,步骤如下

    1. 使用矢量减法,将目标位置减去当前位置即可计算出位于两个位置之间的新矢量

    2. 使用normalize()方法将方向矢量变为模为1的单位化矢量

    3. 然后用单位化矢量乘以玩家的速度,就得到玩家每次分别在X,Y方向上移动的长度

    4. 将目标当前位置的坐标与移动的坐标相加,得到新位置的坐标,并做出修改

四、主程序

Last updated