//---------------------------------------------------------------------------------- // Main entry point //---------------------------------------------------------------------------------- int main(void) { // Initialization //--------------------------------------------------------- const char windowTitle[30] = "SKULLY ESCAPE [KING GAMEJAM]"; InitWindow(screenWidth, screenHeight, windowTitle); // Global data loading (assets that must be available in all screens, i.e. fonts) InitAudioDevice(); music = LoadMusicStream("resources/audio/come_play_with_me.ogg"); PlayMusicStream(music); font = LoadSpriteFont("resources/textures/alagard.png"); doors = LoadTexture("resources/textures/doors.png"); sndDoor = LoadSound("resources/audio/door.ogg"); sndScream = LoadSound("resources/audio/scream.ogg"); InitPlayer(); // Setup and Init first screen currentScreen = LOGO; InitLogoScreen(); #if defined(PLATFORM_WEB) emscripten_set_main_loop(UpdateDrawFrame, 0, 1); #else SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { UpdateDrawFrame(); } #endif // De-Initialization //-------------------------------------------------------------------------------------- // Unload all global loaded data (i.e. fonts) here! UnloadPlayer(); UnloadSpriteFont(font); UnloadTexture(doors); UnloadSound(sndDoor); UnloadSound(sndScream); UnloadMusicStream(music); CloseAudioDevice(); CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; }
int main() { // Initialization //-------------------------------------------------------------------------------------- static unsigned char key = 0; InitAudioDevice(); Sound fxWav = LoadSound("resources/audio/weird.wav"); // Load WAV audio file Sound fxOgg = LoadSound("resources/audio/tanatana.ogg"); // Load OGG audio file Music music = LoadMusicStream("resources/audio/guitar_noodling.ogg"); PlayMusicStream(music); printf("\nPress s or d to play sounds...\n"); //-------------------------------------------------------------------------------------- // Main loop while (key != KEY_ESCAPE) { if (kbhit()) key = getch(); if (key == 's') { PlaySound(fxWav); key = 0; } if (key == 'd') { PlaySound(fxOgg); key = 0; } UpdateMusicStream(music); } // De-Initialization //-------------------------------------------------------------------------------------- UnloadSound(fxWav); // Unload sound data UnloadSound(fxOgg); // Unload sound data UnloadMusicStream(music); // Unload music stream data CloseAudioDevice(); //-------------------------------------------------------------------------------------- return 0; }
// Gameplay Screen Initialization logic void InitGameplayScreen(void) { // TODO: Initialize GAMEPLAY screen variables here! framesCounter = 0; finishScreen = 0; // MAP LAODING // TODO: Read .bmp file propierly in order to get image width & height Color *mapPixels = malloc(GRID_WIDTH*GRID_HEIGHT * sizeof(Color)); mapPixels = GetImageData(LoadImage("assets/gameplay_screen/maps/map.bmp")); maxTriangles = 0; maxPlatforms = 0; for (int i=0; i<GRID_WIDTH*GRID_HEIGHT; i++) { /* printf("r: %i\n", mapPixels[i].r); printf("g: %i\n", mapPixels[i].g); printf("b: %i\n\n", mapPixels[i].b); */ if (mapPixels[i].r == 255 && mapPixels[i].g == 0 && mapPixels[i].b == 0) maxTriangles++; else if (mapPixels[i].r == 0 && mapPixels[i].g == 255 && mapPixels[i].b == 0) maxPlatforms++; } triangles = malloc(maxTriangles * sizeof(TriangleObject)); platforms = malloc(maxPlatforms * sizeof(SquareObject)); int trianglesCounter=0; int platformsCounter=0; for (int y=0; y<GRID_HEIGHT; y++) { for (int x=0; x<GRID_WIDTH; x++) { if (mapPixels[y*GRID_WIDTH+x].r == 255 && mapPixels[y*GRID_WIDTH+x].g == 0 && mapPixels[y*GRID_WIDTH+x].b == 0) { InitializeTriangle(&triangles[trianglesCounter], (Vector2){x, y}); trianglesCounter++; } else if (mapPixels[y*GRID_WIDTH+x].r == 0 && mapPixels[y*GRID_WIDTH+x].g == 255 && mapPixels[y*GRID_WIDTH+x].b == 0) { InitializePlatform(&platforms[platformsCounter], (Vector2){x, y}); platformsCounter++; } } } free(mapPixels); //DEBUGGING && TESTING variables pause = FALSE; srand(time(NULL)); // Textures loading player.texture = LoadTexture("assets/gameplay_screen/cube_main.png"); triangleTexture = LoadTexture("assets/gameplay_screen/triangle_main.png"); platformTexture = LoadTexture("assets/gameplay_screen/platform_main.png"); player.pEmitter.texture = LoadTexture("assets/gameplay_screen/particle_main.png"); bg = LoadTexture("assets/gameplay_screen/bg_main.png"); // Sound loading InitAudioDevice(); PlayMusicStream("assets/gameplay_screen/music/Flash_Funk_MarshmelloRemix.ogg"); PauseMusicStream(); SetMusicVolume(0.5f); // Did player win? startGame = FALSE; /* player.texture = LoadTexture("assets/gameplay_screen/debug.png"); triangleTexture = LoadTexture("assets/gameplay_screen/debug.png"); platformTexture = LoadTexture("assets/gameplay_screen/debug.png"); player.pEmitter.texture = LoadTexture("assets/gameplay_screen/particle_main.png"); */ // Camera initialization mainCamera = (Camera2D){Vector2Right(), (Vector2){6.5f, 6.5f}, Vector2Zero(), TRUE}; // Gravity initialization gravity = (GravityForce){Vector2Up(), 1.5f}; // Ground position and coordinate groundCoordinadeY = GetScreenHeight()/CELL_SIZE-1; groundPositionY = GetOnGridPosition((Vector2){0, groundCoordinadeY}).y; // Player initialization InitializePlayer(&player, (Vector2){4, groundCoordinadeY-1}, (Vector2){0, 15}, 0.35f*GAME_SPEED); /* // Triangles initialization InitializeTriangle(&triangles[0], (Vector2){40, groundCoordinadeY-1}); InitializeTriangle(&triangles[1], (Vector2){50, groundCoordinadeY-1}); InitializeTriangle(&triangles[2], (Vector2){85, groundCoordinadeY-1}); // Platforms initialization InitializePlatform(&platforms[0], (Vector2){20, groundCoordinadeY-1}); InitializePlatform(&platforms[1], (Vector2){21, groundCoordinadeY-1}); InitializePlatform(&platforms[2], (Vector2){22, groundCoordinadeY-1}); InitializePlatform(&platforms[3], (Vector2){23, groundCoordinadeY-2}); InitializePlatform(&platforms[4], (Vector2){24, groundCoordinadeY-2}); */ }
//---------------------------------------------------------------------------------- // Main entry point //---------------------------------------------------------------------------------- int main(void) { // Initialization (Note windowTitle is unused on Android) //--------------------------------------------------------- InitWindow(screenWidth, screenHeight, "KOALA SEASONS"); // Load global data here (assets that must be available in all screens, i.e. fonts) font = LoadFont("resources/graphics/mainfont.png"); atlas01 = LoadTexture("resources/graphics/atlas01.png"); atlas02 = LoadTexture("resources/graphics/atlas02.png"); #if defined(PLATFORM_WEB) || defined(PLATFORM_RPI) || defined(PLATFORM_ANDROID) colorBlend = LoadShader("resources/shaders/glsl100/base.vs", "resources/shaders/glsl100/blend_color.fs"); #else colorBlend = LoadShader("resources/shaders/glsl330/base.vs", "resources/shaders/glsl330/blend_color.fs"); #endif InitAudioDevice(); // Load sounds data fxJump = LoadSound("resources/audio/jump.ogg"); fxDash = LoadSound("resources/audio/dash.ogg"); fxEatLeaves = LoadSound("resources/audio/eat_leaves.ogg"); fxHitResin = LoadSound("resources/audio/resin_hit.ogg"); fxWind = LoadSound("resources/audio/wind_sound.ogg"); fxDieSnake = LoadSound("resources/audio/snake_die.ogg"); fxDieDingo = LoadSound("resources/audio/dingo_die.ogg"); fxDieOwl = LoadSound("resources/audio/owl_die.ogg"); music = LoadMusicStream("resources/audio/jngl.xm"); PlayMusicStream(music); SetMusicVolume(music, 1.0f); // Define and init first screen // NOTE: currentScreen is defined in screens.h as a global variable currentScreen = TITLE; InitLogoScreen(); //InitOptionsScreen(); InitTitleScreen(); InitGameplayScreen(); InitEndingScreen(); #if defined(PLATFORM_WEB) emscripten_set_main_loop(UpdateDrawFrame, 0, 1); #else SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) UpdateDrawFrame(); #endif // De-Initialization //-------------------------------------------------------------------------------------- UnloadEndingScreen(); UnloadTitleScreen(); UnloadGameplayScreen(); UnloadLogoScreen(); UnloadTexture(atlas01); UnloadTexture(atlas02); UnloadFont(font); UnloadShader(colorBlend); // Unload color overlay blending shader UnloadSound(fxJump); UnloadSound(fxDash); UnloadSound(fxEatLeaves); UnloadSound(fxHitResin); UnloadSound(fxWind); UnloadSound(fxDieSnake); UnloadSound(fxDieDingo); UnloadSound(fxDieOwl); UnloadMusicStream(music); CloseAudioDevice(); // Close audio device CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; }
// Mission Screen Initialization logic void InitMissionScreen(void) { framesCounter = 0; finishScreen = 0; fadeButton = 0.80f; texBackground = LoadTexture("resources/textures/mission_background.png"); texBackline = LoadTexture("resources/textures/mission_backline.png"); sourceRecBackLine = (Rectangle){0,0,GetScreenWidth(), texBackline.height}; destRecBackLine = (Rectangle){0,0,sourceRecBackLine.width, sourceRecBackLine.height}; fadeBackLine = 0; fxTransmit = LoadSound("resources/audio/fx_message.ogg"); musMission = LoadMusicStream("resources/audio/music_mission.ogg"); PlayMusicStream(musMission); // Initialize missions missions = LoadMissions("resources/missions.txt"); missionMaxLength = strlen(missions[currentMission].brief); // Insert line breaks every MAX_LINE_CHAR int currentLine = 1; int i = currentLine * MAX_LINE_CHAR; while (i < missionMaxLength) { if (missions[currentMission].brief[i] == ' ') { missions[currentMission].brief[i] = '\n'; currentLine++; i = currentLine*MAX_LINE_CHAR; } else i++; } missionSize = 30; missionLenght = 0; missionSpeed = 1; numberColor = RAYWHITE; missionColor = LIGHTGRAY; keywordColor = (Color){198, 49, 60, 255}; //RED numberPosition = (Vector2){150, 185}; missionPosition = (Vector2){numberPosition.x, numberPosition.y + 60}; keywordPosition = (Vector2){missionPosition.x, missionPosition.y + MeasureTextEx(fontMission, missions[currentMission].brief, missionSize, 0).y + 60}; startWritting = false; writeNumber = false; writeMission = false; writeKeyword = false; writeEnd = false; writtingMission = false; showNumberWaitFrames = 30; showMissionWaitFrames = 60; showKeywordWaitFrames = 60; blinkKeyWord = true; blinkFrames = 15; PlaySound(fxTransmit); }
int main() { // Initialization //-------------------------------------------------------------------------------------- const int screenWidth = 1280; const int screenHeight = 720; // Init window ShowLogo(); InitWindow(screenWidth, screenHeight, "Dr. Turtle & Mr. GAMERA"); // Initialize audio device InitAudioDevice(); // Load game resources: textures Texture2D sky = LoadTexture("resources/sky.png"); Texture2D mountains = LoadTexture("resources/mountains.png"); Texture2D sea = LoadTexture("resources/sea.png"); Texture2D title = LoadTexture("resources/title.png"); Texture2D turtle = LoadTexture("resources/turtle.png"); Texture2D gamera = LoadTexture("resources/gamera.png"); Texture2D shark = LoadTexture("resources/shark.png"); Texture2D orca = LoadTexture("resources/orca.png"); Texture2D swhale = LoadTexture("resources/swhale.png"); Texture2D fish = LoadTexture("resources/fish.png"); Texture2D gframe = LoadTexture("resources/gframe.png"); // Load game resources: fonts SpriteFont font = LoadSpriteFont("resources/komika.png"); // Load game resources: sounds Sound eat = LoadSound("resources/eat.wav"); Sound die = LoadSound("resources/die.wav"); Sound growl = LoadSound("resources/gamera.wav"); // Start playing streaming music PlayMusicStream("resources/speeding.ogg"); // Define scrolling variables int backScrolling = 0; int seaScrolling = 0; // Define current screen GameScreen currentScreen = TITLE; // Define player variables int playerRail = 1; Rectangle playerBounds = { 30 + 14, playerRail*120 + 90 + 14, 100, 100 }; bool gameraMode = false; // Define enemies variables Rectangle enemyBounds[MAX_ENEMIES]; int enemyRail[MAX_ENEMIES]; int enemyType[MAX_ENEMIES]; bool enemyActive[MAX_ENEMIES]; float enemySpeed = 10; // Init enemies variables for (int i = 0; i < MAX_ENEMIES; i++) { // Define enemy type (all same probability) //enemyType[i] = GetRandomValue(0, 3); // Probability system for enemies type int enemyProb = GetRandomValue(0, 100); if (enemyProb < 30) enemyType[i] = 0; else if (enemyProb < 60) enemyType[i] = 1; else if (enemyProb < 90) enemyType[i] = 2; else enemyType[i] = 3; // define enemy rail enemyRail[i] = GetRandomValue(0, 4); // Make sure not two consecutive enemies in the same row if (i > 0) while (enemyRail[i] == enemyRail[i - 1]) enemyRail[i] = GetRandomValue(0, 4); enemyBounds[i] = (Rectangle){ screenWidth + 14, 120*enemyRail[i] + 90 + 14, 100, 100 }; enemyActive[i] = false; } // Define additional game variables int score = 0; float distance = 0.0f; int hiscore = 0; float hidistance = 0.0f; int foodBar = 0; int framesCounter = 0; unsigned char blue = 200; float timeCounter = 0; SetTargetFPS(60); // Setup game frames per second //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- framesCounter++; // Sea color tint effect blue = 210 + 25 * sin(timeCounter); timeCounter += 0.01; // Game screens management switch (currentScreen) { case TITLE: { // Sea scrolling seaScrolling -= 2; if (seaScrolling <= -screenWidth) seaScrolling = 0; // Press enter to change to gameplay screen if (IsKeyPressed(KEY_ENTER)) { currentScreen = GAMEPLAY; framesCounter = 0; } } break; case GAMEPLAY: { // Background scrolling logic backScrolling--; if (backScrolling <= -screenWidth) backScrolling = 0; // Sea scrolling logic seaScrolling -= (enemySpeed - 2); if (seaScrolling <= -screenWidth) seaScrolling = 0; // Player movement logic if (IsKeyPressed(KEY_DOWN)) playerRail++; else if (IsKeyPressed(KEY_UP)) playerRail--; // Check player not out of rails if (playerRail > 4) playerRail = 4; else if (playerRail < 0) playerRail = 0; // Update player bounds playerBounds = (Rectangle){ 30 + 14, playerRail*120 + 90 + 14, 100, 100 }; // Enemies activation logic (every 40 frames) if (framesCounter > 40) { for (int i = 0; i < MAX_ENEMIES; i++) { if (enemyActive[i] == false) { enemyActive[i] = true; i = MAX_ENEMIES; } } framesCounter = 0; } // Enemies logic for (int i = 0; i < MAX_ENEMIES; i++) { if (enemyActive[i]) { enemyBounds[i].x -= enemySpeed; } // Check enemies out of screen if (enemyBounds[i].x <= 0 - 128) { enemyActive[i] = false; enemyType[i] = GetRandomValue(0, 3); enemyRail[i] = GetRandomValue(0, 4); // Make sure not two consecutive enemies in the same row if (i > 0) while (enemyRail[i] == enemyRail[i - 1]) enemyRail[i] = GetRandomValue(0, 4); enemyBounds[i] = (Rectangle){ screenWidth + 14, 120*enemyRail[i] + 90 + 14, 100, 100 }; } } if (!gameraMode) enemySpeed += 0.005; // Check collision player vs enemies for (int i = 0; i < MAX_ENEMIES; i++) { if (enemyActive[i]) { if (CheckCollisionRecs(playerBounds, enemyBounds[i])) { if (enemyType[i] < 3) // Bad enemies { if (gameraMode) { if (enemyType[i] == 0) score += 50; else if (enemyType[i] == 1) score += 150; else if (enemyType[i] == 2) score += 300; foodBar += 15; enemyActive[i] = false; // After enemy deactivation, reset enemy parameters to be reused enemyType[i] = GetRandomValue(0, 3); enemyRail[i] = GetRandomValue(0, 4); // Make sure not two consecutive enemies in the same row if (i > 0) while (enemyRail[i] == enemyRail[i - 1]) enemyRail[i] = GetRandomValue(0, 4); enemyBounds[i] = (Rectangle){ screenWidth + 14, 120*enemyRail[i] + 90 + 14, 100, 100 }; PlaySound(eat); } else { // Player die logic PlaySound(die); currentScreen = ENDING; framesCounter = 0; // Save hiscore and hidistance for next game if (score > hiscore) hiscore = score; if (distance > hidistance) hidistance = distance; } } else // Sweet fish { enemyActive[i] = false; enemyType[i] = GetRandomValue(0, 3); enemyRail[i] = GetRandomValue(0, 4); // Make sure not two consecutive enemies in the same row if (i > 0) while (enemyRail[i] == enemyRail[i - 1]) enemyRail[i] = GetRandomValue(0, 4); enemyBounds[i] = (Rectangle){ screenWidth + 14, 120*enemyRail[i] + 90 + 14, 100, 100 }; if (!gameraMode) foodBar += 80; else foodBar += 25; score += 10; if (foodBar == 400) { gameraMode = true; PlaySound(growl); } PlaySound(eat); } } } } // Gamera mode logic if (gameraMode) { foodBar--; if (foodBar <= 0) { gameraMode = false; enemySpeed -= 2; if (enemySpeed < 10) enemySpeed = 10; } } // Update distance counter distance += 0.5f; } break; case ENDING: { // Press enter to play again if (IsKeyPressed(KEY_ENTER)) { currentScreen = GAMEPLAY; // Reset player playerRail = 1; playerBounds = (Rectangle){ 30 + 14, playerRail*120 + 90 + 14, 100, 100 }; gameraMode = false; // Reset enemies data for (int i = 0; i < MAX_ENEMIES; i++) { int enemyProb = GetRandomValue(0, 100); if (enemyProb < 30) enemyType[i] = 0; else if (enemyProb < 60) enemyType[i] = 1; else if (enemyProb < 90) enemyType[i] = 2; else enemyType[i] = 3; //enemyType[i] = GetRandomValue(0, 3); enemyRail[i] = GetRandomValue(0, 4); // Make sure not two consecutive enemies in the same row if (i > 0) while (enemyRail[i] == enemyRail[i - 1]) enemyRail[i] = GetRandomValue(0, 4); enemyBounds[i] = (Rectangle){ screenWidth + 14, 120*enemyRail[i] + 90 + 14, 100, 100 }; enemyActive[i] = false; } enemySpeed = 10; // Reset game variables score = 0; distance = 0.0; foodBar = 0; framesCounter = 0; } } break; default: break; } //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(RAYWHITE); // Draw background (common to all screens) DrawTexture(sky, 0, 0, WHITE); DrawTexture(mountains, backScrolling, 0, WHITE); DrawTexture(mountains, screenWidth + backScrolling, 0, WHITE); if (!gameraMode) { DrawTexture(sea, seaScrolling, 0, (Color){ 16, 189, blue, 255}); DrawTexture(sea, screenWidth + seaScrolling, 0, (Color){ 16, 189, blue, 255}); } else { DrawTexture(sea, seaScrolling, 0, (Color){ 255, 113, 66, 255}); DrawTexture(sea, screenWidth + seaScrolling, 0, (Color){ 255, 113, 66, 255}); } switch (currentScreen) { case TITLE: { // Draw title DrawTexture(title, screenWidth/2 - title.width/2, screenHeight/2 - title.height/2 - 80, WHITE); // Draw blinking text if ((framesCounter/30) % 2) DrawTextEx(font, "PRESS ENTER", (Vector2){ screenWidth/2 - 150, 480 }, GetFontBaseSize(font), 0, WHITE); } break; case GAMEPLAY: { // Draw water lines for (int i = 0; i < 5; i++) DrawRectangle(0, i*120 + 120, screenWidth, 110, Fade(SKYBLUE, 0.1f)); // Draw player if (!gameraMode) DrawTexture(turtle, playerBounds.x - 14, playerBounds.y - 14, WHITE); else DrawTexture(gamera, playerBounds.x - 64, playerBounds.y - 64, WHITE); // Draw player bounding box //if (!gameraMode) DrawRectangleRec(playerBounds, Fade(GREEN, 0.4f)); //else DrawRectangleRec(playerBounds, Fade(ORANGE, 0.4f)); // Draw enemies for (int i = 0; i < MAX_ENEMIES; i++) { if (enemyActive[i]) { // Draw enemies switch(enemyType[i]) { case 0: DrawTexture(shark, enemyBounds[i].x - 14, enemyBounds[i].y - 14, WHITE); break; case 1: DrawTexture(orca, enemyBounds[i].x - 14, enemyBounds[i].y - 14, WHITE); break; case 2: DrawTexture(swhale, enemyBounds[i].x - 14, enemyBounds[i].y - 14, WHITE); break; case 3: DrawTexture(fish, enemyBounds[i].x - 14, enemyBounds[i].y - 14, WHITE); break; default: break; } // Draw enemies bounding boxes /* switch(enemyType[i]) { case 0: DrawRectangleRec(enemyBounds[i], Fade(RED, 0.5f)); break; case 1: DrawRectangleRec(enemyBounds[i], Fade(RED, 0.5f)); break; case 2: DrawRectangleRec(enemyBounds[i], Fade(RED, 0.5f)); break; case 3: DrawRectangleRec(enemyBounds[i], Fade(GREEN, 0.5f)); break; default: break; } */ } } // Draw gameplay interface DrawRectangle(20, 20, 400, 40, Fade(GRAY, 0.4f)); DrawRectangle(20, 20, foodBar, 40, ORANGE); DrawRectangleLines(20, 20, 400, 40, BLACK); DrawTextEx(font, FormatText("SCORE: %04i", score), (Vector2){ screenWidth - 300, 20 }, GetFontBaseSize(font), -2, ORANGE); DrawTextEx(font, FormatText("DISTANCE: %04i", (int)distance), (Vector2){ 550, 20 }, GetFontBaseSize(font), -2, ORANGE); if (gameraMode) { DrawText("GAMERA MODE", 60, 22, 40, GRAY); DrawTexture(gframe, 0, 0, Fade(WHITE, 0.5f)); } } break; case ENDING: { // Draw a transparent black rectangle that covers all screen DrawRectangle(0, 0, screenWidth, screenHeight, Fade(BLACK, 0.4f)); DrawTextEx(font, "GAME OVER", (Vector2){ 300, 160 }, GetFontBaseSize(font)*3, -2, MAROON); DrawTextEx(font, FormatText("SCORE: %04i", score), (Vector2){ 680, 350 }, GetFontBaseSize(font), -2, GOLD); DrawTextEx(font, FormatText("DISTANCE: %04i", (int)distance), (Vector2){ 290, 350 }, GetFontBaseSize(font), -2, GOLD); DrawTextEx(font, FormatText("HISCORE: %04i", hiscore), (Vector2){ 665, 400 }, GetFontBaseSize(font), -2, ORANGE); DrawTextEx(font, FormatText("HIDISTANCE: %04i", (int)hidistance), (Vector2){ 270, 400 }, GetFontBaseSize(font), -2, ORANGE); // Draw blinking text if ((framesCounter/30) % 2) DrawTextEx(font, "PRESS ENTER to REPLAY", (Vector2){ screenWidth/2 - 250, 520 }, GetFontBaseSize(font), -2, LIGHTGRAY); } break; default: break; } EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- // Unload textures UnloadTexture(sky); UnloadTexture(mountains); UnloadTexture(sea); UnloadTexture(gframe); UnloadTexture(title); UnloadTexture(turtle); UnloadTexture(shark); UnloadTexture(orca); UnloadTexture(swhale); UnloadTexture(fish); UnloadTexture(gamera); // Unload font texture UnloadSpriteFont(font); // Unload sounds UnloadSound(eat); UnloadSound(die); UnloadSound(growl); StopMusicStream(); // Stop music CloseAudioDevice(); // Close audio device CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; }
void UpdateDrawOneFrame(void) { // Update //---------------------------------------------------------------------------------- if (!onTransition) { switch(currentScreen) { case LOADING: { // Update LOADING screen variables framesCounter++; // Count frames if ((loadBarWidth < loadBarMaxWidth) && ((framesCounter%30) == 0)) loadBarWidth++; if (IsKeyDown(KEY_SPACE) && (loadBarWidth < loadBarMaxWidth)) loadBarWidth += 4; if (IsKeyPressed(KEY_ENTER) && (loadBarWidth >= loadBarMaxWidth)) TransitionToScreen(LOGO); } break; case LOGO: { // Update LOGO screen variables if (logoScreenState == 0) // State 0: Small box blinking { framesCounter++; if (framesCounter == 120) { logoScreenState = 1; framesCounter = 0; // Reset counter... will be used later... } } else if (logoScreenState == 1) // State 1: Top and left bars growing { topSideRecWidth += 4; leftSideRecHeight += 4; if (topSideRecWidth == 256) logoScreenState = 2; } else if (logoScreenState == 2) // State 2: Bottom and right bars growing { bottomSideRecWidth += 4; rightSideRecHeight += 4; if (bottomSideRecWidth == 256) { lettersCounter = 0; for (int i = 0; i < strlen(msgBuffer); i++) msgBuffer[i] = ' '; logoScreenState = 3; } } else if (logoScreenState == 3) // State 3: Letters appearing (one by one) { framesCounter++; // Every 12 frames, one more letter! if ((framesCounter%12) == 0) raylibLettersCount++; switch (raylibLettersCount) { case 1: raylib[0] = 'r'; break; case 2: raylib[1] = 'a'; break; case 3: raylib[2] = 'y'; break; case 4: raylib[3] = 'l'; break; case 5: raylib[4] = 'i'; break; case 6: raylib[5] = 'b'; break; default: break; } if (raylibLettersCount >= 10) { // Write raylib description messages if ((framesCounter%2) == 0) lettersCounter++; if (!msgLogoADone) { if (lettersCounter <= strlen(msgLogoA)) strncpy(msgBuffer, msgLogoA, lettersCounter); else { for (int i = 0; i < strlen(msgBuffer); i++) msgBuffer[i] = ' '; lettersCounter = 0; msgLogoADone = true; } } else if (!msgLogoBDone) { if (lettersCounter <= strlen(msgLogoB)) strncpy(msgBuffer, msgLogoB, lettersCounter); else { msgLogoBDone = true; framesCounter = 0; } } } } // Press enter to change to MODULES screen if (IsKeyPressed(KEY_ENTER) && msgLogoBDone) TransitionToScreen(MODULES); else if (IsKeyPressed(KEY_BACKSPACE)) TransitionToScreen(LOGO); } break; case MODULES: { // Update MODULES screen variables here! framesCounter++; if (IsKeyPressed(KEY_RIGHT) && (selectedModule < 5)) { selectedModule++; framesCounter = 0; } else if (IsKeyPressed(KEY_LEFT) && (selectedModule > 0)) { selectedModule--; framesCounter = 0; } if (selectedModule == CORE) { if ((framesCounter > 60) && (windowOffset < 40)) { windowOffset++; ballPosition.x++; ballPosition.y++; } if (framesCounter > 140) { if (IsKeyDown('A')) ballPosition.x -= 5; if (IsKeyDown('D')) ballPosition.x += 5; if (IsKeyDown('W')) ballPosition.y -= 5; if (IsKeyDown('S')) ballPosition.y += 5; if (IsKeyPressed('1')) coreWindow = 1; if (IsKeyPressed('2')) coreWindow = 2; if (IsKeyPressed('3')) coreWindow = 3; if (IsKeyPressed('4')) coreWindow = 4; } } if (selectedModule == TEXTURES) scaleFactor = (sinf(2*PI/240*framesCounter) + 1.0f)/2; if (selectedModule == AUDIO) { if (IsKeyPressed(KEY_SPACE) && !MusicIsPlaying()) PlayMusicStream("resources/audio/guitar_noodling.ogg"); // Play music stream if (IsKeyPressed('S')) { StopMusicStream(); timePlayed = 0.0f; for (int i = 0; i < MAX_BALLS; i++) { soundBallsPosition[i] = (Vector2){ 650 + 560/2 + GetRandomValue(-280, 280), 220 + 200 + GetRandomValue(-200, 200) }; soundBallsColor[i] = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; soundBallsRadius[i] = GetRandomValue(2, 50); soundBallsAlpha[i] = 1.0f; soundBallsActive[i] = false; } } if (MusicIsPlaying()) { timePlayed = GetMusicTimePlayed() / GetMusicTimeLength() * 100 * 4; if ((framesCounter%10) == 0) { for (int i = 0; i < MAX_BALLS; i++) { if (!soundBallsActive[i]) { soundBallsActive[i] = true; break; } } } for (int i = 0; i < MAX_BALLS; i++) { if (soundBallsActive[i]) soundBallsAlpha[i] -= 0.005f; if (soundBallsAlpha[i] <= 0) { soundBallsActive[i] = false; // Reset ball random soundBallsPosition[i] = (Vector2){ 650 + 560/2 + GetRandomValue(-280, 280), 220 + 200 + GetRandomValue(-200, 200) }; soundBallsColor[i] = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; soundBallsRadius[i] = GetRandomValue(2, 60); soundBallsAlpha[i] = 1.0f; } } } if (IsKeyPressed('N')) PlaySound(fxWav); //if (IsKeyPressed('M')) PlaySound(fxOgg); } // Press enter to change to ENDING screen if (IsKeyPressed(KEY_ENTER)) TransitionToScreen(ENDING); else if (IsKeyPressed(KEY_BACKSPACE)) TransitionToScreen(LOGO); } break; case PONG: { // Update SECRET screen variables here! framesCounter++; if (IsKeyPressed('P')) pongPaused = !pongPaused; if (!pongPaused) { pongBallPosition.x += pongBallSpeed.x; pongBallPosition.y += pongBallSpeed.y; if ((pongBallPosition.x >= screenWidth - 5) || (pongBallPosition.x <= 5)) pongBallSpeed.x *= -1; if ((pongBallPosition.y >= screenHeight - 5) || (pongBallPosition.y <= 5)) pongBallSpeed.y *= -1; if (IsKeyDown(KEY_UP) || IsKeyDown('W')) { pongPlayerRec.y -= 5; pongAutoMode = false; pongAutoCounter = 180; } else if (IsKeyDown(KEY_DOWN) || IsKeyDown('S')) { pongPlayerRec.y += 5; pongAutoMode = false; pongAutoCounter = 180; } else if (pongAutoCounter > 0) { pongAutoCounter--; if (pongAutoCounter == 0) pongAutoMode = true; } if ((pongBallPosition.x < 600) && pongAutoMode) { if (pongBallPosition.y > (pongPlayerRec.y + pongPlayerRec.height/2)) pongPlayerRec.y += 5; else if (pongBallPosition.y < (pongPlayerRec.y + pongPlayerRec.height/2)) pongPlayerRec.y -= 5; } if (pongPlayerRec.y <= 0) pongPlayerRec.y = 0; else if ((pongPlayerRec.y + pongPlayerRec.height) >= screenHeight) pongPlayerRec.y = screenHeight - pongPlayerRec.height; if (pongBallPosition.x > screenWidth - 600) { if (pongBallPosition.y > (pongEnemyRec.y + pongEnemyRec.height/2)) pongEnemyRec.y += 5; else if (pongBallPosition.y < (pongEnemyRec.y + pongEnemyRec.height/2)) pongEnemyRec.y -= 5; if (pongEnemyRec.y <= 0) pongEnemyRec.y = 0; else if ((pongEnemyRec.y + pongEnemyRec.height) >= screenHeight) pongEnemyRec.y = screenHeight - pongEnemyRec.height; } if ((CheckCollisionCircleRec(pongBallPosition, 10, pongPlayerRec)) || (CheckCollisionCircleRec(pongBallPosition, 10, pongEnemyRec))) pongBallSpeed.x *= -1; if (pongBallPosition.x >= screenWidth - 5) pongScorePlayer++; else if (pongBallPosition.x <= 5) pongScoreEnemy++; } // Press enter to move back to MODULES screen if (IsKeyPressed(KEY_ENTER)) TransitionToScreen(ENDING); if (IsKeyPressed(KEY_BACKSPACE)) TransitionToScreen(ENDING); } break; case ENDING: { // Update ENDING screen framesCounter++; // Press enter to move back to MODULES screen if (IsKeyPressed(KEY_ENTER)) TransitionToScreen(PONG); if (IsKeyPressed(KEY_BACKSPACE)) TransitionToScreen(MODULES); } break; default: break; } if ((currentScreen != LOADING) && (timeCounter < totalTime)) timeCounter++; } else UpdateTransition(); // Update transition (fade-in, fade-out) //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(RAYWHITE); switch(currentScreen) { case LOADING: { // Draw LOADING screen if ((loadBarWidth < loadBarMaxWidth) && ((framesCounter/40)%2)) DrawText(msgLoading, 360, 240, 40, DARKGRAY); DrawRectangle(360 - 4, 300 - 4, loadBarMaxWidth + 8, 60 + 8, LIGHTGRAY); DrawRectangle(360, 300, loadBarWidth - 1, 60, DARKGRAY); DrawRectangleLines(360 - 4, 300 - 5, loadBarMaxWidth + 8, 60 + 8, DARKGRAY); if (loadBarWidth >= loadBarMaxWidth) { //DrawText(msgLoading, 360, 240, 40, DARKGRAY); if ((framesCounter/30)%2) DrawText(msgPressEnter, screenWidth/2 - MeasureText(msgPressEnter, 40)/2 + 20, 400, 40, DARKGRAY); } else DrawText("PRESS SPACE to ACCELERATE LOADING! ;)", screenWidth/2 - 200, 400, 20, LIGHTGRAY); } break; case LOGO: { // Draw LOGO screen if (logoScreenState == 0) { if ((framesCounter/15)%2) DrawRectangle(logoPositionX, logoPositionY - 60, 16, 16, BLACK); } else if (logoScreenState == 1) { DrawRectangle(logoPositionX, logoPositionY - 60, topSideRecWidth, 16, BLACK); DrawRectangle(logoPositionX, logoPositionY - 60, 16, leftSideRecHeight, BLACK); } else if (logoScreenState == 2) { DrawRectangle(logoPositionX, logoPositionY - 60, topSideRecWidth, 16, BLACK); DrawRectangle(logoPositionX, logoPositionY - 60, 16, leftSideRecHeight, BLACK); DrawRectangle(logoPositionX + 240, logoPositionY - 60, 16, rightSideRecHeight, BLACK); DrawRectangle(logoPositionX, logoPositionY + 240 - 60, bottomSideRecWidth, 16, BLACK); } else if (logoScreenState == 3) { DrawRectangle(logoPositionX, logoPositionY - 60, topSideRecWidth, 16, BLACK); DrawRectangle(logoPositionX, logoPositionY + 16 - 60, 16, leftSideRecHeight - 32, BLACK); DrawRectangle(logoPositionX + 240, logoPositionY + 16 - 60, 16, rightSideRecHeight - 32, BLACK); DrawRectangle(logoPositionX, logoPositionY + 240 - 60, bottomSideRecWidth, 16, BLACK); DrawRectangle(screenWidth/2 - 112, screenHeight/2 - 112 - 60, 224, 224, RAYWHITE); DrawText(raylib, screenWidth/2 - 44, screenHeight/2 + 48 - 60, 50, BLACK); if (!msgLogoADone) DrawText(msgBuffer, screenWidth/2 - MeasureText(msgLogoA, 30)/2, 460, 30, GRAY); else { DrawText(msgLogoA, screenWidth/2 - MeasureText(msgLogoA, 30)/2, 460, 30, GRAY); if (!msgLogoBDone) DrawText(msgBuffer, screenWidth/2 - MeasureText(msgLogoB, 30)/2, 510, 30, GRAY); else { DrawText(msgLogoB, screenWidth/2 - MeasureText(msgLogoA, 30)/2, 510, 30, GRAY); if ((framesCounter > 90) && ((framesCounter/30)%2)) DrawText("PRESS ENTER to CONTINUE", 930, 650, 20, GRAY); } } } } break; case MODULES: { // Draw MODULES screen DrawTexture(raylibLogoB, 40, 40, WHITE); DrawText("raylib is composed of 6 main modules:", 128 + 40 + 30, 50, 20, GRAY); if (framesCounter < 120) { if (((framesCounter/30)%2) == 0) DrawRectangle(128 + 40 + 30 - 4 + 175*selectedModule, 128 + 40 - 70 - 8 - 4, 158, 78, RED); } else DrawRectangle(128 + 40 + 30 - 4 + 175*selectedModule, 128 + 40 - 70 - 8 - 4, 158, 78, RED); if (selectedModule != AUDIO) { DrawTriangle((Vector2){950 - 40, 685 - 10}, (Vector2){950 - 60, 685}, (Vector2){950 - 40, 685 + 10}, GRAY); DrawTriangle((Vector2){950 - 30, 685 - 10}, (Vector2){950 - 30, 685 + 10}, (Vector2){950 - 10, 685}, GRAY); DrawText("PRESS RIGHT or LEFT to EXPLORE MODULES", 960, 680, 10, GRAY); } switch (selectedModule) { case CORE: { DrawText("This module give you functions to:", 48, 200, 10, GetColor(0x5c5a5aff)); DrawTextEx(fontRomulus, "Open-Close Window", (Vector2){ 48, 230 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x5c5a5aff)); DrawTextEx(fontRomulus, "Manage Drawing Area", (Vector2){ 48, 260 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x5c5a5aff)); DrawTextEx(fontRomulus, "Manage Inputs", (Vector2){ 48, 290 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x5c5a5aff)); DrawTextEx(fontRomulus, "Manage Timming", (Vector2){ 48, 320 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x5c5a5aff)); DrawTextEx(fontRomulus, "Auxiliar Functions", (Vector2){ 48, 350 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x5c5a5aff)); switch (coreWindow) { case 1: DrawTexture(raylibWindow, 520, 220, WHITE); break; case 2: DrawTextureEx(raylibWindow01, (Vector2){ 450, 220 - 45 }, 0.0f, 4.0f, WHITE); break; case 3: DrawTextureEx(raylibWindow02, (Vector2){ 430, 220 - 40 }, 0.0f, 4.0f, WHITE); break; case 4: DrawTextureEx(raylibWindow03, (Vector2){ 470, 220 - 65 }, 0.0f, 4.0f, WHITE); break; default: DrawTexture(raylibWindow, 520, 220, WHITE); break; } if (framesCounter > 140) DrawText("Check the possible windows raylib can run on. PRESS KEY: 1, 2, 3 or 4", 520 + 8 + windowOffset + 160, 220 + windowOffset + 10, 10, LIGHTGRAY); DrawText("Compile raylib C code for the folowing platforms:", 48, 400, 10, MAROON); DrawTextureRec(platforms, (Rectangle){ 0, 0, platforms.width, platforms.height}, (Vector2){ 75, 420 }, WHITE); DrawRectangle(520 + 8 + windowOffset, 220 + 31 + windowOffset, 640, 360, RAYWHITE); DrawRectangleLines(520 + 8 + windowOffset - 1, 220 + 31 + windowOffset - 2, 640 + 2, 360 + 2, GRAY); DrawFPS(520 + 8 + windowOffset + 10, 220 + 31 + windowOffset + 10); DrawRectangle(ballPosition.x - 50, ballPosition.y - 50, 100, 100, Fade(MAROON, 0.5f)); DrawRectangleRec(GetCollisionRec((Rectangle){ 520 + 8 + windowOffset - 1, 220 + 31 + windowOffset - 1, 640 + 2, 360 + 2 }, (Rectangle){ (int)ballPosition.x - 50, (int)ballPosition.y - 50, 100, 100 }), MAROON); if (framesCounter > 140) { DrawTextEx(fontMecha, "MOVE ME", (Vector2){ ballPosition.x - 26, ballPosition.y - 20 }, GetFontBaseSize(fontMecha), 2, BLACK); DrawTextEx(fontMecha, "[ W A S D ]", (Vector2){ ballPosition.x - 36, ballPosition.y }, GetFontBaseSize(fontMecha), 2, BLACK); } } break; case SHAPES: { DrawText("This module give you functions to:", 48, 200, 10, GetColor(0xcd5757ff)); DrawTextEx(fontRomulus, "Draw Basic Shapes", (Vector2){ 48, 230 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0xcd5757ff)); DrawTextEx(fontRomulus, "Basic Collision Detection", (Vector2){ 48, 260 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0xcd5757ff)); DrawCircle(screenWidth/4, 120 + 240, 35, DARKBLUE); DrawCircleGradient(screenWidth/4, 220 + 240, 60, GREEN, SKYBLUE); DrawCircleLines(screenWidth/4, 340 + 240, 80, DARKBLUE); DrawRectangle(screenWidth/4*2 - 110, 100 + 180, 220, 100, LIME); DrawRectangleGradient(screenWidth/4*2 - 90, 170 + 240, 180, 130, MAROON, GOLD); DrawRectangleLines(screenWidth/4*2 - 80, 320 + 240, 160, 80, ORANGE); DrawTriangle((Vector2){screenWidth/4*3, 60 + 220}, (Vector2){screenWidth/4*3 - 60, 160 + 220}, (Vector2){screenWidth/4*3 + 60, 160 + 220}, VIOLET); DrawTriangleLines((Vector2){screenWidth/4*3, 140 + 220}, (Vector2){screenWidth/4*3 - 60, 210 + 260}, (Vector2){screenWidth/4*3 + 60, 210 + 260}, SKYBLUE); DrawPoly((Vector2){screenWidth/4*3, 320 + 240}, 6, 80, 0, BROWN); } break; case TEXTURES: { DrawText("This module give you functions to:", 48, 200, 10, GetColor(0x60815aff)); DrawTextEx(fontRomulus, "Load Images and Textures", (Vector2){ 48, 230 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x60815aff)); DrawTextEx(fontRomulus, "Draw Textures", (Vector2){ 48, 260 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x60815aff)); DrawRectangle(138, 348, 260, 260, GRAY); DrawTexturePro(lena, (Rectangle){ 0, 0, lena.width, lena.height }, (Rectangle){ 140 + 128, 350 + 128, lena.width/2*scaleFactor, lena.height/2*scaleFactor }, (Vector2){ lena.width/4*scaleFactor, lena.height/4*scaleFactor }, 0.0f, WHITE); DrawTexture(lena, 600, 180, Fade(WHITE, 0.3f)); DrawTextureRec(lena, (Rectangle){ 225, 240, 155, 50 }, (Vector2){ 600 + 256 - 82 + 50, 180 + 241 }, PINK); DrawTexturePro(mandrill, (Rectangle){ 0, 0, mandrill.width, mandrill.height }, (Rectangle){ screenWidth/2 - 40, 350 + 128, mandrill.width/2, mandrill.height/2 }, (Vector2){ mandrill.width/4, mandrill.height/4 }, framesCounter, GOLD); } break; case TEXT: { DrawText("This module give you functions to:", 48, 200, 10, GetColor(0x377764ff)); DrawTextEx(fontRomulus, "Load SpriteFonts", (Vector2){ 48, 230 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x377764ff)); DrawTextEx(fontRomulus, "Draw Text", (Vector2){ 48, 260 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x377764ff)); DrawTextEx(fontRomulus, "Text Formatting", (Vector2){ 48, 290 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x377764ff)); DrawTexture(texAlagard, 60, 360, WHITE); DrawTextEx(fontMechaC, msg1, (Vector2){ 540 + 168, 210 }, GetFontBaseSize(fontMechaC), -3, WHITE); DrawTextEx(fontAlagardC, msg2, (Vector2){ 460 + 140, 260 }, GetFontBaseSize(fontAlagardC), -2, WHITE); DrawTextEx(fontJupiterC, msg3, (Vector2){ 640 + 70, 300 }, GetFontBaseSize(fontJupiterC), 2, WHITE); DrawTextEx(fontAlagard, "It also includes some...", (Vector2){ 650 + 70, 400 }, GetFontBaseSize(fontAlagard)*2, 2, MAROON); DrawTextEx(fontPixelplay, "...free fonts in rBMF format...", (Vector2){ 705 - 26, 450 }, GetFontBaseSize(fontPixelplay)*2, 4, ORANGE); DrawTextEx(fontMecha, "...to be used even in...", (Vector2){ 700 + 40, 500 }, GetFontBaseSize(fontMecha)*2, 4, DARKGREEN); DrawTextEx(fontSetback, "...comercial projects...", (Vector2){ 710, 550 }, GetFontBaseSize(fontSetback)*2, 4, DARKBLUE); DrawTextEx(fontRomulus, "...completely for free!", (Vector2){ 710 + 17, 600 }, GetFontBaseSize(fontRomulus)*2, 3, DARKPURPLE); DrawText("This is a custom font spritesheet, raylib can load it automatically!", 228, 360 + 295, 10, GRAY); } break; case MODELS: { DrawText("This module give you functions to:", 48, 200, 10, GetColor(0x417794ff)); DrawTextEx(fontRomulus, "Draw Geometric Models", (Vector2){ 48, 230 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x417794ff)); DrawTextEx(fontRomulus, "Load 3D Models", (Vector2){ 48, 260 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x417794ff)); DrawTextEx(fontRomulus, "Draw 3D Models", (Vector2){ 48, 290 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x417794ff)); Begin3dMode(camera); DrawCube((Vector3){-4, 0, 2}, 2, 5, 2, RED); DrawCubeWires((Vector3){-4, 0, 2}, 2, 5, 2, GOLD); DrawCubeWires((Vector3){-4, 0, -2}, 3, 6, 2, MAROON); DrawSphere((Vector3){-1, 0, -2}, 1, GREEN); DrawSphereWires((Vector3){1, 0, 2}, 2, 16, 16, LIME); DrawCylinder((Vector3){4, 0, -2}, 1, 2, 3, 4, SKYBLUE); DrawCylinderWires((Vector3){4, 0, -2}, 1, 2, 3, 4, DARKBLUE); DrawCylinderWires((Vector3){4.5, -1, 2}, 1, 1, 2, 6, BROWN); DrawCylinder((Vector3){1, 0, -4}, 0, 1.5, 3, 8, GOLD); DrawCylinderWires((Vector3){1, 0, -4}, 0, 1.5, 3, 8, PINK); DrawModelEx(cat, (Vector3){ 8.0f, 0.0f, 2.0f }, (Vector3){ 0.0f, 0.5f*framesCounter, 0.0f }, (Vector3){ 0.1f, 0.1f, 0.1f }, WHITE); DrawGizmo((Vector3){ 8.0f, 0.0f, 2.0f }); DrawGrid(10.0, 1.0); // Draw a grid End3dMode(); DrawFPS(900, 220); } break; case AUDIO: { DrawText("This module give you functions to:", 48, 200, 10, GetColor(0x8c7539ff)); DrawTextEx(fontRomulus, "Load and Play Sounds", (Vector2){ 48, 230 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x8c7539ff)); DrawTextEx(fontRomulus, "Play Music (streaming)", (Vector2){ 48, 260 }, GetFontBaseSize(fontRomulus)*2, 4, GetColor(0x8c7539ff)); DrawText("PRESS SPACE to START PLAYING MUSIC", 135, 350, 20, GRAY); DrawRectangle(150, 390, 400, 12, LIGHTGRAY); DrawRectangle(150, 390, (int)timePlayed, 12, MAROON); if (MusicIsPlaying()) { DrawText("PRESS 'S' to STOP PLAYING MUSIC", 165, 425, 20, GRAY); for (int i = 0; i < MAX_BALLS; i++) { if (soundBallsActive[i]) DrawPoly(soundBallsPosition[i], 18, soundBallsRadius[i], 0.0f, Fade(soundBallsColor[i], soundBallsAlpha[i])); } } DrawText("PRESS 'N' to PLAY a SOUND", 200, 540, 20, VIOLET); if ((framesCounter/30)%2) DrawText("PRESS ENTER to CONTINUE", 930, 650, 20, GRAY); } break; default: break; } // Draw modules menu DrawRectangle(128 + 40 + 30, 128 + 40 - 70 - 8, 150, 70, GetColor(0x898888ff)); DrawRectangle(128 + 40 + 30 + 8, 128 + 40 - 70, 150 - 16, 70 - 16, GetColor(0xe1e1e1ff)); DrawText("CORE", 128 + 40 + 30 + 8 + 38, 128 + 40 - 50, 20, GetColor(0x5c5a5aff)); DrawRectangle(128 + 40 + 30 + 175, 128 + 40 - 70 - 8, 150, 70, GetColor(0xe66666ff)); DrawRectangle(128 + 40 + 30 + 8 + 175, 128 + 40 - 70, 150 - 16, 70 - 16, GetColor(0xf0d6d6ff)); DrawText("SHAPES", 128 + 40 + 30 + 8 + 175 + 28, 128 + 40 - 50, 20, GetColor(0xcd5757ff)); DrawRectangle(128 + 40 + 30 + 175*2, 128 + 40 - 70 - 8, 150, 70, GetColor(0x75a06dff)); DrawRectangle(128 + 40 + 30 + 8 + 175*2, 128 + 40 - 70, 150 - 16, 70 - 16, GetColor(0xc8eabfff)); DrawText("TEXTURES", 128 + 40 + 30 + 175*2 + 8 + 9, 128 + 40 - 50, 20, GetColor(0x60815aff)); DrawRectangle(128 + 40 + 30 + 175*3, 128 + 40 - 70 - 8, 150, 70, GetColor(0x52b296ff)); DrawRectangle(128 + 40 + 30 + 8 + 175*3, 128 + 40 - 70, 150 - 16, 70 - 16, GetColor(0xbef0ddff)); DrawText("TEXT", 128 + 40 + 30 + 8 + 175*3 + 38, 128 + 40 - 50, 20, GetColor(0x377764ff)); DrawRectangle(128 + 40 + 30 + 175*4, 128 + 40 - 70 - 8, 150, 70, GetColor(0x5d9cbdff)); DrawRectangle(128 + 40 + 30 + 8 + 175*4, 128 + 40 - 70, 150 - 16, 70 - 16, GetColor(0xbedce8ff)); DrawText("MODELS", 128 + 40 + 30 + 8 + 175*4 + 28, 128 + 40 - 50, 20, GetColor(0x417794ff)); DrawRectangle(128 + 40 + 30 + 175*5, 128 + 40 - 70 - 8, 150, 70, GetColor(0xd3b157ff)); DrawRectangle(128 + 40 + 30 + 8 + 175*5, 128 + 40 - 70, 150 - 16, 70 - 16, GetColor(0xebddaeff)); DrawText("AUDIO", 128 + 40 + 30 + 8 + 175*5 + 36, 128 + 40 - 50, 20, GetColor(0x8c7539ff)); } break; case ENDING: { // Draw ENDING screen DrawTextEx(fontAlagard, "LEARN VIDEOGAMES PROGRAMMING", (Vector2){ screenWidth/2 - MeasureTextEx(fontAlagard, "LEARN VIDEOGAMES PROGRAMMING", GetFontBaseSize(fontAlagard)*4, 4).x/2, 80 }, GetFontBaseSize(fontAlagard)*4, 4, MAROON); DrawTexture(raylibLogoA, logoPositionX, logoPositionY - 40, WHITE); DrawText(msgWeb, screenWidth/2 - MeasureText(msgWeb, 40)/2, 470, 40, DARKGRAY); if (framesCounter > 60) DrawText(msgCredits, screenWidth/2 - MeasureText(msgCredits, 30)/2, 550, 30, GRAY); if (framesCounter > 120) if ((framesCounter/30)%2) DrawText("PRESS ENTER to CONTINUE", screenWidth/2 - MeasureText("PRESS ENTER to CONTINUE", 20)/2, 640, 20, LIGHTGRAY); } break; case PONG: { // Pong DrawCircleV(pongBallPosition, 10, LIGHTGRAY); DrawRectangleRec(pongPlayerRec, GRAY); DrawRectangleRec(pongEnemyRec, GRAY); DrawText(FormatText("%02i", pongScorePlayer), 150, 10, 80, LIGHTGRAY); DrawText(FormatText("%02i", pongScoreEnemy), screenWidth - MeasureText("00", 80) - 150, 10, 80, LIGHTGRAY); if (pongPaused) if ((framesCounter/30)%2) DrawText("GAME PAUSED [P]", screenWidth/2 - 100, 40, 20, MAROON); } break; default: break; } if (currentScreen != LOADING) DrawRectangle(0, screenHeight - 10, ((float)timeCounter/(float)totalTime)*screenWidth, 10, LIGHTGRAY); if (onTransition) DrawTransition(); EndDrawing(); //---------------------------------------------------------------------------------- }
int main() { // Initialization //-------------------------------------------------------------------------------------- int screenWidth = 800; int screenHeight = 450; InitWindow(screenWidth, screenHeight, "raylib [audio] example - music playing (streaming)"); InitAudioDevice(); // Initialize audio device PlayMusicStream("resources/audio/guitar_noodling.ogg"); // Play music stream int framesCounter = 0; float timePlayed = 0.0f; //float volume = 1.0; SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- framesCounter++; // Testing music fading from one file to another /* if (framesCounter > 600) // Wait for 10 seconds (600 frames) { volume -= 0.01; // Decrement music volume level // When music volume level equal or lower than 0, // restore volume level and init another music file if (volume <= 0) { volume = 1.0; framesCounter = 0; PlayMusicStream("resources/audio/another_file.ogg"); } SetMusicVolume(volume); } */ if (IsWindowMinimized()) PauseMusicStream(); else ResumeMusicStream(); timePlayed = GetMusicTimePlayed()/GetMusicTimeLength()*100*4; // We scale by 4 to fit 400 pixels UpdateMusicStream(); // Update music buffer with new stream data //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); ClearBackground(RAYWHITE); DrawText("MUSIC SHOULD BE PLAYING!", 255, 200, 20, LIGHTGRAY); DrawRectangle(200, 250, 400, 12, LIGHTGRAY); DrawRectangle(200, 250, (int)timePlayed, 12, MAROON); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- CloseAudioDevice(); // Close audio device (music streaming is automatically stopped) CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; }
//---------------------------------------------------------------------------------- // Main entry point //---------------------------------------------------------------------------------- int main(void) { // Initialization //--------------------------------------------------------- InitWindow(screenWidth, screenHeight, "GGJ16 - LIGHT MY RITUAL!"); // Global data loading (assets that must be available in all screens, i.e. fonts) InitAudioDevice(); Image image = LoadImage("resources/lights_map.png"); // Load image in CPU memory (RAM) lightsMap = GetImageData(image); // Get image pixels data as an array of Color lightsMapWidth = image.width; lightsMapHeight = image.height; UnloadImage(image); // Unload image from CPU memory (RAM) font = LoadSpriteFont("resources/font_arcadian.png"); //doors = LoadTexture("resources/textures/doors.png"); //sndDoor = LoadSound("resources/audio/door.ogg"); music = LoadMusicStream("resources/audio/ambient.ogg"); PlayMusicStream(music); SetMusicVolume(music, 1.0f); // Setup and Init first screen currentScreen = LOGO_RL; //InitTitleScreen(); //InitGameplayScreen(); rlInitLogoScreen(); #if defined(PLATFORM_WEB) emscripten_set_main_loop(UpdateDrawFrame, 0, 1); #else SetTargetFPS(60); // Set our game to run at 60 frames-per-second //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { UpdateDrawFrame(); } #endif // De-Initialization //-------------------------------------------------------------------------------------- switch (currentScreen) { case LOGO_RL: rlUnloadLogoScreen(); break; case TITLE: UnloadTitleScreen(); break; case GAMEPLAY: UnloadGameplayScreen(); break; default: break; } // Unload all global loaded data (i.e. fonts) here! UnloadSpriteFont(font); //UnloadSound(sndDoor); UnloadMusicStream(music); free(lightsMap); CloseAudioDevice(); CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; }