201 lines
4.2 KiB
Odin
201 lines
4.2 KiB
Odin
package main
|
|
|
|
import hm "core:container/handle_map"
|
|
import "core:fmt"
|
|
import rl "vendor:raylib"
|
|
|
|
SCREEN_W :: 1280
|
|
SCREEN_H :: 720
|
|
|
|
|
|
MAX_ENEMIES :: 10
|
|
MAX_TILES :: 4096
|
|
|
|
Scene :: struct {
|
|
player: Player,
|
|
camera: rl.Camera2D,
|
|
enemies: hm.Static_Handle_Map(128, Enemy, ent_handle),
|
|
atlas: Atlas,
|
|
map_tex: rl.RenderTexture2D,
|
|
}
|
|
|
|
|
|
create_scene :: proc() -> Scene {
|
|
scene := Scene {
|
|
player = Player {
|
|
position = rl.Vector2{100, 100},
|
|
hp = 100,
|
|
walk_speed = 300,
|
|
run_speed = 500,
|
|
col = 32,
|
|
},
|
|
camera = rl.Camera2D {
|
|
zoom = 1,
|
|
offset = rl.Vector2{SCREEN_W / 2, SCREEN_H / 2},
|
|
},
|
|
}
|
|
// _ = hm.add(
|
|
// &scene.enemies,
|
|
// Enemy {
|
|
// position = rl.Vector2{500, 500},
|
|
// hp = 100,
|
|
// speed = 100,
|
|
// col = 32,
|
|
// },
|
|
// )
|
|
// _ = hm.add(
|
|
// &scene.enemies,
|
|
// Enemy {
|
|
// position = rl.Vector2{600, 600},
|
|
// hp = 100,
|
|
// speed = 100,
|
|
// col = 32,
|
|
// },
|
|
// )
|
|
|
|
scene.atlas = load_atlas()
|
|
|
|
|
|
// append(
|
|
// &scene.tiles,
|
|
// Tile{atlas = &scene.atlas, pos = rl.Vector2{0, 0}, frame = 3},
|
|
// )
|
|
return scene
|
|
}
|
|
|
|
draw_scene :: proc(scene: ^Scene) {
|
|
rl.BeginMode2D(scene.camera)
|
|
|
|
rl.DrawTexturePro(
|
|
scene.map_tex.texture,
|
|
rl.Rectangle {
|
|
0,
|
|
0,
|
|
cast(f32)scene.map_tex.texture.width,
|
|
cast(f32)scene.map_tex.texture.height,
|
|
},
|
|
rl.Rectangle {
|
|
0,
|
|
0,
|
|
cast(f32)scene.map_tex.texture.width * TILE_MULT,
|
|
cast(f32)scene.map_tex.texture.height * TILE_MULT,
|
|
},
|
|
rl.Vector2{0, 0},
|
|
0,
|
|
rl.WHITE,
|
|
)
|
|
|
|
// for tile in scene.tiles {
|
|
// if tile.atlas == nil do continue
|
|
// draw_tile(tile)
|
|
// }
|
|
|
|
rl.DrawCircle(
|
|
cast(i32)scene.player.position.x,
|
|
cast(i32)scene.player.position.y,
|
|
32,
|
|
rl.GREEN,
|
|
)
|
|
rl.DrawRectangle(300, 300, 100, 100, rl.BLUE)
|
|
|
|
it := hm.iterator_make(&scene.enemies)
|
|
for i, _ in hm.iterate(&it) {
|
|
rl.DrawCircle(cast(i32)i.position.x, cast(i32)i.position.y, 32, rl.RED)
|
|
}
|
|
|
|
|
|
rl.EndMode2D()
|
|
}
|
|
|
|
render_map :: proc(atlas: ^Atlas) -> rl.RenderTexture2D {
|
|
map_data := [16][16]i32 {
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10},
|
|
{16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18},
|
|
}
|
|
width := i32(atlas.tile_size.x) * 16
|
|
height := i32(atlas.tile_size.y) * 16
|
|
tex := rl.LoadRenderTexture(width, height)
|
|
rl.BeginTextureMode(tex)
|
|
for row, i in map_data {
|
|
for col, j in row {
|
|
offset := get_offset(atlas, col)
|
|
fmt.printf("offset: %v, frame: %v\n", offset, col)
|
|
rl.DrawTexturePro(
|
|
atlas^.tex,
|
|
rl.Rectangle {
|
|
offset.x,
|
|
offset.y,
|
|
atlas.tile_size.x,
|
|
atlas.tile_size.y,
|
|
},
|
|
rl.Rectangle {
|
|
f32(j) * atlas.tile_size.x,
|
|
f32(i) * atlas.tile_size.y,
|
|
atlas.tile_size.x,
|
|
atlas.tile_size.y,
|
|
},
|
|
rl.Vector2{0, 0},
|
|
0,
|
|
rl.WHITE,
|
|
)
|
|
}
|
|
}
|
|
rl.EndTextureMode()
|
|
return tex
|
|
}
|
|
|
|
|
|
update_scene :: proc(scene: ^Scene, dt: f32) {
|
|
update_player(&scene.player, dt)
|
|
scene.camera.target = scene.player.position
|
|
|
|
it := hm.iterator_make(&scene.enemies)
|
|
for i, _ in hm.iterate(&it) {
|
|
dir := rl.Vector2Normalize(scene.player.position - i.position)
|
|
i.position += dir * i.speed * dt
|
|
}
|
|
|
|
resolve_collisions(scene)
|
|
}
|
|
|
|
Row :: distinct [16]i32
|
|
|
|
|
|
main :: proc() {
|
|
fmt.println("Hello, world!")
|
|
|
|
|
|
rl.InitWindow(SCREEN_W, SCREEN_H, "HUI")
|
|
defer rl.CloseWindow()
|
|
rl.SetTargetFPS(60)
|
|
|
|
//WARN: Add a destructor to free (handlemap dangling)
|
|
scene := create_scene()
|
|
scene.map_tex = render_map(&scene.atlas)
|
|
|
|
for !rl.WindowShouldClose() {
|
|
dt := rl.GetFrameTime()
|
|
update_scene(&scene, dt)
|
|
rl.BeginDrawing()
|
|
{
|
|
rl.ClearBackground(rl.BLACK)
|
|
draw_scene(&scene)
|
|
}
|
|
rl.EndDrawing()
|
|
}
|
|
}
|