C++ 如何保持炮塔与油箱在同一轴上旋转?(2D坦克指挥官游戏)
C++ How can I keep the turret rotating on the same axis as the tank? (2D tank commander game)
所以这是我遇到问题的程序部分的代码。我的目标是让炮塔旋转,但我需要它在坦克的轴上旋转它,这样它的运动看起来有点自然。我不知道该怎么做,我尝试过的一切都不起作用,所以我只需要知道从这里开始。并且给出了 computeGradient 函数,所以我必须使用它来弄清楚如何更改炮塔的 x 和 y 位置。任何帮助将不胜感激。
#include <fstream>
#include <iostream>
#include <string>
#include "engine.h"
#include "constants.h"
using namespace std;
void initTankState(float& tankX, float& tankY, float& turretX, float& turretY, int& tankAngle, int& turretAngle){
tankX = SCREEN_WIDTH/2;
tankY = SCREEN_HEIGHT*.75;
turretX = tankX;
turretY = tankY;
tankAngle = 0;
turretAngle = 0;
}
void loadInfantryData(string path, int& numInfantry, float*& infantryPosX, float*& infantryPosY, int*& infantryAngle){
fstream fin;
fin.open(path, ios::in);
fin>>numInfantry;
for (int i = 0; i<numInfantry; i++)
{
fin>>infantryPosX[i]>>infantryPosY[i]>>infantryAngle[i];
}
}
void changeGameState(string command, float& tankX, float& tankY, float& turretX, float& turretY, int & tankAngle, int & turretAngle, int numInfantry, float* infantryPosX, float* infantryPosY, int* infantryAngle){
float x;
float y;
computeGradient(x, y, tankAngle);
/*if (command == "up")
moveForward(tankX, tankY, tankAngle);
else if (command =="down")
moveBackward(tankX, tankY, tankAngle);
else*/ if (command == "left")
turnLeft(tankX, tankY, tankAngle);
else if (command == "right")
turnRight(tankX, tankY, tankAngle);
else if (command == "pleft")
{
panLeft(turretAngle);
turretX = x;
turretY = y;
}
else if (command == "pright")
{
panRight(turretAngle);
turretX = x;
turretY = y;
}
}
void updateTurret(float, float, float&, float&, int, int)
{
}
void panLeft(int &turretAngle) //here
{
turretAngle++;
if (turretAngle <0)
turretAngle = TANK_NUM_SPRITES-1;
if (turretAngle >TANK_NUM_SPRITES-1)
turretAngle = 0;
}
void panRight(int &turretAngle) //and here are where I've run into a block
{
turretAngle--;
if (turretAngle >TANK_NUM_SPRITES-1)
turretAngle = 0;
if (turretAngle <0)
turretAngle = TANK_NUM_SPRITES-1;
}
void moveForward(float &, float &, int &, float)
{
}
void moveBackward(float &, float &, int &, float)
{
}
void turnLeft(float &tankX, float &tankY, int &tankAngle)
{
tankAngle++;
if (tankAngle <0)
tankAngle = TANK_NUM_SPRITES-1;
if (tankAngle >TANK_NUM_SPRITES-1)
tankAngle = 0;
}
void turnRight(float &tankX, float &tankY, int &tankAngle)
{
tankAngle--;
if (tankAngle <0)
tankAngle = TANK_NUM_SPRITES-1;
if (tankAngle >TANK_NUM_SPRITES-1)
tankAngle = 0;
}
void noAction(float &, float &, int &)
{
}
//Trigonometric Calculation
void computeGradient(float & dx, float & dy, int tankAngle){
int tmpAngle = ( (TANK_NUM_SPRITES-tankAngle))%TANK_NUM_SPRITES;
float radianAngle=(2*PI)*(float(tmpAngle)/TANK_NUM_SPRITES)-(PI/2.0);
dx = cos(radianAngle);
dy = sin(radianAngle);
}
我不建议使用/信任您不理解的函数,除非您绝对必须这样做。我建议学习 computeGradients 背后的数学知识,这在网上很容易找到。我的线性代数有点生疏,所以我对三角没有太多帮助。我认为它归结为跟踪坦克的位置、方向和右向量,以及水平和垂直角度。数学原理与此处描述的类似。
根据我所记得的,您必须将坦克转换为世界空间的原点,应用线性变换矩阵(在本例中为旋转),然后将其转换回其位置(我不知道 computeGradients 是否隐式地这样做)。这是基于我对OpenGL中的模型矩阵如何工作的有限了解。
无论如何,我希望我所说的任何内容都有帮助。
相关文章:
- 四边形的 2D 旋转
- 简化代码以避免在顺时针旋转2D矩阵时出现TLE
- 2D旋转问题C Directx
- 为什么我的 2D 阵列不旋转?
- 优化2D旋转
- 顺时针旋转2D阵列
- 无法使用 opengl 正确旋转 2D 对象
- 在C 中旋转矩阵(2D阵列)45度
- 2D 旋转打开
- 将2D转换的1D阵列顺时针旋转90度
- OpenGL - 2D敌人不旋转面对玩家
- C++ 2D 如何在宇宙飞船上"stick"排气精灵并允许其相应地旋转?
- C++ 如何保持炮塔与油箱在同一轴上旋转?(2D坦克指挥官游戏)
- 使用旋转矩阵旋转纹理2d
- 旋转 2D 正方形
- 旋转长方体2d中的关节
- 是否有一个c++源/lib来解决2D Bin Packing使用矩形Bin(而不是正方形)和旋转
- 如何围绕任意点旋转一组2D形状
- 我们如何在openGL中相对于一个点(而不是原点)旋转2d中的图形
- GLSL 2D旋转矩阵不像预期的那样工作