From 799e5ad9eba238f1819aab0c6e338eb192601874 Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Sat, 10 Feb 2024 23:04:35 +0200 Subject: [PATCH 1/6] added different scaling, breaking change --- main.odin | 94 +++++++++++++++++++++++++--------------------------- screens.odin | 21 +++++++----- sprites.odin | 1 + state.odin | 33 ++++++++++++++++++ 4 files changed, 92 insertions(+), 57 deletions(-) create mode 100644 state.odin diff --git a/main.odin b/main.odin index 6c300cf..2ef7188 100644 --- a/main.odin +++ b/main.odin @@ -6,9 +6,6 @@ import glm "core:math/linalg/glsl" import rl "vendor:raylib" -// orignal resolution of space invaders -// 256 x 224 px - TEXTURE_ATLAS_PATH :: "./assets/texture_atlas.png" DEBUG_MODE :: false @@ -19,55 +16,36 @@ GameEndType :: enum { AliensReachedPlayer, } -GameState :: struct { - // window - target_fps: c.int, - title: cstring, - screen_width: c.int, - screen_height: c.int, - // frame stats - frame_counter: int, - current_frame_time: f64, - last_frame_time: f64, - delta_time: f64, - // game vars - screen: GameScreen, - previous_screen: GameScreen, - last_frame_screen: GameScreen, - game_end: GameEndType, - reset_game: bool, - aliens: #soa[ALIENS]Alien, - bullets: #soa[MAX_BULLETS]Bullet, - bullet_index: int, - player_last_time_fired: f64, - player_pos: glm.vec2, - player_health: c.int, - player_score: c.int, - player_high_score: c.int, - shuffle_dir: ShuffleDirection, - last_shuffle_dir: ShuffleDirection, -} state: GameState +ratio: i32 texture_atlas_image: rl.Image texture_atlas: rl.Texture2D camera := rl.Camera2D { - zoom = 2, + zoom = GLOBAL_SPRITE_SCALE, } +// orignal resolution of space invaders: 256 x 224 px setup :: proc(state: ^GameState) { using state target_fps = 60 - screen_width = 800 * 2 - screen_height = 600 * 2 - title = "Space Invaders (raylib+odin-lang edition)" + + monitor := rl.GetCurrentMonitor() + screen_width = rl.GetMonitorWidth(monitor) + screen_height = rl.GetMonitorHeight(monitor) current_frame_time = rl.GetTime() previous_screen = .TITLE screen = .TITLE rl.SetTargetFPS(target_fps) + + if !ODIN_DEBUG { + rl.SetExitKey(nil) + } else { + log.info("Built with Odin compiler version: ", ODIN_VERSION) + } } update :: proc(state: ^GameState) { @@ -81,13 +59,31 @@ update :: proc(state: ^GameState) { update_screen(state) } - +target: rl.RenderTexture2D draw :: proc(state: ^GameState) { + rl.BeginTextureMode(target) + { + draw_screen(state) + } + rl.EndTextureMode() + rl.BeginDrawing() - rl.ClearBackground(rl.RAYWHITE) - rl.BeginMode2D(camera) - draw_screen(state) - rl.EndMode2D() + { + rl.ClearBackground(rl.RAYWHITE) + rl.DrawTexturePro( + target.texture, + {0, 0, f32(target.texture.width), f32(-target.texture.height)}, + { + f32((state.screen_width - (target.texture.width * ratio)) / 2), + 0, + f32(target.texture.width * ratio), + f32(target.texture.height * ratio), + }, + {0, 0}, + 0, + rl.WHITE, + ) + } rl.EndDrawing() } @@ -96,16 +92,18 @@ main :: proc() { log.info(state.screen) + + rl.InitWindow(1200, 720, "title") + defer rl.CloseWindow() + rl.RestoreWindow() + rl.SetWindowState({.WINDOW_RESIZABLE, .WINDOW_MAXIMIZED}) + setup(&state) - rl.InitWindow(state.screen_width, state.screen_height, state.title) - defer rl.CloseWindow() - - if !ODIN_DEBUG { - rl.SetExitKey(nil) - } else { - log.info("Built with Odin compiler version: ", ODIN_VERSION) - } + width: i32 = 720;height: i32 = 520 + target = rl.LoadRenderTexture(width, height) + defer rl.UnloadRenderTexture(target) + ratio = i32(state.screen_height / target.texture.height) texture_atlas_image = rl.LoadImage(TEXTURE_ATLAS_PATH) texture_atlas = rl.LoadTextureFromImage(texture_atlas_image) diff --git a/screens.odin b/screens.odin index f7c9634..3eaaa40 100644 --- a/screens.odin +++ b/screens.odin @@ -9,7 +9,6 @@ GameScreen :: enum { ENDING, } - update_screen :: proc(state: ^GameState) { using state @@ -53,25 +52,29 @@ draw_screen :: proc(state: ^GameState) { { rl.DrawRectangle(0, 0, state.screen_width, state.screen_height, rl.WHITE) + rl.DrawCircle(0, 0, 20, rl.RED) rl.DrawTexturePro( texture_atlas, {LOGO_TO[0].x, LOGO_TO[0].y, LOGO_TO[1].x, LOGO_TO[1].y}, { - f32(screen_width / GLOBAL_SPRITE_SCALE) / 2, - f32(screen_height / GLOBAL_SPRITE_SCALE) / 2, + f32(screen_width / GLOBAL_SPRITE_SCALE), + f32(screen_height / GLOBAL_SPRITE_SCALE), LOGO_TO[1].x * 4, LOGO_TO[1].y * 4, }, - {LOGO_TO[1].x * 2, LOGO_TO[1].y * 2}, + { + f32(screen_width / GLOBAL_SPRITE_SCALE), + f32(screen_height / GLOBAL_SPRITE_SCALE), + }, 0, rl.GREEN, ) - text : cstring = "PRESS ENTER TO START GAME" - size := rl.MeasureText(text, 20) - rl.DrawText( + text: cstring = "PRESS ENTER TO START GAME" + size := rl.MeasureText(text, 20) + rl.DrawText( text, - (screen_width/4) - (size/2), - (screen_height / 2)- 20, + (screen_width / 4) - (size / 2), + (screen_height / 2) - 20, 20, rl.DARKGREEN, ) diff --git a/sprites.odin b/sprites.odin index 95707f3..734a8ef 100644 --- a/sprites.odin +++ b/sprites.odin @@ -9,6 +9,7 @@ LOGO_TO :: [2]glm.vec2{{0, 0}, {128-(SPRITE_CELL * 2), SPRITE_CELL * 2}} GLOBAL_SPRITE_SCALE :: 2 SPRITE_CELL :: 16 +SPRITE :: SPRITE_CELL * GLOBAL_SPRITE_SCALE ALIEN_ROWS :: 5 ALIENS_PER_ROW :: 11 diff --git a/state.odin b/state.odin new file mode 100644 index 0000000..67f1673 --- /dev/null +++ b/state.odin @@ -0,0 +1,33 @@ +package space_invaders + +import "core:c" +import glm "core:math/linalg/glsl" + +GameState :: struct { + // window + target_fps: c.int, + title: cstring, + screen_width: c.int, + screen_height: c.int, + // frame stats + frame_counter: int, + current_frame_time: f64, + last_frame_time: f64, + delta_time: f64, + // game vars + screen: GameScreen, + previous_screen: GameScreen, + last_frame_screen: GameScreen, + game_end: GameEndType, + reset_game: bool, + aliens: #soa[ALIENS]Alien, + bullets: #soa[MAX_BULLETS]Bullet, + bullet_index: int, + player_last_time_fired: f64, + player_pos: glm.vec2, + player_health: c.int, + player_score: c.int, + player_high_score: c.int, + shuffle_dir: ShuffleDirection, + last_shuffle_dir: ShuffleDirection, +} From 7eaa303d6fad1e283a4c97ea1bc088d5c7e8f017 Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Sat, 10 Feb 2024 23:31:03 +0200 Subject: [PATCH 2/6] end of scaling issues (tm) --- game.odin | 17 ++++++----------- main.odin | 14 ++++++++------ screens.odin | 19 +++++-------------- sprites.odin | 6 +++--- 4 files changed, 22 insertions(+), 34 deletions(-) diff --git a/game.odin b/game.odin index b3ac427..a2b2cef 100644 --- a/game.odin +++ b/game.odin @@ -54,8 +54,8 @@ setup_game :: proc(state: ^GameState) { using state player_pos = glm.vec2 { - f32(screen_width) / (2 * camera.zoom), - f32(screen_height) / camera.zoom - PLAYER_RECT.x, + f32(screen_width) / 2, + f32(screen_height) - PLAYER_RECT.x, } player_score = 0 player_health = 3 @@ -101,14 +101,8 @@ update_game :: proc(state: ^GameState) { // update bullet frame idx if frame_counter % 10 == 0 {BULLET_FRAME_ANIM = (BULLET_FRAME_ANIM + 1) % len(BULLET_TO)} - // Press enter to change to ENDING screen - if (rl.IsKeyPressed(rl.KeyboardKey.ENTER)) { - state.screen = .ENDING - log.info("Updated screen enum", state.screen) - } - // Press space to change to fire - if (rl.IsKeyPressed(rl.KeyboardKey.SPACE)) { + if (rl.IsKeyPressed(rl.KeyboardKey.SPACE) || rl.IsKeyPressed(rl.KeyboardKey.ENTER)) { fire_bullet(&bullets, &bullet_index) } @@ -147,6 +141,7 @@ update_game :: proc(state: ^GameState) { if game_over { screen = .ENDING + log.info("Game over!", game_end) return } } @@ -177,7 +172,7 @@ update_game :: proc(state: ^GameState) { corner_alien_pos := shuffle_dir == .RIGHT ? aliens[ALIENS_PER_ROW - 1].position : aliens[0].position if corner_alien_pos.x <= SPRITE_CELL || - corner_alien_pos.x >= f32(screen_width / GLOBAL_SPRITE_SCALE) - SPRITE_CELL || + corner_alien_pos.x >= f32(screen_width) - SPRITE_CELL || shuffle_dir == .DOWN { switch shuffle_dir { case .RIGHT: @@ -373,7 +368,7 @@ draw_game :: proc(state: ^GameState) { texture_atlas, {HEART_TO.x, HEART_TO.y, SPRITE_CELL, SPRITE_CELL}, { - f32(screen_width / GLOBAL_SPRITE_SCALE) - f32(hi * SPRITE_CELL * GLOBAL_SPRITE_SCALE), + f32(screen_width) - f32(hi * SPRITE), 0, f32(PLAYER_RECT.x), f32(PLAYER_RECT.y), diff --git a/main.odin b/main.odin index 2ef7188..85a7d5a 100644 --- a/main.odin +++ b/main.odin @@ -26,14 +26,15 @@ camera := rl.Camera2D { zoom = GLOBAL_SPRITE_SCALE, } +window_width : i32; window_height: i32 // orignal resolution of space invaders: 256 x 224 px setup :: proc(state: ^GameState) { using state target_fps = 60 monitor := rl.GetCurrentMonitor() - screen_width = rl.GetMonitorWidth(monitor) - screen_height = rl.GetMonitorHeight(monitor) + window_width = rl.GetMonitorWidth(monitor) + window_height = rl.GetMonitorHeight(monitor) current_frame_time = rl.GetTime() previous_screen = .TITLE @@ -74,7 +75,7 @@ draw :: proc(state: ^GameState) { target.texture, {0, 0, f32(target.texture.width), f32(-target.texture.height)}, { - f32((state.screen_width - (target.texture.width * ratio)) / 2), + f32((window_width - (target.texture.width * ratio)) / 2), 0, f32(target.texture.width * ratio), f32(target.texture.height * ratio), @@ -99,11 +100,12 @@ main :: proc() { rl.SetWindowState({.WINDOW_RESIZABLE, .WINDOW_MAXIMIZED}) setup(&state) + state.screen_width = 720 + state.screen_height = 520 - width: i32 = 720;height: i32 = 520 - target = rl.LoadRenderTexture(width, height) + target = rl.LoadRenderTexture(state.screen_width, state.screen_height) defer rl.UnloadRenderTexture(target) - ratio = i32(state.screen_height / target.texture.height) + ratio = i32(window_height / target.texture.height) texture_atlas_image = rl.LoadImage(TEXTURE_ATLAS_PATH) texture_atlas = rl.LoadTextureFromImage(texture_atlas_image) diff --git a/screens.odin b/screens.odin index 3eaaa40..2c5f5ec 100644 --- a/screens.odin +++ b/screens.odin @@ -50,22 +50,13 @@ draw_screen :: proc(state: ^GameState) { switch state.screen { case .TITLE: { - rl.DrawRectangle(0, 0, state.screen_width, state.screen_height, rl.WHITE) + rl.DrawRectangle(0, 0, state.screen_width, state.screen_height, rl.BLACK) - rl.DrawCircle(0, 0, 20, rl.RED) rl.DrawTexturePro( texture_atlas, {LOGO_TO[0].x, LOGO_TO[0].y, LOGO_TO[1].x, LOGO_TO[1].y}, - { - f32(screen_width / GLOBAL_SPRITE_SCALE), - f32(screen_height / GLOBAL_SPRITE_SCALE), - LOGO_TO[1].x * 4, - LOGO_TO[1].y * 4, - }, - { - f32(screen_width / GLOBAL_SPRITE_SCALE), - f32(screen_height / GLOBAL_SPRITE_SCALE), - }, + {0, 0, LOGO_TO[1].x * 4, LOGO_TO[1].y * 4}, + {f32(-screen_width/4), f32(-screen_height/3)}, 0, rl.GREEN, ) @@ -73,8 +64,8 @@ draw_screen :: proc(state: ^GameState) { size := rl.MeasureText(text, 20) rl.DrawText( text, - (screen_width / 4) - (size / 2), - (screen_height / 2) - 20, + (screen_width / 2) - (size / 2), + screen_height - 20, 20, rl.DARKGREEN, ) diff --git a/sprites.odin b/sprites.odin index 734a8ef..9c05760 100644 --- a/sprites.odin +++ b/sprites.odin @@ -15,17 +15,17 @@ ALIEN_ROWS :: 5 ALIENS_PER_ROW :: 11 ALIENS :: ALIEN_ROWS * ALIENS_PER_ROW ALIEN_SIDE_STEP :: 20 * GLOBAL_SPRITE_SCALE -ALIEN_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} +ALIEN_RECT :: glm.vec2{SPRITE, SPRITE} // note: this multiplication by GLOBAL_SPRITE_SCALE is a hack, but it's a weekend project // so i won't bother refactoring it MAX_BULLETS :: 100 BULLET_SPEED :: 240 -BULLET_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} +BULLET_RECT :: glm.vec2{SPRITE, SPRITE} MAX_PLAYER_HEALTH :: 3 PLAYER_SPEED :: 120 -PLAYER_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} +PLAYER_RECT :: glm.vec2{SPRITE, SPRITE} // texture offset for ship SHIP_TO :: glm.vec2{0, 112} From bb4393557a7547073d46b363eee3221399c3f5e3 Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Mon, 12 Feb 2024 21:02:07 +0200 Subject: [PATCH 3/6] Added more flexible scaling --- main.odin | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/main.odin b/main.odin index 85a7d5a..291bab2 100644 --- a/main.odin +++ b/main.odin @@ -17,24 +17,22 @@ GameEndType :: enum { } state: GameState -ratio: i32 +ratio: f32 texture_atlas_image: rl.Image texture_atlas: rl.Texture2D -camera := rl.Camera2D { - zoom = GLOBAL_SPRITE_SCALE, -} +window_width: i32 +window_height: i32 -window_width : i32; window_height: i32 // orignal resolution of space invaders: 256 x 224 px setup :: proc(state: ^GameState) { using state target_fps = 60 - monitor := rl.GetCurrentMonitor() - window_width = rl.GetMonitorWidth(monitor) - window_height = rl.GetMonitorHeight(monitor) + // monitor := rl.GetCurrentMonitor() + window_width = rl.GetScreenWidth() + window_height = rl.GetScreenHeight() current_frame_time = rl.GetTime() previous_screen = .TITLE @@ -60,6 +58,7 @@ update :: proc(state: ^GameState) { update_screen(state) } + target: rl.RenderTexture2D draw :: proc(state: ^GameState) { rl.BeginTextureMode(target) @@ -75,10 +74,10 @@ draw :: proc(state: ^GameState) { target.texture, {0, 0, f32(target.texture.width), f32(-target.texture.height)}, { - f32((window_width - (target.texture.width * ratio)) / 2), + (f32(window_width) - (f32(target.texture.width) * ratio)) / 2, 0, - f32(target.texture.width * ratio), - f32(target.texture.height * ratio), + f32(target.texture.width) * ratio, + f32(target.texture.height) * ratio, }, {0, 0}, 0, @@ -103,9 +102,11 @@ main :: proc() { state.screen_width = 720 state.screen_height = 520 + rl.SetWindowMinSize(state.screen_width, state.screen_height) + target = rl.LoadRenderTexture(state.screen_width, state.screen_height) defer rl.UnloadRenderTexture(target) - ratio = i32(window_height / target.texture.height) + ratio = f32(window_height) / f32(target.texture.height) texture_atlas_image = rl.LoadImage(TEXTURE_ATLAS_PATH) texture_atlas = rl.LoadTextureFromImage(texture_atlas_image) @@ -113,6 +114,11 @@ main :: proc() { log.info("Loaded images") for !rl.WindowShouldClose() { + if rl.IsWindowResized() { + window_width = rl.GetScreenWidth() + window_height = rl.GetScreenHeight() + ratio = f32(window_height) / f32(target.texture.height) + } update(&state) draw(&state) } From fd0cb31206a526aefe8be0cbf391e7f446c86afe Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Mon, 12 Feb 2024 21:28:34 +0200 Subject: [PATCH 4/6] Added README.md --- README.md | 26 ++++++++++++++++++++++++++ repo/in_game_screenshot.png | Bin 0 -> 32858 bytes repo/start_game_screenshot.png | Bin 0 -> 30767 bytes 3 files changed, 26 insertions(+) create mode 100644 README.md create mode 100644 repo/in_game_screenshot.png create mode 100644 repo/start_game_screenshot.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..c9c40de --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# Space Invaders + +## About +This is a simple clone I wrote in a weekend using `odin-lang` and the available `raylib` bindings. + +# Software used +* `Aseprite` for pixel art +* `neovim` and the `ols` LSP +* `make` + +# Building & running +This should be buildable through the makefile on any platform (Windows, OSX & Linux) as long as you have the Odin compiler on hand. +If the makefile is causing you trouble the project can be directly ran with (which creates a binary file as well): + +```bash +odin run . +``` +or compiled to a binary with a custom output directory & speed optimizations (although they are not needed at all): +```bash +odin build . -out:space_invaders.exe -o:speed +``` + +# Gallery +![Space Invaders Start Game Screen](/repo/start_game_screenshot.png) + +![In Game Screen](/repo/in_game_screenshot.png) \ No newline at end of file diff --git a/repo/in_game_screenshot.png b/repo/in_game_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5444f6d879d94a91d7ebcc75e1fa9c7183537c90 GIT binary patch literal 32858 zcmeHQ3s_U<`9JMky;N(vcJ;=kYuDOU#VQ(ZA*rpCIt$iXMG!+RB}hXI5F!Lff?KC` ztz^y?gaB#fKWNJ(g&6Kh*tCsp2q_|oA&_8^1PsXmLK4Wy<$nT1$ew3?d|E=M&3PUZ zP9o>~zW4Hb-}m=^=Wyorh_DsQ)-D48V8!lNcfJ7t4{rc~C66t62>#^F)S~C%w+D!C zguM(@w|fo2CyNqxgzo@=8v4VQqrZmFmnOd&MFfB+pLP6uVD}rp9{~UwxO?Z0H#0E9 zJ^NA_SJ$38S{g#w@bI?}r53MvXNN2g>`Pl!@WuY^4}JYEW$2-j@@2loXYdc0cU+}b z4QaLbKRgUycIIf^6Kb<;cAf!1>z*?oKXB(XXGzW0J14-SzdPud^vv<}m2aIt0>De} z9a=Mc_Wq+Ael>gc*#4+I!*j7U8`TOtT@aVPuDylQ`KBOKjuf9}`qx$vl*I}9;b>n5 zTWnM`o#pAm1m4cyZe_Qy=V1nK$2%_w08hPKxqS9)=WFp%5=Qn{wZmYYpg(0I=$UmC zNJXYH%7S_JI)l<)W8!pmNXxyoQh1^rNoP@vq;(Vo{Zb_j#HaV%xezxa;lGdZ{=A5k z_$RucA75CucU52oxkQ;4FN<*wf2ivp7vmdKEPnh3kleyGE0 z*2YMa3}Kf(8}739`I*-bsXDg~9Mps%#CrL*t`2*Tf^S_B1{sc7bL$9cRcu*j0sRC1 zr-mErD0L=Dm5HoA<|p!-SyX9(uojY!OO!;kPq?y_x98aH0If(_Pf~iNE&m43dW3I^ zDJ%Ua=h*PJ+K&aa3)avoNY&Rc$kX1Gp{`Mk^h?9ck(5}zk5fnh&^K_`Hv0n><07^9 zKi??KJij3-&wAQ0nlVg`&`9Y?CF=UbFG}r=TpF}4*Qn_*|FfQDN{S&PSk)v%82W^1 z9Fs0s;aq2sWs?CZjs46%iDn+N9?6=3Knkf*-Akk4tlrdyR{~ShK#|;@aYt>eK*Ja5wH{~un)3~w! z;1icV1529IlR|VX&EN%N``rTOk6YB1kK>~V4?3;=rIKUXrguMTNbnPOsFNccV$8)0 ztR!#mPDRvz$Lb$9v}<4}tKFyxcg_PCB>3$)D_^~ra{Br^Y0n??iZowH>!DW|8cg#p zk11z-{LaWxo-&!W8CtRM~^KBUGJPu`e+qj2?nS0@3&;PEH? zerKSN&!#0uDNi1}9#nQKCHBaIPo&CtvBmsI=|!%lQ255>woO^~uN%F+rRgXmcOep> zJBk4SR==A~!8QMKiKec)az&MS58a-@elTlyabJ(ler)mM5u?Y?exZIgRrdq2TkMDS zUgRRF#?X@{h3)esG_x5>@{5PEwld^8s$wvRp-NTuiq~O@G3h1YVs)H9!#d8B`1BSt zJ9W0;Y8{GE#jg3t zKsbu1HmBkzh;28F zG4^xn+EhhiXRWQh04ho^NjLU?VF=nFN12s{>b2PWdw^T=Bpwmr>go@-{3ZPu4OPbFgH; zIi>wQV(PH5Kl9z`>M%qx?nRfd>k9Vt z`L|E$Vc3p0hNG*?jRhjABR)FP-UR!2oDyWyV93stt(+yYMpEx>sZTW`mbTin(oY~c zu#jNeT`p2J7KHCg8)&R-Q<0BQ5J%qxiIcC>-o7%F9b-xHXQ)Y&aK4oq9a$1iBp;_z zuYA__+%sePX8<7Zbmq__ZWYe-e3Q|R8HwLxPTZIPS+(iP^pSn`nCB*zr(L3T(g`0Z zG*n17+(HwcGE)Zpt_P?)-Ef@3ZgGm1@kv+eMdqIs7MD>3JL zY^1--dahgH*S2=mnb?P6Pt4RQ;jj;}Gy@1I>KfQh)bi^B`w)>Z~Q zknvB`U)Y*3EAiYZ{}Ct#b)B8De#l@SY`{mRPs);7z;WBr!`X-s^l_}d<(fDO&e4fW zvsK@!MJkdh__K;zHqe&sL-kHT5U)x1htctcGUR4rgovLC30Z zvG<}AXzlnY8gVJ|8M4C5Hrb>3^M^aB~LsM z7y4Tpg-`3^uOi!?aFp9z7#T4l}_)S_@kS)>O4U z2LRuF!F%D(MhKW84w{c$Y;MM$F6& zNxB0|+ymnM8C4JqUmY#pv>VH2l}KNCMjRiHfZi>jZ(#aA0Q5!Nu6SVL8nut96*D2F<|J@f9WP zM8BIwndtQfBq0;!%aCPbK+UHWnjl6foXOhP_9h)qWD42*T>*?z_|ytBp9FbW0z$59 zHgU`!8>dV{1lc5&{oPQ8L1 zxR|bfrPu%&K`<-ziPH<|gwHSo&zgJsqjt z*yfyldm4+1>Q_noF)^7X!kSB8?PZ@1e(I|{=8|C!RvJ1Xi!O>^a_I;D-lbc5 zuYGkYUZsaOclJe!^k(^BidO*WAVG)KYaM&``*@Ssx!d4f4E#4P8Pxy&S6epvGYJol zgixU1P3v!VCQjgO7L?!m5qbFtji(FY+D9oAyv>WiQ7mEx_{r@F{gDz#8Ose;wjy00v;DYMEP=Of~1#)Pt_T{LZxZEEW-wRkR_ zJ#RCZa!B~))#buAH3MiVr}3(p7`sERef7*g^C`u7=O>1?Q9sPI+b5_!N@E9QoYR=D zy)HN{jw{Sl|2sJ=wA#8H@QJcwXc}vDBFJlgB={iNLXXK`U)|xGFQ!YP7{ygM$)^4W zWSzc7&68$mmCdF?isr_|Ykk`6y2kbdhTwC$wF3;Of|vT%X60Ol(0$HnsZA^_f$uE2 zu;$cFWhl+}Fb(aHhW**OeMa~ANXB2tC6Q`j{^q@xU+nRM2Mzo-FgKEQfF>=fW=Lb8 zVxi1z<@&KemMGEJF{ugC!uaaM&a%YJLUj;aOx{3^!4ijUWbLU=xmF{gJ_LlBjU@64NEx;ZS%~J*h6SST>=<7P zzA1v{c&iRF7m{$$;jdG&3)QhS9oM96PPc3Nv&2RIz6^11V;G9K7|0RyxfgD)eA$-G zTiTjsR%^^d1~J&5`k<|)ypIrDKJdrE@vUjSzDk1qLrSHHl)Dm)FU-^TBttQEMt>mV z9fd}zy5S`p<%?>9a&h00B-jK^AxRkMha*yIpAFO{{tX zmMU-VZ5{K5*owDG)LoNf1H#T1mj^f~;M}db{av`O*kZL>T_OE9KNzHlvhnNk_06mf z7QR2#pHi9tOMSRn@_adM%fDV+UZJ;GEZf9-5!{T)$s%ckjj6os$y7u1 zgkYGYRkjp$qGB>9_4#Fq<{?6Z!Ga<-`8hWayDwRE*!qH2jc*^qqLhpJwwLkS*LReDNb}8l5N!s1 z^Y}~+3hFM(=i6VEJO_XS{`@j>D4!rvrQ}jsD@GJ>HdKko?N?DU7;t)f>ZWo1t2i{Y zq|RpB1P3lKjxFt=YZZ9fxLS7(1=$}D8jHTVJs1G8m%AriIYGi1|8mj;!aF;W;(!FW z^a<)c9oLdwiD@4ioxF;v{wkjs{16V~!^-~^VLKeuwok^@B^BqxaQn&A3xQ~?Emjih zOzMX>K^kG?ah(2;L&EVGOlQz3sh$Lj`0IGQ`KgsYLL>`~JAKr;j9OSGf-2VtQb@ja zMuNsfHx5Fy|Ks8`r4>v@t`#p)HF4F3P4G{sbaXB*4NfXoFF;c1uvJH8DRX27O6X37 z=`1X&tqfKH4$2NHhmw0098P+j4+F<11{va@xU;>5ov7~`OdRs1#6oH`J>S75nEtdN zCE24F)MQfKYn^EZ6ZJK`m!SOU>f`MkN>foMMbct1VM3&J;K;B;cBB%hmvmPl!?dLY{v2Mvlh!T&o)>GJ%C`M23A zaxh1nVAf zgxR#FcC}8>P4p&@Z{G+2BdCSJyjJhEg3-j)rxfhcQ%!Nc6@4uf zCL1v7j@bRVJ@znKs1l-nfyMKB6%^XI$qa0UY27FoVnk3f^S0nbVOjan2J06MMt1B` zJk?QPM?=M7w9UF;oz|!eSwLYg-ZmY_7av~(17f9bZYn+$)1DB^kmi0fkfDRy{mD-( zgoLLMX6i*jC%89DSeRmNYAx>J9i6gz>VKc?pN|(rOx9BvaxSw6}>Y@d0QQAYN{ zG0;kSgBkIq0!RbZ;JS)Bu$)auB;s^uNbIgHmxtGNI`4+tp=@Bf%?=Cok zY=rMCmSG8PW_za((}QYv*}|M|5W;e_P+@+t;|iP|nr1dm>&|lSSYkucKk7z2`s>%PNB_gfe_wX)`kL{mYk5}# zBKnDMU3sbXYP-4_33xb458XU#@V^jF+0z4fXjbPQ1n?lhtTlKLzyl5*aJb_S9(VA# zgU1~_?%7xP!+XJnrC>fG2bCWDZVS@MI46 zT;HKaM8rhS=x>6r6=YZLo>+gDGbVfj-izFqm~{Ubw;ZV^{d#((IUwFHd@rl=<0AoO zeb5$P+&^q5M^E$N?U*AW_s=fjD+n?9$jlbgPdL8%n&-OC)f_z0d*RP&a1|APZbobR zJMMpo#2svKa|`;0Du@ODt>merhb?$~u%@hM^G7s3C$;Sf_?DW99rvjz3*uImUyZA} z-ZVNn&}{vnrffLiI!H5_U{lXP+@HprvDo3W(QWcIHW0SrRcyCB%fe~63wm!ulD-yOKqFTD!GACf5*Sz-oZGLA@$tTbJ?75zIu+E44g1Owc7mUB0d}Q7_iR%EiWL_oF$^gJ30Ir=X=Ibaz4go^IUnrb%2jjC3Tu zJV4|pY3C}P#e#6MNZW3=1xum~`^iWmh8EOgXeJZs5EbHHtE^Iis^wzyxHS{&s=)!Q z*Q-h#9XlVJ;1YuT?ycif>lQ2C{@t{ubwB*30-9vD{0Q{sRUXxKbS$?3z|yUf2i$Zq znU)Vk6*O1MwlVso^u6F&XgO#5VHHlAe+;frbhebZKaK^UTgS(1yC))Qeyfyl8 zj#h<6tzZpoh3VYvgyUU9Pkiw>n(xv*|VvPCDdU)JU26QraEPLTSHHBCe~} z$6;nC{vl~5ls>?y&cfFnnUd*|Z|fb1yLUV;e9s$BhKy%E8;s58jBW^K2`W2wF_K%bAh8p_QkYi z+@H_rW!!CkZTNI75?)QwF=+Z{BSX0xZaAY6z>guHi^eFM0XxCt)cE{N8Ew|G>Ubh1 z5Rc@L0+HCX@-R_C3G$z8RicM z1tohtwR+4_m-iug%I;Cs`(3iEaKIkc=z*yqb69?_r8M?GAxwJpnc7+(nRh&(boGQYTJ3znMbn{LchreIfDsf_SduJ5OB} z-8y5V-RG7@!sEtt5#4OM;XEM^oZyDOl=?FFM*KW5Cc82l?Xw~YlrW^uSPA3&zHQ8D zFgEvRMcG$Uw2VC~%$5kGsNw~!EYKb#OGXSt6G$tP&EKLX7FqhX$u(dA>t-|_&V?GT zZw1p^C=;u=#R=+KW9VKXnc`gk=>#^M-B2Dx6I|g|*4Z%jw%BvZ;?A{Q^w_=D{0!={ z)9M=@u>|R{^M64aa;}z#!)$s4`YWZTAMbm@g|M(QFrO@*MrU6!7a}mx3-e z-7t^OBTON4gRI=AAf2jWuX8zJwK#8Te0BOPuSUP(0%4WOtSfbPM*OyXKGLbYbWh;5 zn-+4$!c}JiUE;oz<{r6eY$zc;)D|u3Q!xiYR0riE^-6AzHi58oZ03Ywkh%TL3i4?W z$-{~dp~pfeSck^IA^mc0tv(KUZpRESqugF$sb)j`<6y8?wHFv=P(z0%-mKxt~}@0@Ae8?R{_ZI zKgvX&!Co+!9HBOltHAgm_g*kc#kq@J!DOGeY-7Yk{Q}Jv!fAvGKrCDH=j>>-KFasR5Ch|Med{vJ*J0&L ztzs|lPjaa^BOJ7c1AaY9r5~imW!6Z-rx!(9F8McMxo-|~J?)-Rqut_`){B{D-&1T| zY)aDWmQ`AL04%^Wf~-`9AD~_Nv~@L6WdNqwZ{{(^bg8wNmOPL`HrTrqBXXfQ4*99Q z#Zo(cBJTJMn~1w@s_;@#w4>@tP#~@cb+W_wWSuNIhhK(ra8G4hz@|Alj4f7k2^AhX zWL=603qS<3`!1OA`46{~H2&!grBO3gmT`pt>6AZ*<}y?AT# zt|Hne69j8U<)HLD^sY_e-<-L39HdurrGqq_99|J4mQZtoT@u_$O3iqpIO za;i7#9>~B)(7C4FpezyXn&DCXJK_1Z-V*z#m|f%I+v@JO_Z&7&o1mWov+(eK!TU8C zre@q463AZ2UdY}F1fbo_NW&Ql(?6Tt^xDxSjY*r{Nx2n^?!=Ps+w0gfY%L@F^8fcW{}4ln;Y4nOATXp% zU)v4QfM`r<O3LJ6V;otB=yMcBy6=0yG{FS~f$nfmxI<|h&&K=|Y-n(0RG9eqr9Lci^>)Rz zCh6eSzihKeUZxafw7a%}k`A-D*Ckja(t0!^Bd1Wr&r8;Rn8vR@Jm?Y}wNPium$iV` z@_c2(1c&im=x4x|UAtOR58ma?Voo|R!^3e%#ZI;0%Go*9Wa&po8z@vUc(p>Laa7xV zt-nIiME{Pj!$cX=6zM9WT4c1MUYinrz4nMrLgPGU{Dpd*%k5N`ezbqDSa%82c_d#O z<|4?M+~eo}KQ?;l?5PuI1mMS0b<4D5(l3~u2BSd0N=8^&-%0IgWPF%o0H%kOMH~Vv()6&4?EtZ!Iwx1sH2Ux|sM?8V(U;2j5r~V7aQgArcqRk5-)w@aop|WJ9g-_&(@I!2Sr_d`KeZRc zn|{rV1wM1xy>@10wd2`Z6Nl-&97>S0Ej2Q6bRW2;?3s`=a-p3}0#b1|r5f+3K(7aa~*%JS7KHqkBO@L<_qe!DN8IxW)Tj95?I?yr3==}Ofz4k#=nz&X}==pOy zVIjg;uw{3qQbIR7a7De2%E(rPqx*jdJ*ecH8mRDqFFP~jG|tYB zJyz!H3+~AhY$lY;E@v6J*(RILEulw`Wfis?3|qB5iKD??^45B7U~i;8L9PTlC|Hgc z4c*S literal 0 HcmV?d00001 From b286b4a8600907da709c32ddaef8f8db7160184d Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Mon, 12 Feb 2024 21:30:51 +0200 Subject: [PATCH 5/6] Update images in readme.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c9c40de..70a9c8d 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,6 @@ odin build . -out:space_invaders.exe -o:speed ``` # Gallery -![Space Invaders Start Game Screen](/repo/start_game_screenshot.png) +![Space Invaders Start Game Screen](https://git.stefanstefanov.eu/bersk/odin-space-invaders/src/commit/fd0cb31206a526aefe8be0cbf391e7f446c86afe/repo/start_game_screenshot.png) -![In Game Screen](/repo/in_game_screenshot.png) \ No newline at end of file +![In Game Screen](https://git.stefanstefanov.eu/bersk/odin-space-invaders/src/commit/fd0cb31206a526aefe8be0cbf391e7f446c86afe/repo/in_game_screenshot.png) \ No newline at end of file From e1c91b791c8671135da3bf0ead091a61c1404eb8 Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Mon, 12 Feb 2024 21:32:10 +0200 Subject: [PATCH 6/6] Update images in readme.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 70a9c8d..c048214 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,6 @@ odin build . -out:space_invaders.exe -o:speed ``` # Gallery -![Space Invaders Start Game Screen](https://git.stefanstefanov.eu/bersk/odin-space-invaders/src/commit/fd0cb31206a526aefe8be0cbf391e7f446c86afe/repo/start_game_screenshot.png) +![Space Invaders Start Game Screen](https://git.stefanstefanov.eu/bersk/odin-space-invaders/raw/commit/fd0cb31206a526aefe8be0cbf391e7f446c86afe/repo/start_game_screenshot.png) -![In Game Screen](https://git.stefanstefanov.eu/bersk/odin-space-invaders/src/commit/fd0cb31206a526aefe8be0cbf391e7f446c86afe/repo/in_game_screenshot.png) \ No newline at end of file +![In Game Screen](https://git.stefanstefanov.eu/bersk/odin-space-invaders/raw/commit/fd0cb31206a526aefe8be0cbf391e7f446c86afe/repo/in_game_screenshot.png) \ No newline at end of file