Web support + compilable in mingw
This commit is contained in:
+10
-4
@@ -8,9 +8,15 @@ if(CMAKE_BUILD_TYPE MATCHES DEBUG)
|
|||||||
add_link_options(-fsanitize=address)
|
add_link_options(-fsanitize=address)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(EMSCRIPTEN)
|
||||||
if(MINGW)
|
set(CMAKE_C_FLAGS "-s USE_SDL=2 -s USE_SDL_IMAGE=2 -s USE_SDL_TTF=2 -s USE_SDL_MIXER=2 -s SDL2_IMAGE_FORMATS='[\"png\"]' -s USE_OGG=1 -sALLOW_MEMORY_GROWTH --use-preload-plugins --preload-file assets")
|
||||||
set(CMAKE_C_FLAGS "-Wno-undef --static -windows")
|
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "-O2")
|
||||||
|
set(CMAKE_EXECUTABLE_SUFFIX_C ".html")
|
||||||
|
#help with clangd
|
||||||
|
add_definitions(-D__EMSCRIPTEN__ -DEXIT_RUNTIME=1 -DMUSIC_WAV)
|
||||||
|
elseif(MINGW)
|
||||||
|
set(CMAKE_C_FLAGS "-Wno-undef --static")
|
||||||
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
|
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
|
||||||
set(CMAKE_C_FLAGS_RELEASE "-O2")
|
set(CMAKE_C_FLAGS_RELEASE "-O2")
|
||||||
else()
|
else()
|
||||||
@@ -51,5 +57,5 @@ set_property(TARGET LEGEND_OF_ADAME PROPERTY C_STANDARD 23)
|
|||||||
file(COPY assets DESTINATION ${CMAKE_BINARY_DIR})
|
file(COPY assets DESTINATION ${CMAKE_BINARY_DIR})
|
||||||
|
|
||||||
if(MINGW)
|
if(MINGW)
|
||||||
target_link_libraries(LEGEND_OF_ADAME ws2_32 windows mingw32 SDLmain SDL)
|
target_link_libraries(LEGEND_OF_ADAME ws2_32)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -20,7 +20,7 @@ void cinematic_staticRender(void) {
|
|||||||
text_renderText(&AdamesLegend, 8, 0.8f, white, "./assets/fonts/Quinquefive.ttf", 40, "Adame est l'eleve modele de Polytech,\n Membre de plusieurs associations il est connu de tous.\n Lors de l'edition 21.2 de la Nantarena,\n Adame s'est retrouve a engeuler des joueurs pour leur demander de mettre leur putain de masque.\n\n L'edition finie, Adame a kidnappe l'ensemble des joueurs qui forcaient pour leur apprendre a respecter l'autorite a coup de coup de pied au cul.\n\n Press space to continue");
|
text_renderText(&AdamesLegend, 8, 0.8f, white, "./assets/fonts/Quinquefive.ttf", 40, "Adame est l'eleve modele de Polytech,\n Membre de plusieurs associations il est connu de tous.\n Lors de l'edition 21.2 de la Nantarena,\n Adame s'est retrouve a engeuler des joueurs pour leur demander de mettre leur putain de masque.\n\n L'edition finie, Adame a kidnappe l'ensemble des joueurs qui forcaient pour leur apprendre a respecter l'autorite a coup de coup de pied au cul.\n\n Press space to continue");
|
||||||
scene_addRenderObject(&cinematicScene, AdamesLegend, 10, 80);
|
scene_addRenderObject(&cinematicScene, AdamesLegend, 10, 80);
|
||||||
|
|
||||||
music = Mix_LoadMUS("./assets/music/chinese rap.mp3");
|
music = Mix_LoadMUS("./assets/music/chinese rap.ogg");
|
||||||
if(music == NULL) {
|
if(music == NULL) {
|
||||||
fprintf(stderr, "Chinese rap not found!\n");
|
fprintf(stderr, "Chinese rap not found!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|||||||
+16
-7
@@ -12,6 +12,11 @@
|
|||||||
#include "text.h"
|
#include "text.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
|
||||||
|
//Web asembly
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
#include <emscripten.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define GRAVITY 10000.f
|
#define GRAVITY 10000.f
|
||||||
|
|
||||||
@@ -84,21 +89,21 @@ RenderId_t steroidText;
|
|||||||
|
|
||||||
|
|
||||||
static void playMusic(){
|
static void playMusic(){
|
||||||
music = Mix_LoadMUS("./assets/music/game.wav");
|
music = Mix_LoadMUS("./assets/music/game.ogg");
|
||||||
if(music == NULL) {
|
if(music == NULL) {
|
||||||
fprintf(stderr, "Game audio not found!\n");
|
fprintf(stderr, "Game audio not found! %s\n", Mix_GetError());
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
petMusic = Mix_LoadWAV("./assets/music/pet.mp3");
|
petMusic = Mix_LoadWAV("./assets/music/pet.ogg");
|
||||||
if(petMusic == NULL){
|
if(petMusic == NULL){
|
||||||
fprintf(stderr, "Pet audio not found!\n");
|
fprintf(stderr, "Pet audio not found! %s\n", Mix_GetError());
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
koMusic = Mix_LoadWAV("./assets/music/ko-effect-gain.mp3");
|
koMusic = Mix_LoadWAV("./assets/music/ko-effect-gain.ogg");
|
||||||
if(koMusic == NULL){
|
if(koMusic == NULL){
|
||||||
fprintf(stderr, "ko effect audio not found!\n");
|
fprintf(stderr, "ko effect audio not found %s\n", Mix_GetError());
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,8 +125,12 @@ int game_staticRender(void){
|
|||||||
|
|
||||||
SDL_Surface* gameBackgroundSurface = IMG_Load("./assets/img/game_bg.png");
|
SDL_Surface* gameBackgroundSurface = IMG_Load("./assets/img/game_bg.png");
|
||||||
if(gameBackgroundSurface == NULL){
|
if(gameBackgroundSurface == NULL){
|
||||||
printf("cannot load background");
|
printf("cannot load background\n");
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
emscripten_pause_main_loop();
|
||||||
|
#else
|
||||||
return -1;
|
return -1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Surface* gameBackgroundSurface2 = IMG_Load("./assets/img/game_bg.png");
|
SDL_Surface* gameBackgroundSurface2 = IMG_Load("./assets/img/game_bg.png");
|
||||||
|
|||||||
+14
-7
@@ -12,6 +12,12 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "cinematic.h"
|
#include "cinematic.h"
|
||||||
#include "scaller.h"
|
#include "scaller.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
//Web asembly
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
#include <emscripten.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
clock_t timecode;
|
clock_t timecode;
|
||||||
long iter;
|
long iter;
|
||||||
@@ -40,14 +46,10 @@ static void game_setup(void) {
|
|||||||
RenderObject_t text = EMPTY_RENDER_OBJECT;
|
RenderObject_t text = EMPTY_RENDER_OBJECT;
|
||||||
SDL_Color white = {255, 255, 255, 255};
|
SDL_Color white = {255, 255, 255, 255};
|
||||||
TTF_Init();
|
TTF_Init();
|
||||||
if(text_renderText(&text, 1000, 1, white, "./assets/fonts/arial.ttf", 25, "Hello World") < 0){
|
|
||||||
printf("error");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
input_listenKeyDown(SDL_SCANCODE_SPACE, space);
|
input_listenKeyDown(SDL_SCANCODE_SPACE, space);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void game_loop(void) {
|
void game_loop(void) {
|
||||||
float delta = ((float)(clock() - timecode)) / CLOCKS_PER_SEC;
|
float delta = ((float)(clock() - timecode)) / CLOCKS_PER_SEC;
|
||||||
|
|
||||||
//update time
|
//update time
|
||||||
@@ -62,7 +64,6 @@ static void game_loop(void) {
|
|||||||
timecode = clock();
|
timecode = clock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char ** argv) {
|
int main(int argc, char ** argv) {
|
||||||
TTF_Init();
|
TTF_Init();
|
||||||
if(Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096) != 0){
|
if(Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096) != 0){
|
||||||
@@ -75,9 +76,15 @@ int main(int argc, char ** argv) {
|
|||||||
timecode = clock();
|
timecode = clock();
|
||||||
|
|
||||||
Mix_Init(MIX_INIT_MP3);
|
Mix_Init(MIX_INIT_MP3);
|
||||||
renderer_main(argc, argv, game_setup, game_loop);
|
renderer_main(argc, argv, game_setup);
|
||||||
|
|
||||||
Mix_CloseAudio();
|
Mix_CloseAudio();
|
||||||
text_freeFontCache();
|
text_freeFontCache();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
int WinMain(int argc, char ** argv) {
|
||||||
|
main(argc, argv);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#ifndef __MAIN_H__
|
||||||
|
#define __MAIN_H__
|
||||||
|
|
||||||
|
void game_loop(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
+13
-4
@@ -20,21 +20,30 @@ static Mix_Music * music;
|
|||||||
|
|
||||||
Scene_t menuScene = { NULL, 0, 0, 0, 0, 0 };
|
Scene_t menuScene = { NULL, 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
|
//Web asembly
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
#include <emscripten.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int menu_staticRender(void){
|
int menu_staticRender(void){
|
||||||
|
|
||||||
MonitorSize_t size = renderer_getMonitorSize();
|
MonitorSize_t size = renderer_getMonitorSize();
|
||||||
float aspectRatio = (float)size.width / size.height;
|
float aspectRatio = (float)size.width / size.height;
|
||||||
|
|
||||||
|
|
||||||
SDL_Surface* backgroundImageSurface = IMG_Load("./assets/img/menu_bg.png");
|
SDL_Surface* backgroundImageSurface = IMG_Load("assets/img/menu_bg.png");
|
||||||
if(backgroundImageSurface == NULL){
|
if(backgroundImageSurface == NULL){
|
||||||
printf("cannot load background");
|
printf("Could not load menu background\n");
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
emscripten_pause_main_loop();
|
||||||
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
music = Mix_LoadMUS("./assets/music/menu.wav");
|
music = Mix_LoadMUS("assets/music/menu.ogg");
|
||||||
if(music == NULL) {
|
if(music == NULL) {
|
||||||
fprintf(stderr, "Menu music not found!\n");
|
fprintf(stderr, "Menu music not found!: %s\n", Mix_GetError());
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+56
-36
@@ -14,6 +14,12 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "scene.h"
|
#include "scene.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
//Web asembly
|
||||||
|
#ifdef __EMSCRIPTEN__
|
||||||
|
#include <emscripten.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
bool running;
|
bool running;
|
||||||
MonitorSize_t monitorSize;
|
MonitorSize_t monitorSize;
|
||||||
@@ -36,8 +42,50 @@ static void toggleFullscreen(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool main_loop(void) {
|
||||||
|
SDL_RenderClear(renderer);
|
||||||
|
|
||||||
|
game_loop();
|
||||||
|
|
||||||
|
SDL_Event event;
|
||||||
|
|
||||||
|
// Events management
|
||||||
|
while (SDL_PollEvent(&event)) {
|
||||||
|
switch (event.type) {
|
||||||
|
|
||||||
|
case SDL_QUIT:
|
||||||
|
// handling of close button
|
||||||
|
running = false;
|
||||||
|
printf("Quitting my job!\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SDL_KEYDOWN:
|
||||||
|
// keyboard API for key pressed
|
||||||
|
input_pollKeyDown(event.key.keysym.scancode);
|
||||||
|
break;
|
||||||
|
case SDL_KEYUP:
|
||||||
|
input_pollKeyUp(event.key.keysym.scancode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!running)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(scene != NULL)
|
||||||
|
scene_render(scene);
|
||||||
|
|
||||||
|
SDL_RenderPresent(renderer);
|
||||||
|
|
||||||
|
#ifndef __EMSCRIPTEN__
|
||||||
|
SDL_Delay(1000 / 60);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//int (*compar)(const void [.size], const void [.size], void *)
|
//int (*compar)(const void [.size], const void [.size], void *)
|
||||||
void renderer_main(int argc, char ** argv, void(*game_setup)(void), void(*game_loop)(void)) {
|
void renderer_main(int argc, char ** argv, void(*game_setup)(void)) {
|
||||||
// returns zero on success else non-zero
|
// returns zero on success else non-zero
|
||||||
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
|
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
|
||||||
printf("error initializing SDL: %s\n", SDL_GetError());
|
printf("error initializing SDL: %s\n", SDL_GetError());
|
||||||
@@ -75,44 +123,16 @@ void renderer_main(int argc, char ** argv, void(*game_setup)(void), void(*game_l
|
|||||||
running = true;
|
running = true;
|
||||||
|
|
||||||
game_setup();
|
game_setup();
|
||||||
while(running) {
|
|
||||||
SDL_RenderClear(renderer);
|
|
||||||
|
|
||||||
game_loop();
|
#ifdef __EMSCRIPTEN__
|
||||||
|
emscripten_set_main_loop((em_callback_func)main_loop, 0, true);
|
||||||
SDL_Event event;
|
#else
|
||||||
|
while(main_loop());
|
||||||
// Events management
|
#endif
|
||||||
while (SDL_PollEvent(&event)) {
|
|
||||||
switch (event.type) {
|
|
||||||
|
|
||||||
case SDL_QUIT:
|
|
||||||
// handling of close button
|
|
||||||
running = false;
|
|
||||||
printf("Quitting my job!\n");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SDL_KEYDOWN:
|
|
||||||
// keyboard API for key pressed
|
|
||||||
input_pollKeyDown(event.key.keysym.scancode);
|
|
||||||
break;
|
|
||||||
case SDL_KEYUP:
|
|
||||||
input_pollKeyUp(event.key.keysym.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//no need to make an extra render pass
|
|
||||||
if(!running) break;
|
|
||||||
|
|
||||||
if(scene != NULL)
|
|
||||||
scene_render(scene);
|
|
||||||
|
|
||||||
SDL_RenderPresent(renderer);
|
|
||||||
SDL_Delay(1000 / 400); //400fps or u a pussy
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void renderer_setScene(const Scene_t * newScene) {
|
void renderer_setScene(const Scene_t * newScene) {
|
||||||
scene = newScene;
|
scene = newScene;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -16,7 +16,7 @@ typedef struct MonitorSize {
|
|||||||
int width, height;
|
int width, height;
|
||||||
} MonitorSize_t;
|
} MonitorSize_t;
|
||||||
|
|
||||||
void renderer_main(int argc, char ** argv, void(*game_setup)(void), void(*game_loop)(void));
|
void renderer_main(int argc, char ** argv, void(*game_loop)(void));
|
||||||
MonitorSize_t renderer_getMonitorSize(void);
|
MonitorSize_t renderer_getMonitorSize(void);
|
||||||
void renderer_setScene(const Scene_t * newScene);
|
void renderer_setScene(const Scene_t * newScene);
|
||||||
const Scene_t * renderer_getScene(void);
|
const Scene_t * renderer_getScene(void);
|
||||||
|
|||||||
+3
-1
@@ -5,9 +5,11 @@
|
|||||||
#include <SDL2/SDL_image.h>
|
#include <SDL2/SDL_image.h>
|
||||||
#include <SDL2/SDL_render.h>
|
#include <SDL2/SDL_render.h>
|
||||||
#include <SDL2/SDL_surface.h>
|
#include <SDL2/SDL_surface.h>
|
||||||
|
#include <float.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
const RenderObject_t EMPTY_RENDER_OBJECT = { 0, 0.f, 0.f, 0.f, 0.f, 0.f, NULL, "Undefined" };
|
const RenderObject_t EMPTY_RENDER_OBJECT = { 0, 0.f, 0.f, 0.f, 0.f, 0.f, NULL, "Undefined" };
|
||||||
|
|
||||||
@@ -83,7 +85,7 @@ RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x,
|
|||||||
scene->objects[scene->objectCount - 1] = item;
|
scene->objects[scene->objectCount - 1] = item;
|
||||||
|
|
||||||
//the objects are sorted
|
//the objects are sorted
|
||||||
#ifdef __MINGW32__
|
#if defined(__MINGW32__) || defined(__EMSCRIPTEN__)
|
||||||
qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (int (__cdecl *)(const void *,const void *))compartSort);
|
qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (int (__cdecl *)(const void *,const void *))compartSort);
|
||||||
#else
|
#else
|
||||||
qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (__compar_fn_t)compartSort);
|
qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (__compar_fn_t)compartSort);
|
||||||
|
|||||||
Reference in New Issue
Block a user