#include "ActiveObject.h" void ActiveObject::SetPosition(VecPos3 pos) { BaseObject::SetPosition(pos); } void ActiveObject::SetYpos(int y) { BaseObject::SetYpos(y); } void ActiveObject::SetSpeed(VecSpeed3 speed) { this->Speed = speed; } VecSpeed3 ActiveObject::GetSpeed() { return this->Speed; } void ActiveObject::Update(float deltaTime) { int IntegerDelta = static_cast(deltaTime * 1000); const int Gravity = 1020; // X轴移动(含余数补偿) if (Speed.x != 0) { int totalX = Speed.x * IntegerDelta + Remainder.x; // 加上上次余数 int moveX = totalX / 1000; // 整数部分为实际移动 Remainder.x = totalX % 1000; // 保留余数(-999~999) MoveBy(moveX, 0, 0); } // Y轴移动(同上) if (Speed.y != 0) { int totalY = Speed.y * IntegerDelta + Remainder.y; int moveY = totalY / 1000; Remainder.y = totalY % 1000; MoveBy(0, moveY, 0); } // Z轴重力与移动(含余数补偿) if (Position.z > 0 || Speed.z > 0) { // 重力对速度的影响(先更新Speed.z,含余数) int speedZTotal = -Gravity * IntegerDelta + Remainder.z; // 注意负号(减速) Speed.z += speedZTotal / 1000; // 速度的整数部分 Remainder.z = speedZTotal % 1000; // 速度的余数 // 基于更新后的Speed.z计算移动量(同样含余数) int moveZTotal = Speed.z * IntegerDelta + _zRemainderMove; // 新增_zRemainderMove记录移动余数 int moveZ = moveZTotal / 1000; _zRemainderMove = moveZTotal % 1000; MoveBy(0, 0, moveZ); } else if (Position.z < 0) { Position.z = 0; Speed.z = 0; Remainder.z = 0; // 重置余数 _zRemainderMove = 0; SetPosition(Position); } BaseObject::Update(deltaTime); }