177 lines
3.6 KiB
C
177 lines
3.6 KiB
C
#include <stdio.h>
|
|
#include <SDL2/SDL.h>
|
|
|
|
#define LCR_SETTING_LOG_LEVEL 2
|
|
|
|
#include "game.h"
|
|
#include "debug.h"
|
|
|
|
SDL_Window *window;
|
|
SDL_Renderer *renderer;
|
|
SDL_Texture *texture;
|
|
SDL_Surface *screenSurface;
|
|
uint16_t screen[LCR_SETTING_RESOLUTION_X * LCR_SETTING_RESOLUTION_Y];
|
|
|
|
FILE *musicFile = 0;
|
|
|
|
void audioFillCallback(void *userdata, uint8_t *s, int l)
|
|
{
|
|
for (int i = 0; i < l; ++i)
|
|
{
|
|
unsigned char byte = 128;
|
|
|
|
if (musicFile)
|
|
{
|
|
if (!fread(&byte,1,1,musicFile))
|
|
rewind(musicFile);
|
|
}
|
|
|
|
s[i] = byte;
|
|
}
|
|
}
|
|
|
|
const uint8_t *keyboardState;
|
|
|
|
uint8_t LCR_keyPressed(uint8_t key)
|
|
{
|
|
switch (key)
|
|
{
|
|
case LCR_KEY_UP: return
|
|
keyboardState[SDL_SCANCODE_W] | keyboardState[SDL_SCANCODE_UP]; break;
|
|
|
|
case LCR_KEY_RIGHT: return
|
|
keyboardState[SDL_SCANCODE_D] | keyboardState[SDL_SCANCODE_RIGHT]; break;
|
|
|
|
case LCR_KEY_DOWN: return
|
|
keyboardState[SDL_SCANCODE_S] | keyboardState[SDL_SCANCODE_DOWN]; break;
|
|
|
|
case LCR_KEY_LEFT: return
|
|
keyboardState[SDL_SCANCODE_A] | keyboardState[SDL_SCANCODE_LEFT]; break;
|
|
|
|
case LCR_KEY_A: return
|
|
keyboardState[SDL_SCANCODE_K] | keyboardState[SDL_SCANCODE_RETURN]; break;
|
|
|
|
case LCR_KEY_B: return
|
|
keyboardState[SDL_SCANCODE_L] | keyboardState[SDL_SCANCODE_ESCAPE]; break;
|
|
|
|
default: break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void LCR_sleep(uint16_t timeMs)
|
|
{
|
|
usleep(timeMs * 1000);
|
|
}
|
|
|
|
void LCR_drawPixel(unsigned long index, uint16_t color)
|
|
{
|
|
screen[index] = color;
|
|
}
|
|
|
|
void LCR_log(const char *str)
|
|
{
|
|
printf("LOG: %s\n",str);
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
uint8_t running = 1;
|
|
|
|
LCR_log("initializing game");
|
|
LCR_gameInit();
|
|
|
|
LCR_log("initializing SDL");
|
|
SDL_Init(SDL_INIT_AUDIO);
|
|
|
|
LCR_log("initializing audio");
|
|
SDL_AudioSpec audioSpec;
|
|
SDL_memset(&audioSpec, 0, sizeof(audioSpec));
|
|
audioSpec.callback = audioFillCallback;
|
|
audioSpec.freq = 8000;
|
|
audioSpec.format = AUDIO_U8;
|
|
audioSpec.channels = 1;
|
|
audioSpec.samples = 256;
|
|
|
|
if (SDL_OpenAudio(&audioSpec,NULL) < 0)
|
|
fputs("could not initialize audio",stderr);
|
|
|
|
SDL_PauseAudio(0);
|
|
|
|
musicFile = fopen("assets/music","rb");
|
|
|
|
if (!musicFile)
|
|
fputs("could not open music file",stderr);
|
|
|
|
window =
|
|
SDL_CreateWindow("Licar", SDL_WINDOWPOS_UNDEFINED,
|
|
SDL_WINDOWPOS_UNDEFINED, LCR_SETTING_RESOLUTION_X, LCR_SETTING_RESOLUTION_Y,
|
|
SDL_WINDOW_SHOWN);
|
|
|
|
if (!window)
|
|
{
|
|
fputs("ERROR: couldn't create window",stderr);
|
|
return 1;
|
|
}
|
|
|
|
renderer = SDL_CreateRenderer(window,-1,0);
|
|
|
|
if (!renderer)
|
|
{
|
|
fputs("ERROR: couldn't create renderer",stderr);
|
|
return 1;
|
|
}
|
|
|
|
texture =
|
|
SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGB565,SDL_TEXTUREACCESS_STATIC,
|
|
LCR_SETTING_RESOLUTION_X,LCR_SETTING_RESOLUTION_Y);
|
|
|
|
if (!texture)
|
|
{
|
|
fputs("ERROR: couldn't create texture",stderr);
|
|
return 1;
|
|
}
|
|
|
|
screenSurface = SDL_GetWindowSurface(window);
|
|
|
|
SDL_ShowCursor(0);
|
|
|
|
SDL_PumpEvents();
|
|
keyboardState = SDL_GetKeyboardState(NULL);
|
|
|
|
LCR_log("starting game loop");
|
|
|
|
while (running)
|
|
{
|
|
SDL_PumpEvents();
|
|
keyboardState = SDL_GetKeyboardState(NULL);
|
|
running = !keyboardState[SDL_SCANCODE_Q];
|
|
|
|
running &= LCR_gameStep(SDL_GetTicks());
|
|
|
|
SDL_UpdateTexture(texture,NULL,screen,
|
|
LCR_SETTING_RESOLUTION_X * sizeof(uint16_t));
|
|
|
|
SDL_RenderClear(renderer);
|
|
SDL_RenderCopy(renderer,texture,NULL,NULL);
|
|
SDL_RenderPresent(renderer);
|
|
}
|
|
|
|
LCR_log("ending");
|
|
|
|
if (musicFile)
|
|
fclose(musicFile);
|
|
|
|
SDL_PauseAudio(1);
|
|
SDL_CloseAudio();
|
|
|
|
SDL_DestroyTexture(texture);
|
|
SDL_DestroyRenderer(renderer);
|
|
SDL_DestroyWindow(window);
|
|
|
|
LCR_gameEnd();
|
|
|
|
return 0;
|
|
}
|