@import("basic.felan"); raylib :: @c_library("/usr/lib/libraylib.so.5.5.0"); InitWindow :: @c_function(raylib,"InitWindow",(i32,i32,*u8)->void); SetTargetFPS :: @c_function(raylib,"SetTargetFPS",(i32)->void); WindowShouldClose :: @c_function(raylib,"WindowShouldClose",()->bool); CloseWindow :: @c_function(raylib,"CloseWindow",()->void); BeginDrawing :: @c_function(raylib,"BeginDrawing",()->void); ClearBackground :: @c_function(raylib,"ClearBackground",(Color)->void); EndDrawing :: @c_function(raylib,"EndDrawing",()->void); IsKeyPressed :: @c_function(raylib,"IsKeyPressed",(i32)->bool); IsGestureDetected :: @c_function(raylib,"IsGestureDetected",(u32)->bool); DrawText :: @c_function(raylib,"DrawText",(*u8,i32,i32,i32,Color)->void); DrawRectangle :: @c_function(raylib,"DrawRectangle",(i32,i32,i32,i32,Color)->void); GetFPS :: @c_function(raylib,"GetFPS",()->i32); Color :: struct { r:u8; g:u8; b:u8; a:u8; }; KEY_ENTER :: 257i32; GESTURE_TAP :: 1u32; LOGO :: 0; TITLE :: 1; GAMEPLAY :: 2; ENDING :: 3; main :: () -> void { SCREEN_WIDTH :: 800i32; SCREEN_HEIGHT :: 450i32; RAYWHITE :: color(245u8,245u8,245u8,255u8); LIGHTGRAY :: color(200u8,200u8,200u8,255u8); GRAY :: color(130u8,130u8,130u8,255u8); GREEN :: color(0u8,228u8,48u8,255u8); DARKGREEN :: color(0u8,117u8,44u8,255u8); BLUE :: color(0u8,121u8,241u8,255u8); DARKBLUE :: color(0u8,82u8,172u8,255u8); PURPLE :: color(200u8,122u8,255u8,255u8); MAROON :: color(100u8,33u8,55u8,255u8); title := "Hello\0"; InitWindow(SCREEN_WIDTH,SCREEN_HEIGHT,title.ptr); currentScreen := LOGO; framesCounter := 0; SetTargetFPS(144i32); while(!WindowShouldClose()){ if currentScreen == LOGO { framesCounter += 1; if framesCounter > 120 { currentScreen = TITLE; } } else if currentScreen == TITLE { if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) { currentScreen = GAMEPLAY; } } else if currentScreen == GAMEPLAY { if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) { currentScreen = ENDING; } } else if currentScreen == ENDING { if IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP) { currentScreen = TITLE; } } BeginDrawing(); if currentScreen == LOGO { drawLogo(); } else if currentScreen == TITLE { ClearBackground(GREEN); title := "TITLE SCREEN\0"; DrawText(title.ptr,20i32,20i32,40i32,DARKGREEN); text := "PRESS ENTER or TAP to JUMP to GAMEPLAY SCREEN\0"; DrawText(text.ptr,120i32,220i32,20i32,DARKGREEN); } else if currentScreen == GAMEPLAY { drawGamePlay(); } else if currentScreen == ENDING { ClearBackground(BLUE); title := "ENDING SCREEN\0"; DrawText(title.ptr,20i32,20i32,40i32,DARKBLUE); text := "PRESS ENTER or TAP to RETURN to TITLE SCREEN\0"; DrawText(text.ptr,120i32,220i32,20i32,DARKBLUE); } else { println(-1); return; } EndDrawing(); } CloseWindow(); }; drawLogo :: () -> void { ClearBackground(RAYWHITE); title := "LOGO SCREEN\0"; DrawText(title.ptr,20i32,20i32,40i32,LIGHTGRAY); text := "WAIT for 2 SECONDS...\0"; DrawText(text.ptr,290i32,220i32,20i32,LIGHTGRAY); }; x := 0i32; y := 0i32; dx := 1i32; dy := 1i32; RECT_SIZE :: 40i32; drawGamePlay :: () -> void { ClearBackground(PURPLE); title := "GAMEPLAY SCREEN\0"; DrawText(title.ptr,20i32,20i32,40i32,MAROON); text := "PRESS ENTER or TAP to JUMP to ENDING SCREEN\0"; DrawText(text.ptr,130i32,220i32,20i32,MAROON); DrawRectangle(x,y,RECT_SIZE,RECT_SIZE,MAROON); x += dx; y += dy; if x <= 0i32 { dx = 1i32; } else if x+RECT_SIZE >= SCREEN_WIDTH { dx = -1i32; } if y <= 0i32 { dy = 1i32; } else if y+RECT_SIZE >= SCREEN_HEIGHT { dy = -1i32; } }; color :: (r:u8,g:u8,b:u8,a:u8)->Color { result:Color = undefined; result.r = r; result.g = g; result.b = b; result.a = a; return result; }; color :: (value : u32) -> Color { result:Color = undefined; result.r = @cast(value >> @cast(3*8,u32),u8); result.g = @cast(value >> @cast(2*8,u32),u8); result.b = @cast(value >> @cast(1*8,u32),u8); result.a = @cast(value >> @cast(0*8,u32),u8); return result; };