moving ship

This commit is contained in:
unknown 2025-12-11 15:13:35 +06:00
parent c02273d29d
commit da8946e9ef
2 changed files with 50 additions and 13 deletions

View File

@ -8,7 +8,7 @@ namespace ZL {
int Environment::windowHeaderHeight = 0; int Environment::windowHeaderHeight = 0;
int Environment::width = 0; int Environment::width = 0;
int Environment::height = 0; int Environment::height = 0;
float Environment::zoom = 6.f; float Environment::zoom = 20.f;
bool Environment::leftPressed = false; bool Environment::leftPressed = false;
bool Environment::rightPressed = false; bool Environment::rightPressed = false;

View File

@ -17,6 +17,8 @@ namespace ZL
const char* CONST_ZIP_FILE = ""; const char* CONST_ZIP_FILE = "";
#endif #endif
Matrix3f rotateShipMat = Matrix3f::Identity();
Vector4f generateRandomQuaternion(std::mt19937& gen) Vector4f generateRandomQuaternion(std::mt19937& gen)
{ {
// Ðàñïðåäåëåíèå äëÿ ãåíåðàöèè ñëó÷àéíûõ êîîðäèíàò êâàòåðíèîíà // Ðàñïðåäåëåíèå äëÿ ãåíåðàöèè ñëó÷àéíûõ êîîðäèíàò êâàòåðíèîíà
@ -310,6 +312,9 @@ void Game::drawShip()
renderer.LoadIdentity(); renderer.LoadIdentity();
renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom }); renderer.TranslateMatrix({ 0,0, -1.0f * Environment::zoom });
renderer.RotateMatrix(Environment::inverseShipMatrix);
renderer.RotateMatrix(rotateShipMat);
glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID()); glBindTexture(GL_TEXTURE_2D, spaceshipTexture->getTexID());
@ -364,6 +369,7 @@ void Game::drawBoxes()
renderer.shaderManager.PopShader(); renderer.shaderManager.PopShader();
CheckGlError(); CheckGlError();
} }
void Game::UpdateVolumeKnob() { void Game::UpdateVolumeKnob() {
float musicVolumeBarButtonButtonCenterY = volumeBarMinY + musicVolume * (volumeBarMaxY - volumeBarMinY); float musicVolumeBarButtonButtonCenterY = volumeBarMinY + musicVolume * (volumeBarMaxY - volumeBarMinY);
@ -454,7 +460,7 @@ void Game::drawScene() {
drawShip(); drawShip();
drawBoxes(); drawBoxes();
drawUI(); //drawUI();
CheckGlError(); CheckGlError();
} }
@ -482,6 +488,32 @@ void Game::processTickCount() {
if (abs(diffy) > 5.0 || abs(diffx) > 5.0) //threshold if (abs(diffy) > 5.0 || abs(diffx) > 5.0) //threshold
{ {
float velocity = sqrtf(diffx * diffx + diffy * diffy);
Environment::shipVelocity = velocity * delta / 100;
Vector3f direction = { diffx, 0, -diffy };
Vector3f origin = { 0,0, -1 };
float dir_module = sqrtf(diffx * diffx + diffy * diffy);
float scalar = direction.v[0] * origin.v[0] + direction.v[1] * origin.v[1]+ direction.v[2] * origin.v[2];
float angle = acos(scalar / dir_module);
Vector4f quat = {
0,
1 * sin(angle / 2),
0,
cos(angle / 2)
};
rotateShipMat = QuatToMatrix(quat);
/*
float rotationPower = sqrtf(diffx * diffx + diffy * diffy); float rotationPower = sqrtf(diffx * diffx + diffy * diffy);
//std::cout << rotationPower << std::endl; //std::cout << rotationPower << std::endl;
@ -502,14 +534,20 @@ void Game::processTickCount() {
Environment::shipMatrix = MultMatrixMatrix(Environment::shipMatrix, rotateMat); Environment::shipMatrix = MultMatrixMatrix(Environment::shipMatrix, rotateMat);
Environment::inverseShipMatrix = InverseMatrix(Environment::shipMatrix); Environment::inverseShipMatrix = InverseMatrix(Environment::shipMatrix);
*/
}
else
{
Environment::shipVelocity = 0;
} }
} }
if (fabs(Environment::shipVelocity) > 0.01f) if (fabs(Environment::shipVelocity) > 0.01f)
{ {
Vector3f velocityDirection = { 0,0, -Environment::shipVelocity*delta / 1000.f }; Vector3f velocityDirection = { 0,0, -Environment::shipVelocity*delta / 1000.f };
Vector3f velocityDirectionAdjusted = MultMatrixVector(Environment::shipMatrix, velocityDirection);
Vector3f velocityDirectionAdjusted = MultMatrixVector(rotateShipMat, velocityDirection);
Environment::shipPosition = Environment::shipPosition + velocityDirectionAdjusted; Environment::shipPosition = Environment::shipPosition + velocityDirectionAdjusted;
} }
@ -546,12 +584,12 @@ void Game::update() {
std::cout << mx << " " << my << '\n'; std::cout << mx << " " << my << '\n';
int uiX = mx; int uiX = mx;
int uiY = Environment::height - my; int uiY = Environment::height - my;
if (uiX >= volumeBarMinX && uiX <= volumeBarMaxX &&
uiY >= volumeBarMinY && uiY <= volumeBarMaxY) { if (false)
isDraggingVolume = true; {
UpdateVolumeFromMouse(mx, my);
} }
else { else
{
Environment::tapDownHold = true; Environment::tapDownHold = true;
// Êîîðäèíàòû íà÷àëüíîãî íàæàòèÿ // Êîîðäèíàòû íà÷àëüíîãî íàæàòèÿ
Environment::tapDownStartPos.v[0] = event.button.x; Environment::tapDownStartPos.v[0] = event.button.x;
@ -561,21 +599,19 @@ void Game::update() {
Environment::tapDownCurrentPos.v[1] = event.button.y; Environment::tapDownCurrentPos.v[1] = event.button.y;
} }
} }
else if (event.type == SDL_MOUSEBUTTONUP) { else if (event.type == SDL_MOUSEBUTTONUP) {
// 2. Îáðàáîòêà îòïóñêàíèÿ êíîïêè ìûøè // 2. Îáðàáîòêà îòïóñêàíèÿ êíîïêè ìûøè
isDraggingVolume = false; isDraggingVolume = false;
Environment::tapDownHold = false; Environment::tapDownHold = false;
Environment::shipVelocity = 0;
} }
else if (event.type == SDL_MOUSEMOTION) { else if (event.type == SDL_MOUSEMOTION) {
// 3. Îáðàáîòêà ïåðåìåùåíèÿ ìûøè // 3. Îáðàáîòêà ïåðåìåùåíèÿ ìûøè
int mx = event.motion.x; int mx = event.motion.x;
int my = event.motion.y; int my = event.motion.y;
if (isDraggingVolume) {
// Äâèãàåì ìûøü ïî ñëàéäåðó — ìåíÿåì ãðîìêîñòü è ïîçèöèþ êðóæêà
UpdateVolumeFromMouse(mx, my);
}
if (Environment::tapDownHold) { if (Environment::tapDownHold) {
// Îáíîâëåíèå òåêóùåé ïîçèöèè, åñëè êíîïêà óäåðæèâàåòñÿ // Îáíîâëåíèå òåêóùåé ïîçèöèè, åñëè êíîïêà óäåðæèâàåòñÿ
Environment::tapDownCurrentPos.v[0] = event.motion.x; Environment::tapDownCurrentPos.v[0] = event.motion.x;
@ -596,6 +632,7 @@ void Game::update() {
} }
else if (event.type == SDL_KEYUP) else if (event.type == SDL_KEYUP)
{ {
if (event.key.keysym.sym == SDLK_i) if (event.key.keysym.sym == SDLK_i)
{ {
Environment::shipVelocity += 1.f; Environment::shipVelocity += 1.f;