55 lines
11 KiB
C++
55 lines
11 KiB
C++
#include <SDL2/SDL.h>
|
|
|
|
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;
|
|
} |