too much fixes
This commit is contained in:
+31
-27
@@ -146,7 +146,7 @@ void Engine::Initiate()
|
||||
testcharacter->name = "character";
|
||||
testcharacter->castshadow = true;
|
||||
testcharacter->body->t.ScaleBy({ 0.5f, 1.8f, 0.5f });
|
||||
testcharacter->body->t.TranslateTo({ 0.0f, 0.9f, 0.0f });
|
||||
testcharacter->body->t.TranslateTo({ 0.0f, 10.0f, 0.0f });
|
||||
testcharacter->body->SetRig(testrig);
|
||||
|
||||
// Base animator (weight 0) � walk, looped
|
||||
@@ -208,7 +208,7 @@ void Engine::Initiate()
|
||||
if (lan && lan->IsActive()) {
|
||||
std::mt19937 rng(std::random_device{}());
|
||||
std::uniform_real_distribution<float> spread(-8.0f, 8.0f);
|
||||
testcharacter->body->t.TranslateTo({ spread(rng), 0.9f, spread(rng) });
|
||||
testcharacter->body->t.TranslateTo({ spread(rng), 10.0f, spread(rng) });
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
@@ -328,16 +328,6 @@ void Engine::Initiate()
|
||||
grappleText->t2d.size = { 0.0f, 0.0f, 560.0f, 40.0f };
|
||||
grappleText->BindToRenderSystem();
|
||||
|
||||
ImageBox* testgui = new ImageBox();
|
||||
testgui->tex = magic;
|
||||
testgui->Color = { 1.0f, 1.0f, 1.0f };
|
||||
testgui->Opacity = 0.8f;
|
||||
testgui->rounding = 0.1f;
|
||||
testgui->t2d.center = { 0.0f, 1.0f };
|
||||
testgui->t2d.position = { 0.0f, 1.0f, 10.0f, -10.0f };
|
||||
testgui->t2d.size = { 0.0f, 0.0f, 744.0f / 2.0f, 914.0f / 2.0f };
|
||||
testgui->BindToRenderSystem();
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// World meshes
|
||||
// ------------------------------------------------------------------------
|
||||
@@ -447,22 +437,24 @@ void Engine::Initiate()
|
||||
// body = 50 damage (two shots). Respawns the target when it dies.
|
||||
// Movement tuning
|
||||
const float airControl = 0.5f; // fraction of ground acceleration available in the air
|
||||
const float grappleRange = 8.0f; // metres from the player
|
||||
const float grappleRange = 12.0f; // metres from the player
|
||||
const float grappleSpeed = 28.0f; // launch speed toward the hit point
|
||||
const float grappleCooldownTime = 2.5f; // seconds
|
||||
float grappleCooldown = 0.0f;
|
||||
|
||||
// Slide (key Left Ctrl): locked direction, committed for slideDuration, speed eases from
|
||||
// slideBoost x ground top speed down to 1x by slideFalloffTime.
|
||||
const float slideBoost = 2.0f;
|
||||
const float slideDuration = 1.2f;
|
||||
const float slideFalloffTime = 1.05f;
|
||||
const float slideBoost = 1.5f;
|
||||
const float slideDuration = 0.8f;
|
||||
const float slideFalloffTime = 0.7f;
|
||||
const float slideDropY = 0.65f; // standing centre height (0.9) minus lying (0.25)
|
||||
const float standEyeOffset = 0.7f; // eyes 0.7 above body centre (body centre 0.9, height 1.8)
|
||||
const float slideEyeOffset = 0.25f; // lying down, eyes just above the floor
|
||||
float eyeOffset = standEyeOffset;
|
||||
bool sliding = false;
|
||||
float slideTime = 0.0f;
|
||||
const float slideCooldownTime = 1.0f; // seconds after a slide ends before the next
|
||||
float slideCooldown = 0.0f;
|
||||
glm::vec3 slideDir(0.0f);
|
||||
|
||||
// Shockwave (key Q): projectile that explodes on the first surface it touches. The blast
|
||||
@@ -550,7 +542,7 @@ void Engine::Initiate()
|
||||
|
||||
// Random respawn spot on the floor (NPC and player), kept clear of every map prop
|
||||
std::mt19937 respawnRng(std::random_device{}());
|
||||
const float respawnHeight = 10.0f; // respawn in the air and drop to the floor
|
||||
const float respawnHeight = 15.0f; // respawn in the air and drop to the floor
|
||||
auto RandomSpawn = [&]() -> glm::vec3 {
|
||||
std::uniform_real_distribution<float> spreadX(-37.0f * mapScale, 37.0f * mapScale), spreadZ(-17.0f * mapScale, 17.0f * mapScale);
|
||||
const float margin = 1.5f;
|
||||
@@ -628,11 +620,18 @@ void Engine::Initiate()
|
||||
while (!glfwWindowShouldClose(window->handle))
|
||||
{
|
||||
frame++;
|
||||
const float deltatime = 1.0f / float(fps);
|
||||
// Real frame time (clamped so a hitch can't tunnel through colliders), scaled so the game
|
||||
// plays at the speed it had when it ran one 1/fps step per frame on a 144 Hz display.
|
||||
// refDt is the step the movement constants were tuned at.
|
||||
static double prevFrameTime = glfwGetTime();
|
||||
const double frameNow = glfwGetTime();
|
||||
const float deltatime = glm::clamp(float(frameNow - prevFrameTime), 0.001f, 1.0f / 60.0f) * (144.0f / float(fps));
|
||||
prevFrameTime = frameNow;
|
||||
const float refDt = 1.0f / float(fps);
|
||||
|
||||
const glm::vec3 camFront = camera->t.GetFrontVector();
|
||||
const glm::vec3 camRight = camera->t.GetRightVector();
|
||||
const float walkScale = 0.5f; // WASD speed relative to the original 3.9
|
||||
const float walkScale = 0.6f; // WASD speed relative to the original 3.9
|
||||
const float movespeed = 3.0f * 1.3f * walkScale;
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
@@ -730,12 +729,13 @@ void Engine::Initiate()
|
||||
characterBody->linearvelocity.z += dashDir.z * 18.0f;
|
||||
camera->AddScreenshake(0.04f);
|
||||
}
|
||||
if (buffer.GetCode() == GLFW_KEY_LEFT_CONTROL && buffer.IsPress() && !sliding && IsGrounded()) {
|
||||
if (buffer.GetCode() == GLFW_KEY_LEFT_CONTROL && buffer.IsPress() && !sliding && slideCooldown <= 0.0f && IsGrounded()) {
|
||||
const glm::vec3 horizVel(characterBody->linearvelocity.x, 0.0f, characterBody->linearvelocity.z);
|
||||
if (glm::length(inputVel) > 0.0f || glm::length(horizVel) > 1.0f) {
|
||||
slideDir = glm::length(inputVel) > 0.0f ? glm::normalize(inputVel) : glm::normalize(horizVel);
|
||||
sliding = true;
|
||||
slideTime = 0.0f;
|
||||
slideCooldown = slideDuration + slideCooldownTime;
|
||||
|
||||
// Lie down feet-first: tilt the model's up axis to point back along the slide.
|
||||
// Hitbox is the same box, rotated with it; drop it so the feet stay on the floor.
|
||||
@@ -785,7 +785,7 @@ void Engine::Initiate()
|
||||
}
|
||||
if (buffer.GetCode() == GLFW_KEY_SPACE && buffer.IsPress()) {
|
||||
if (!sliding && IsGrounded())
|
||||
characterBody->linearvelocity.y = 12.0f;
|
||||
characterBody->linearvelocity.y = 11.0f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -797,9 +797,10 @@ void Engine::Initiate()
|
||||
|
||||
// Movement + damping
|
||||
grappleCooldown = std::max(grappleCooldown - deltatime, 0.0f);
|
||||
slideCooldown = std::max(slideCooldown - deltatime, 0.0f);
|
||||
const float accel = 40.0f;
|
||||
const float damp = 0.75f;
|
||||
const float groundTopSpeed = movespeed * accel * deltatime * damp / (1.0f - damp);
|
||||
const float groundTopSpeed = movespeed * accel * refDt * damp / (1.0f - damp);
|
||||
if (sliding) {
|
||||
// Direction is locked; speed eases from boost x down to 1x (quadratic: drops fastest early)
|
||||
slideTime += deltatime;
|
||||
@@ -816,10 +817,13 @@ void Engine::Initiate()
|
||||
}
|
||||
}
|
||||
else if (IsGrounded()) {
|
||||
characterBody->linearvelocity.x *= damp;
|
||||
characterBody->linearvelocity.z *= damp;
|
||||
characterBody->linearvelocity.x += inputVel.x * accel * deltatime;
|
||||
characterBody->linearvelocity.z += inputVel.z * accel * deltatime;
|
||||
// Drag and acceleration rescaled so the top speed is the same at any frame rate
|
||||
const float dampStep = std::pow(damp, deltatime / refDt);
|
||||
const float accelScale = refDt * damp * (1.0f - dampStep) / (deltatime * dampStep * (1.0f - damp));
|
||||
characterBody->linearvelocity.x *= dampStep;
|
||||
characterBody->linearvelocity.z *= dampStep;
|
||||
characterBody->linearvelocity.x += inputVel.x * accel * deltatime * accelScale;
|
||||
characterBody->linearvelocity.z += inputVel.z * accel * deltatime * accelScale;
|
||||
}
|
||||
else if (glm::length(inputVel) > 0.0f) {
|
||||
// Air: no ground drag so momentum (grapple, dash) carries. Input only adds
|
||||
@@ -895,7 +899,7 @@ void Engine::Initiate()
|
||||
);
|
||||
}
|
||||
// First person: camera at the eyes (eased down while sliding)
|
||||
eyeOffset += ((sliding ? slideEyeOffset : standEyeOffset) - eyeOffset) * 0.3f;
|
||||
eyeOffset += ((sliding ? slideEyeOffset : standEyeOffset) - eyeOffset) * (1.0f - std::pow(0.7f, deltatime / refDt));
|
||||
camera->t.TranslateTo(testcharacter->body->t.GetTranslation() + glm::vec3(0.0f, eyeOffset, 0.0f));
|
||||
|
||||
Sound* music = static_cast<Sound*>(mainf->GetFirstChildOfName("music"));
|
||||
|
||||
Reference in New Issue
Block a user