I want my player to stop slowly moving after user stops pressing key. But I have failed to achieve this and I need help.
Here’s my code:
TextureManager.cpp: -----------------------------------------------------------------------------------------------------------
#include <SDL.h>
#include <SDL_image.h>
#include "Game.h"
#include "TextureManager.h"
void TextureManager::drawTexture(const char* path, int x, int y) {
SDL_Texture* texture = nullptr;
texture = IMG_LoadTexture(gRenderer, path);
sprite = texture;
SDL_Rect src, dest;
src.x = 0;
src.y = 0;
src.w = 24;
src.h = 24;
dest.x = x;
dest.x += x_shift; // horizontal motion
dest.y = y;
dest.w = src.w * 4;
dest.h = src.h * 4;
SDL_RenderCopy(gRenderer, sprite, &src, &dest);
}
void TextureManager::drawRect(int x, int y, int w, int h) {
SDL_Rect rect;
rect.x = x;
rect.y = y;
rect.w = w;
rect.h = h;
SDL_SetRenderDrawColor(gRenderer, 205, 150, 0, 1);
SDL_RenderDrawRect(gRenderer, &rect);
SDL_RenderFillRect(gRenderer, &rect);
}
void TextureManager::Update() {
x_shift += speed * accel;
}
Game.cpp: -------------------------------------------------------------------------------------------------------------------------
#include "Game.h"
#include "TextureManager.h"
#include <iostream>
using namespace std;
SDL_Renderer* gRenderer = nullptr; // ~ this is a definition
TextureManager* manager = nullptr;
const int speed = 4;
int accel = 0;
int x_shift = 0;
void Game::init(const char* title, int xpos, int ypos, int width, int height, int flags) {
if (SDL_Init(SDL_INIT_EVERYTHING) == 0) {
mWindow = SDL_CreateWindow(title, xpos, ypos, width, height, flags);
if (mWindow != NULL) {
gRenderer = SDL_CreateRenderer(mWindow, -1, 0);
isRunning = true;
}
}
manager = new TextureManager();
}
void Game::handleEvents() {
SDL_Event event; // SDL_Event class can only ever have one object
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
isRunning = false;
break;
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_d:
accel++;
}
case SDL_KEYUP:
switch (event.key.keysym.sym) {
case SDLK_d:
while (accel > 0) {
accel--;
}
}
}
}
}
void Game::update() {
manager->Update();
}
void Game::render() {
SDL_RenderClear(gRenderer);
// --------------------------
manager->drawTexture("assets/doux/doux_00.png", 100, 100);
manager->drawRect(250, 250, 300, 50);
manager->drawTexture("assets/tard/tard_00.png", 10, 10);
// --------------------------
SDL_SetRenderDrawColor(gRenderer, 64, 64, 64, 1);
SDL_RenderPresent(gRenderer);
}
void Game::clean() {
SDL_DestroyWindow(mWindow);
SDL_DestroyRenderer(gRenderer);
SDL_Quit();
}
Thank you for your attention!