Wow, this is hilarious.
This thread should be about drinking coffee too late in the evening but it is not.
1.) I want to reply to a closed thread.
@sleepykraken asked if we could flip the character only if needed.
This was driving me crazy too so I used a simplified if/elseif rather than the new ternary operator he just taught.
//Direction.x <= 0.f ? RightLeft = -1 : RightLeft = 1.f;
if (Direction.x < 0.f) RightLeft = -1;
else if (Direction.x > 0.f) RightLeft = 1;
This is okay, right? I’ll keep that operator there but this seems to have fixed it.
In the event of no input, neither case triggers.
2.) Why is my dude going nuts!?!?
I tried adding dT as we did previously and I think this might be related but I’m not seeing it right now.
int main()
{
bool Collision{}; // initialize collision Game State as false
InitWindow(WindowDimensions[0], WindowDimensions[1], "Top Down Game");
//texture variables
Texture2D Map = LoadTexture("nature_tileset/WorldMap.png");
Vector2 MapPos = {0.0, 0.0};
float PlayerSpeed{250};
Texture2D KnightIdle = LoadTexture("characters/knight_idle_spritesheet.png");
Texture2D KnightRun = LoadTexture("characters/knight_run_spritesheet.png");
Texture2D Knight = LoadTexture("characters/knight_idle_spritesheet.png");
Vector2 KnightPos{
(float)WindowDimensions[0]/2.0f - 4.0f * (0.5f *(float)Knight.width/6.0f),
(float)WindowDimensions[1]/2.0f - 4.0f * (0.5f *(float)Knight.height)
};
// 1: facing right, -1 : facing left
float RightLeft{1.f};
// animation variables
float RunningTime{};
int Frame{};
const int MaxFrames{6};
const int UpdateTime{1/12};
SetTargetFPS(60);
while (!WindowShouldClose())
{
// delta time (time since last frame)
const float dT = GetFrameTime();
BeginDrawing();
ClearBackground(SKYBLUE);
// Draw Map
DrawTextureEx(Map, MapPos, 0, 4.0, WHITE);
// Update Animation
RunningTime += dT;
if (RunningTime >= UpdateTime)
{
Frame++;
RunningTime = 0.f;
if (Frame >= MaxFrames) Frame = 0;
}
// if game has not started
if (!GameStarted)
{
DisplayTitleWaitForInput(); // display title and keys and wait for input
}
// if my player has won
else if (WinGame)
{
//CheckForCheatingDisplayVictory();
//DelayPromptAndResetGame(dT);
//Checkpoint = CheckpointDistance;
}
// if the game is afoot
else if (GameStarted)
{
GameTimer += dT;
// Draw Character
Rectangle Source {Frame * Knight.width/6.f, 0.f, RightLeft * (float)Knight.width/6.f, (float)Knight.height};
Rectangle Dest {KnightPos.x, KnightPos.y, 4.0f * (float)Knight.width/6.0f, 4.0f * (float)Knight.height};
DrawTexturePro(Knight, Source, Dest,Vector2{}, 0.f, WHITE);
// Handle Movement
Vector2 Direction{};
if (IsKeyDown(KEY_A)) Direction.x -= 1.0;
if (IsKeyDown(KEY_D)) Direction.x += 1.0;
if (IsKeyDown(KEY_W)) Direction.y -= 1.0;
if (IsKeyDown(KEY_S)) Direction.y += 1.0;
if (Vector2Length(Direction) != 0.0)
{
// set MapPos = MapPos - Direction
MapPos = Vector2Subtract(MapPos, Vector2Scale(Vector2Normalize(Direction), (PlayerSpeed * dT)));
//Direction.x <= 0.f ? RightLeft = -1 : RightLeft = 1.f;
if (Direction.x < 0.f) RightLeft = -1;
else if (Direction.x > 0.f) RightLeft = 1;
Knight = KnightRun;
}
else
{
Knight = KnightIdle;
}
}
EndDrawing();
}
UnloadTexture(Knight);
UnloadTexture(KnightIdle);
UnloadTexture(KnightRun);
UnloadTexture(Map);
}