#include "../sdlpp/sdlpp.hpp" #include "sprites.hpp" #ifdef _WIN32 #include "../sdlpp/SDL2/SDL2_framerate.h" #include #include #include #else #include #endif // UNIX #include #include "global_vars.hpp" #include "objectids.hpp" #include "blocks.hpp" #include "maploader.hpp" #include "mario_visitor.hpp" #define SIDE_MOVEMENT 0.8 #define FALL_MOVEMENT 1 bool quit = false; std::shared_ptr mario = nullptr; std::shared_ptr mario_texture = nullptr; void setMarioStanding() { if(mario->getMovement().getX() == 0) { mario->pauseAnimation(); // mario->setTexture(mario_texture, MARIO_STANDING_SRC); } } void handleKeyDown( SDL_Keycode key, SDLPP::Scene &scene ) { switch ( key ) { case SDLK_ESCAPE: quit = true; break; case SDLK_a: mario->resumeAnimation(); mario->addMovement( -SIDE_MOVEMENT, 0 ); break; case SDLK_d: mario->resumeAnimation(); mario->addMovement( SIDE_MOVEMENT, 0 ); break; case SDLK_SPACE: case SDLK_w: break; case SDLK_s: break; case SDLK_r: scene.getRenderer().setRenderColiders( !scene.getRenderer().getRenderColiders() ); default: break; } } void handleKeyUp( SDL_Keycode key ) { switch ( key ) { case SDLK_a: mario->resumeAnimation(); mario->addMovement( SIDE_MOVEMENT, 0 ); break; case SDLK_d: mario->resumeAnimation(); mario->addMovement( -SIDE_MOVEMENT, 0 ); break; case SDLK_w: case SDLK_s: default: break; } } void pollEvents( SDLPP::Scene &scene ) { SDL_Event event; while ( SDLPP::getSDLEvent( event ) ) { switch ( event.type ) { case SDL_QUIT: quit = true; break; case SDL_KEYDOWN: if ( !event.key.repeat ) handleKeyDown( event.key.keysym.sym, scene ); break; case SDL_KEYUP: handleKeyUp( event.key.keysym.sym ); break; case SDL_WINDOWEVENT: if ( event.window.event == SDL_WINDOWEVENT_RESIZED ) scene.updateSizeAndPosition(); default: break; } } } void doInput( std::shared_ptr< SDLPP::Scene > scene ) { FPSmanager gFPS; SDL_initFramerate( &gFPS ); SDL_setFramerate( &gFPS, 200 ); while ( true ) { SDL_framerateDelay( &gFPS ); pollEvents( *scene ); scene->updateScene(); MarioVisitor mv{}; scene->visitCollisions(*mario, mv); if(mv.isDead()) { quit = true; } if(!mv.isOnGround()) { mario->setMovement(mario->getMovement().getX(), FALL_MOVEMENT); } else { mario->resetMovementY(); } auto playerX = mario->getRect().x; auto width = scene->getWidth(); auto rightBarrier = width * 0.7; auto leftBarrier = width * 0.3; auto rightmostX = scene->rightmost()->getRect().x + scene->rightmost()->getRect().w; auto leftmostX = scene->leftmost()->getRect().x; scene->moveEverything( ( playerX > rightBarrier && rightmostX > width ) * ( rightBarrier - playerX ) / width, 0 ); scene->moveEverything( ( playerX < leftBarrier && leftmostX < 0 ) * ( leftBarrier - playerX ) / width, 0 ); } } #ifdef _WIN32 int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR szCmdLine, int nCmdShow ) { #else int main() { #endif SDLPP::init(); SDLPP::Window w( "Mario clone!" ); w.setResizable( true ); auto renderer = std::make_shared< SDLPP::Renderer >( w ); renderer->setBlendMode( SDL_BLENDMODE_BLEND ); // prepare global vars g_terrain_texture = std::make_shared(renderer, "sprites/terrain.png", MARIO_OVERWORLD_COLORKEY); auto scene = std::make_shared(renderer); auto bg = std::make_shared(0,0,10,10,renderer, MARIO_OVERWORLD_COLORKEY, true); bg->setPermanent(); bg->setId(1); scene->addObject(bg); mario_texture = std::make_shared(renderer, "sprites/mario.png", MARIO_OVERWORLD_COLORKEY); mario = std::make_shared( 0, 0, BLOCK_SIZE, BLOCK_SIZE, renderer, mario_texture, MARIO_OVERWORLD_STANDING_SRC); mario->setAnimationFrames( MARIO_OVERWORLD_WALK_ANIM ); mario->setId(2); mario->centerX(); mario->setAnimationSpeed(12.5); mario->pauseAnimation(); // mario->setTexture(mario_texture, MARIO_STANDING_SRC); mario->setMovement(0, FALL_MOVEMENT); mario->setMovementSpeed(0.4); mario->addCollision(SDLPP::RectColider(0.11,0,0.8,1)); scene->addObject(mario); auto defeat = std::make_shared( 0,1.01,0,0,renderer); defeat->setId(DEATH_ID); defeat->centerX(); defeat->setStatic(); auto defeatCol = SDLPP::RectColider(-1, 0, -1, -1); defeatCol.setInfinite(); defeat->addCollision(defeatCol); scene->addObject(defeat); loadMap(scene, mario, "testmap.txt", renderer); FPSmanager gFPS; SDL_initFramerate( &gFPS ); SDL_setFramerate( &gFPS, 60 ); auto base = SDL_GetTicks(); int frames = 0; std::thread inputThread( doInput, scene ); inputThread.detach(); while ( !quit ) { SDL_PumpEvents(); SDL_framerateDelay(&gFPS); setMarioStanding(); scene->renderScene(); renderer->presentRenderer(); frames++; if ( SDL_GetTicks() - base >= 1000 ) { std::cout << "FPS: " << frames << std::endl; frames = 0; base = SDL_GetTicks(); } } return 0; }