commit 195b54835c33a6b5846faf747c6d63171f386a9e Author: Joseph Ferano Date: Sat Sep 7 13:05:06 2024 +0700 Init project diff --git a/game.odin b/game.odin new file mode 100644 index 0000000..db55778 --- /dev/null +++ b/game.odin @@ -0,0 +1,109 @@ +package game + +import rl "vendor:raylib" +import "core:math" +import "core:math/rand" +import "core:fmt" + +Vec2 :: [2]f32 +Rect :: rl.Rectangle +Img :: rl.Image +Tex :: rl.Texture +Key :: rl.KeyboardKey + +SCREEN_WIDTH : i32 = 1000 +SCREEN_HEIGHT : i32 = 800 +BW := f32(SCREEN_WIDTH) +BH := f32(SCREEN_HEIGHT) + +BULLET_SPEED : f32 = 7.5 +BULLET_RADIUS : f32 = 5 + +ANGULAR_SPEED : f32 = 0.045 +THRUST_SPEED : f32 = 2.3 + +Player :: struct { + pos: Vec2, + points: [4]Vec2, + angle: f32, + vel: Vec2 +} + +Bullet :: struct { + pos: Vec2, + vel: Vec2, +} + +GameState :: struct { + dt: f32, + keymap: map[string]Key, + player: Player, + bullets: [dynamic]Bullet, +} + +init_state :: proc() -> ^GameState { + keymap := make(map[string]Key) + keymap["Left"] = .A + keymap["Right"] = .D + keymap["Up"] = .W + keymap["Down"] = .S + + state := GameState { + keymap = keymap, + } + cloned := new_clone(state) + return cloned +} + +player_input :: proc(using s: ^GameState) { + if rl.IsKeyDown(.D) { + player.angle += ANGULAR_SPEED + } + if rl.IsKeyDown(.A) { + player.angle -= ANGULAR_SPEED + } + if rl.IsKeyDown(.W) { + player.vel.x += math.cos(player.angle) + player.vel.y += math.sin(player.angle) + } + if rl.IsKeyPressed(.SPACE) { + b_vel := Vec2{ math.cos(player.angle) , math.sin(player.angle) } * BULLET_SPEED + append(&s.bullets, Bullet{player.points[0], b_vel}) + } +} + +update :: proc(using s: ^GameState) { + player.pos += player.vel * (THRUST_SPEED * s.dt) +} + +draw :: proc(using s: ^GameState) { + rl.DrawCircleV(player.pos, 10, rl.BLACK) + rect := Rect{player.pos.x, player.pos.y, 20, 5} + rl.DrawRectanglePro(rect, Vec2{0,2.5}, player.angle * rl.RAD2DEG, rl.BLACK) +} + +main :: proc() { + rl.SetTraceLogLevel(.ERROR) + rl.InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "F&M") + rl.SetTargetFPS(60) + + state := init_state() + defer free(state) + + for !rl.WindowShouldClose() { + state.dt = rl.GetFrameTime() + + player_input(state) + + update(state) + + rl.BeginDrawing() + rl.ClearBackground(rl.WHITE) + + draw(state) + + rl.EndDrawing() + } + + rl.CloseWindow() +}