#include class Pacman { public: SDL_Point pos {104, 184}; Uint8 anim_frame {0}; int orient {-1}; }; SDL_Renderer* sdlRenderer; SDL_Texture* sdlTexture; SDL_Event sdlEvent; bool should_exit = false; Uint8 bmp[576] { 0x42, 0x4D, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xE0, 0x0F, 0xE7, 0xCF, 0xC0, 0x7F, 0xFF, 0xFF, 0xC0, 0x07, 0xC7, 0xC7, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xC3, 0x87, 0x81, 0xFF, 0x9F, 0xF3, 0x80, 0x1F, 0x83, 0x83, 0x83, 0xFF, 0x8F, 0xE3, 0x80, 0xFF, 0x83, 0x83, 0x87, 0xFF, 0x87, 0xC3, 0x87, 0xFF, 0x81, 0x03, 0x83, 0xFF, 0x83, 0x83, 0x80, 0xFF, 0x81, 0x03, 0x81, 0xFF, 0x81, 0x03, 0x80, 0x1F, 0x80, 0x03, 0xC0, 0xFF, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x7F, 0xC0, 0x07, 0xC0, 0x07, 0xC0, 0x07, 0xE0, 0x3F, 0xE0, 0x0F, 0xE0, 0x0F, 0xE0, 0x0F, 0xF8, 0x3F, 0xF8, 0x3F, 0xF8, 0x3F, 0xF8, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x73, 0xB9, 0x9D, 0xFF, 0xFF, 0xE7, 0xFF, 0x84, 0x21, 0x91, 0x89, 0xF8, 0x3F, 0xC3, 0xFF, 0x80, 0x01, 0x80, 0x01, 0xE0, 0x0F, 0xC3, 0xFF, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x07, 0xC3, 0xD9, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x07, 0xE7, 0xE6, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0xFF, 0xFF, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x6F, 0xF6, 0xFF, 0xFF, 0x80, 0x01, 0x80, 0x03, 0x6F, 0xF6, 0xFF, 0xFF, 0xC0, 0x03, 0x80, 0x03, 0x6F, 0xF6, 0xFF, 0xFF, 0xC0, 0x03, 0x80, 0x03, 0x77, 0xEE, 0xFF, 0xFF, 0xC0, 0x03, 0xC0, 0x07, 0x78, 0x1E, 0xFF, 0xFF, 0xE0, 0x07, 0xC0, 0x07, 0x7F, 0xFE, 0xFF, 0xFF, 0xF0, 0x0F, 0xE0, 0x0F, 0x7F, 0xFE, 0xFF, 0xFF, 0xFC, 0x3F, 0xF8, 0x3F, 0x7F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0x7F, 0xFE, 0xF7, 0xFE, 0x7F, 0xEF, 0xFF, 0xFF, 0x7F, 0xFE, 0xF7, 0xFE, 0x7F, 0xEF, 0xFF, 0xFF, 0x7F, 0xFE, 0xF0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x78, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0x77, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xEF, 0x6F, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xEF, 0x6F, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x6F, 0x6F, 0xF6, 0xFF, 0xF7, 0xEF, 0xF0, 0x00, 0xFF, 0xFF, 0x0F, 0xFF, 0xF7, 0xEF, 0xCF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0xF7, 0xEF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFF, 0xEF, 0xF7, 0xB8, 0x00, 0xF8, 0x1F, 0x1D, 0x3F, 0x1F, 0xF8, 0x77, 0xFF, 0xF7, 0xEF, 0xEE, 0xDF, 0xFF, 0xFF, 0x6F, 0xFF, 0xEF, 0xF7, 0xF6, 0xEF, 0xFF, 0xFF, 0x6F, 0xFF, 0xEF, 0xF7, 0xF6, 0xEF, 0xFF, 0xFF, 0x6F, 0xFF, 0xEF, 0xF7, 0xF6, 0xF7, 0xEF, 0xF6, 0xF7, 0xFF, 0xEF, 0xFF, 0xFF, 0xF7, 0xEF, 0xF6, 0xF7, 0xFF, 0xEF, 0xFF, 0xFF, 0xF7, 0xEF, 0xF6, 0xFB, 0xFF, 0xDF, 0xFF, 0xFF, 0xF7, 0xEF, 0xF6, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xF7, 0xEF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xF7, 0xEF, 0xF6, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xF7, 0xEF, 0xF6, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xF7, 0xEF, 0xF6, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xC3, 0x6F, 0xFF, 0xF7, 0xEF, 0xF6, 0x6F, 0xFF, 0x81, 0x6F, 0xFF, 0xF7, 0xEF, 0xF6, 0x6F, 0xFF, 0x00, 0x6F, 0xFF, 0xF7, 0xEF, 0xF6, 0x6F, 0xE7, 0x00, 0x77, 0xFF, 0xEF, 0xF7, 0xEE, 0x6F, 0xE7, 0x00, 0xB8, 0x00, 0x1F, 0xF8, 0x1D, 0x6F, 0xFF, 0x00, 0xBF, 0xFF, 0xFF, 0xFF, 0xFD, 0x6F, 0xFF, 0x81, 0xCF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xFF, 0xC3, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x6F, 0x00, 0x00 }; Uint8 map[868] { 0x41, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x43, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x45, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x49, 0x46, 0x3F, 0x4A, 0x4B, 0x4B, 0x4C, 0x3F, 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x3F, 0x47, 0x48, 0x3F, 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x3F, 0x4A, 0x4B, 0x4B, 0x4C, 0x3F, 0x49, 0x46, 0x40, 0x47, 0x3E, 0x3E, 0x48, 0x3F, 0x47, 0x3E, 0x3E, 0x3E, 0x48, 0x3F, 0x47, 0x48, 0x3F, 0x47, 0x3E, 0x3E, 0x3E, 0x48, 0x3F, 0x47, 0x3E, 0x3E, 0x48, 0x40, 0x49, 0x46, 0x3F, 0x4D, 0x4E, 0x4E, 0x4F, 0x3F, 0x4D, 0x4E, 0x4E, 0x4E, 0x4F, 0x3F, 0x4D, 0x4F, 0x3F, 0x4D, 0x4E, 0x4E, 0x4E, 0x4F, 0x3F, 0x4D, 0x4E, 0x4E, 0x4F, 0x3F, 0x49, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x49, 0x46, 0x3F, 0x4A, 0x4B, 0x4B, 0x4C, 0x3F, 0x4A, 0x4C, 0x3F, 0x4A, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x3F, 0x4A, 0x4C, 0x3F, 0x4A, 0x4B, 0x4B, 0x4C, 0x3F, 0x49, 0x46, 0x3F, 0x4D, 0x4E, 0x4E, 0x4F, 0x3F, 0x47, 0x48, 0x3F, 0x4D, 0x4E, 0x4E, 0x50, 0x51, 0x4E, 0x4E, 0x4F, 0x3F, 0x47, 0x48, 0x3F, 0x4D, 0x4E, 0x4E, 0x4F, 0x3F, 0x49, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x49, 0x52, 0x53, 0x53, 0x53, 0x53, 0x4C, 0x3F, 0x47, 0x54, 0x4B, 0x4B, 0x4C, 0x3F, 0x47, 0x48, 0x3F, 0x4A, 0x4B, 0x4B, 0x55, 0x48, 0x3F, 0x4A, 0x53, 0x53, 0x53, 0x53, 0x56, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3F, 0x47, 0x51, 0x4E, 0x4E, 0x4F, 0x3E, 0x4D, 0x4F, 0x3E, 0x4D, 0x4E, 0x4E, 0x50, 0x48, 0x3F, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3F, 0x47, 0x48, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x47, 0x48, 0x3F, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3F, 0x47, 0x48, 0x3E, 0x57, 0x53, 0x58, 0x3E, 0x3E, 0x59, 0x53, 0x5A, 0x3E, 0x47, 0x48, 0x3F, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x4F, 0x3F, 0x4D, 0x4F, 0x3E, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3E, 0x4D, 0x4F, 0x3F, 0x4D, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3F, 0x3E, 0x3E, 0x3E, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3E, 0x3E, 0x3E, 0x3F, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x53, 0x53, 0x53, 0x53, 0x53, 0x4C, 0x3F, 0x4A, 0x4C, 0x3E, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3E, 0x4A, 0x4C, 0x3F, 0x4A, 0x53, 0x53, 0x53, 0x53, 0x53, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3F, 0x47, 0x48, 0x3E, 0x5B, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x5C, 0x3E, 0x47, 0x48, 0x3F, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3F, 0x47, 0x48, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x47, 0x48, 0x3F, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x46, 0x3F, 0x47, 0x48, 0x3E, 0x4A, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x3E, 0x47, 0x48, 0x3F, 0x49, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x41, 0x42, 0x42, 0x42, 0x42, 0x4F, 0x3F, 0x4D, 0x4F, 0x3E, 0x4D, 0x4E, 0x4E, 0x50, 0x51, 0x4E, 0x4E, 0x4F, 0x3E, 0x4D, 0x4F, 0x3F, 0x4D, 0x42, 0x42, 0x42, 0x42, 0x45, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x49, 0x46, 0x3F, 0x4A, 0x4B, 0x4B, 0x4C, 0x3F, 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x3F, 0x47, 0x48, 0x3F, 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x3F, 0x4A, 0x4B, 0x4B, 0x4C, 0x3F, 0x49, 0x46, 0x3F, 0x4D, 0x4E, 0x50, 0x48, 0x3F, 0x4D, 0x4E, 0x4E, 0x4E, 0x4F, 0x3F, 0x4D, 0x4F, 0x3F, 0x4D, 0x4E, 0x4E, 0x4E, 0x4F, 0x3F, 0x47, 0x51, 0x4E, 0x4F, 0x3F, 0x49, 0x46, 0x40, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3E, 0x3E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x40, 0x49, 0x5D, 0x4B, 0x4C, 0x3F, 0x47, 0x48, 0x3F, 0x4A, 0x4C, 0x3F, 0x4A, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x3F, 0x4A, 0x4C, 0x3F, 0x47, 0x48, 0x3F, 0x4A, 0x4B, 0x5E, 0x5F, 0x4E, 0x4F, 0x3F, 0x4D, 0x4F, 0x3F, 0x47, 0x48, 0x3F, 0x4D, 0x4E, 0x4E, 0x50, 0x51, 0x4E, 0x4E, 0x4F, 0x3F, 0x47, 0x48, 0x3F, 0x4D, 0x4F, 0x3F, 0x4D, 0x4E, 0x60, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x47, 0x48, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x49, 0x46, 0x3F, 0x4A, 0x4B, 0x4B, 0x4B, 0x4B, 0x55, 0x54, 0x4B, 0x4B, 0x4C, 0x3F, 0x47, 0x48, 0x3F, 0x4A, 0x4B, 0x4B, 0x55, 0x54, 0x4B, 0x4B, 0x4B, 0x4B, 0x4C, 0x3F, 0x49, 0x46, 0x3F, 0x4D, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4F, 0x3F, 0x4D, 0x4F, 0x3F, 0x4D, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4F, 0x3F, 0x49, 0x46, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x49, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x56 }; Uint8 pac_anims[2][4] { {11, 14, 12, 14}, {11, 15, 13, 15} }; int8_t delta[4] = {1,-1,28,-28}; int8_t dd[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; Pacman pacman; int main(int argc, char* argv[]) { SDL_Init(SDL_INIT_EVERYTHING); SDL_Window* sdlWindow = SDL_CreateWindow("PACMAN", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 448, 576, SDL_WINDOW_SHOWN); sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_PRESENTVSYNC); SDL_RenderSetLogicalSize(sdlRenderer, 224, 288); sdlTexture = SDL_CreateTextureFromSurface(sdlRenderer, SDL_LoadBMP_RW(SDL_RWFromMem(bmp, 576), 1)); uint8_t key = 0; while(!should_exit) { while(SDL_PollEvent(&sdlEvent)) { if (sdlEvent.type == SDL_QUIT) { should_exit = true; break; } if (sdlEvent.type == SDL_KEYDOWN) { key = sdlEvent.key.keysym.scancode; } } int want_orient = -1; const int pp = (pacman.pos.x>>3) + (pacman.pos.y>>3)*28; if (key >= SDL_SCANCODE_RIGHT && key <= SDL_SCANCODE_UP) want_orient = key-79; if (pacman.orient != -1) pacman.anim_frame=(pacman.anim_frame+1)&0x7; if (pacman.anim_frame == 0) { if ((want_orient!=-1) && (map[pp+delta[want_orient]] < 65)) pacman.orient = want_orient; else if (map[pp+delta[pacman.orient]] >= 65) pacman.orient = -1; } if (pacman.orient!=-1) { pacman.pos.x+=dd[pacman.orient][0]; pacman.pos.y+=dd[pacman.orient][1]; } map[pp] = 62; int x=0, y=24; for (int i=0; i<868; i++) { if (map[i] > 62) { SDL_Rect src { 8*((map[i]-63)%8), 8*((map[i]-63)/8), 8, 8 }, dst { x, y, 8, 8 }; if (map[i]>64) { SDL_SetTextureColorMod(sdlTexture, 33, 33, 222); } else { SDL_SetTextureColorMod(sdlTexture, 255, 184, 151); } SDL_RenderCopy(sdlRenderer, sdlTexture, &src, &dst); } x+=8; if (x==224) { x=0; y+=8; } } int orient = pacman.orient == -1 ? 0 : pacman.orient; SDL_Rect src { 16*(pac_anims[orient>>1][pacman.anim_frame/2]%4), 16*(pac_anims[orient>>1][pacman.anim_frame/2]/4), 16, 16 }, dst { pacman.pos.x-4, pacman.pos.y+20, 16, 16 }; SDL_SetTextureColorMod(sdlTexture, 255, 255, 0); SDL_RenderCopyEx(sdlRenderer, sdlTexture, &src, &dst, 0, NULL, pacman.orient == 1 ? SDL_FLIP_HORIZONTAL : pacman.orient == 3 ? SDL_FLIP_VERTICAL : SDL_FLIP_NONE ); SDL_RenderPresent(sdlRenderer); } SDL_Quit(); return 0; }