From 78af71a33a6ad7f8b58e366b50c1372f1d1ab4d5 Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Sat, 10 Feb 2024 16:09:04 +0200 Subject: [PATCH] added logo to main screen and set up the game to start from the logo screen --- assets/texture_atlas.png | Bin 1067 -> 1560 bytes game.odin | 23 +++++++++++++----- main.odin | 49 ++++++++++++++++++++------------------- screens.odin | 46 ++++++++++++++++++------------------ sprites.odin | 2 ++ 5 files changed, 66 insertions(+), 54 deletions(-) diff --git a/assets/texture_atlas.png b/assets/texture_atlas.png index 39f11d7c41162208ef1ffe9e547adc27f23586d6..723bd8366c5f50e829a6e5b978deae5f0030d593 100644 GIT binary patch delta 1530 zcmb`F`#aMM9LK+#%V=&#L^Vda6dQ7DM2(|HBIK6qP=}FAZgYG34(al!bfd_v%t17( zi6u|7(h#|gX&c8nj%$aJ%W7yx{SD{y+voHCJkRHOUawER+(U)iW}wWFi<5(QTIoWW zeFoy7%9SvrzU>FfK7Ct~@;`9Qx=dE3Jt@bBocrmzIgP1VC+q2fb+8DYc$9W!x_`;j zXCUHVgxSpsPlBB8xxFiwPG(xse_)6~6{(-yX)iDXbCpB#2i#6jP@}gjk$&;Kf&fN< zII?I7ws;mDT9;LV14|lT6vupZzZFb_o+v?R%{{z z#Od%_d6H6JgF0$$%Yqj?K5gWU#v0{VD36`>7?;6_xOOoevQ64NceUbXAF5tZ3dAYV zvDVGo4OQO@#`dHc{3)-a>KDCuHqPh4ywOM!3y778hR%YA)`r@uTa%vLZiUq)^r1}F zVg;xS!_U3bfw^H3n#C#%Jf5-_^F?dRIoUM(&6_ftfof~|2xI4&K1h>n zNL6{cZPUb-a9&cja|bq4-=$aVnOj9b`)-~HS9>lKrS5>1D9wj57a4axEe2z4u_c_E zU8waY-Q|@!SFVek8;&{DazS4YT;>WDPZCr`pm#lubE#p{*-wMe44{p@zCJO4wHOio zt;$t4hIx%uhGphkFkSTh-npmU@xg;HEl3<&KeoEms`&i%Zhkto&zY$5DdSYea4}YB zG|XFwS|`Zz>7?C|!9gjv-03mee)0XgYhgAMtQ3FSu4?(BrjZB-^1{dmSA&Fe!~{_9 z=;qeSQr8|tXDZAAk5(aF)Bz^304p1~AqCNdLCut;@d&wg%>NPexdnxr?ffFz-wxHB z*}7H9Q#S+y`dvqx?^ApR>B7jX`MZe`buzW%wN@*vL#HljuNP4VW5zQKUy0I7@zDoo z$u-0^M+FUU2_GZ2KkQlE{ju&yYlB66&;soIckv zN+G^v8A1l~Z|l#!$_mP;vx|I6;CgA<-0Odq<`0sTo4K;nn~6Pncf1(4M!=8BkQ;IQ zfFZV>mnf__7DY;mkQ6)3^Ic~YsZeB_5K7Km9g>bJGL?xL!eHlpQM3-Ivy^iQgIG9} zYQ{~WNUQiM+$6L6tFLz#7R)WbCTDGi(2TtBU(>zO?OoQM0UPv{oOlH|7!r-*qq7jOOdiMxSO+MtZa&1&_v@7~k`) z=*lJ?{fHp#xIA2V1{xV9^%|J0r2~5gTykDNocVa9f)Yhg045sWQ30=eAv>`pEz{=F z9u+@U=j}D-I+N!m6-dVf26)pFT)Chj%?Sr8dq6`-$AVVNf-C!#dRahDP$i~STxQ%T zMpz2j^&*aPPBRU#Z@REdRcxC!p+s$8re_7f90i*0VUR?KHY{Z~Rl2xJz|kaqoi3{h zv|FT+Bj&7?9R!F3m2-#{g8{J#-XGw=mN?n)pGXUsd7UoD#(+!!jz{yz1ryI9)OxVhaYcSy}ZwmrPd z+?4$IUN@qV0BmokAA>n>*=R^5^fP0jaD1r*vVH?KE5wCU-sKv literal 1067 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>V1DZ9;uumf z=j|NBs@n<@Z43LS%cy>xqRRfFv8wURUI+du%oQ2SWK?1|P35cW5PatDp)_sL`&xC@ z#(-LtxWX3JW~%Fm5&KBr&2!SBq@le%w@ z$CbbPdE;Pa(2}|H%Iu6{3|MEJx-lhT>eXAzWpCZG^X-gjlDmB3-U~C*Mz2}B% zb-(p`d%5rY(xB&F4Hc84PJ4e{^C_xYd)4J_Td!-l?lXPl*}y&fCfl@UPj7kTXXam> zT|f2rV z?~Rg^Wqf(eoS^6p7EQ=(`FwWvTW4@oZ{QYaXAxj$Jd!A`zz0;&?NI2!Q269|`q%f$ zC7unt9~_D;IBQ;%^;dIFpW>Xp=b6W?+PJ6RXRnYd>-cZ#)4uU@@z0ONH#E=hKcC&V z@~J_8-hbIWtbWG@@<-+w&dcWuM+Zyj~tpPTI9);p5Sy}Hlzkn+ZwHF7@9 zu?-fn%Nj}?uW#DXU3zct=bs&UvCIbFzb9^Fs9e&|IpMnOY@=fy&%YcGf4_EWosR$W z|CbF}zQ2DzY5V_AIeCH>+t?cR#c&F2FTb`;Uw^w>$vl>&t&c8Ud>>PLWxB^}yM0yb z|0!e?a~ia3M%!#_bml8`iB`5ry88O71IM*Qan69K2a!vH**pU(L~KfVCwzK0*MED( zwZhY_PjB0ZHO^<|Z#puu-{EWQfh5K&`47U|H67-xV&Fg6+V21B5nB$kkb_KcL;Hh6 z-R1v|TKjXo5f^fpvs%6JT1Nj2 diff --git a/game.odin b/game.odin index 84932cd..13aa85a 100644 --- a/game.odin +++ b/game.odin @@ -28,6 +28,7 @@ Alien :: struct { death_animation_index: int, position: glm.vec2, id: AlienKind, + last_time_fired: f64, } Bullet :: struct { @@ -102,12 +103,7 @@ update_game :: proc(state: ^GameState) { // Press space to change to fire if (rl.IsKeyPressed(rl.KeyboardKey.SPACE)) { - bullet := &bullets[bullet_index];bullet_index = (bullet_index + 1) % MAX_BULLETS - bullet.alive = true - bullet.player_bullet = true - bullet.position = player_pos - bullet.position.y = bullet.position.y - ((PLAYER_RECT.y / 2) + BULLET_RECT.y / 2.0) - log.info("Fired bullet: ", bullet) + fire_bullet(state, shot_from_player = true) } if (rl.IsKeyDown(rl.KeyboardKey.RIGHT)) { @@ -149,6 +145,10 @@ update_game :: proc(state: ^GameState) { } } + // for alien_idx in 0..< ALIENS_PER_ROW { + // + // } + // Update bullets & aliens { for &bullet, bi in bullets { @@ -204,6 +204,17 @@ update_game :: proc(state: ^GameState) { } } +fire_bullet :: proc(state: ^GameState, shot_from_player := true) { + using state + + bullet := &bullets[bullet_index];bullet_index = (bullet_index + 1) % MAX_BULLETS + bullet.alive = true + bullet.player_bullet = true + bullet.position = player_pos + bullet.position.y = bullet.position.y - ((PLAYER_RECT.y / 2) + BULLET_RECT.y / 2.0) + log.info("Fired bullet: ", bullet) +} + // Since I'm using a #soa array I can't directly modify the alien & bullet entities... damage_alien :: proc( state: ^GameState, diff --git a/main.odin b/main.odin index 0d6e971..0b5a717 100644 --- a/main.odin +++ b/main.odin @@ -21,30 +21,31 @@ GameEndType :: enum { GameState :: struct { // window - target_fps: c.int, - title: cstring, - screen_width: c.int, - screen_height: c.int, + 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, + 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_pos: glm.vec2, - player_health: c.int, - player_score: c.int, - player_high_score: c.int, - shuffle_dir: ShuffleDirection, - last_shuffle_dir: ShuffleDirection, + 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 @@ -63,8 +64,8 @@ setup :: proc(state: ^GameState) { title = "Space Invaders (raylib+odin-lang edition)" current_frame_time = rl.GetTime() - previous_screen = .LOGO - screen = .GAMEPLAY + previous_screen = .TITLE + screen = .TITLE rl.SetTargetFPS(target_fps) } diff --git a/screens.odin b/screens.odin index 40e8bc5..f7c9634 100644 --- a/screens.odin +++ b/screens.odin @@ -4,7 +4,6 @@ import "core:log" import rl "vendor:raylib" GameScreen :: enum { - LOGO, TITLE, GAMEPLAY, ENDING, @@ -15,15 +14,6 @@ update_screen :: proc(state: ^GameState) { using state switch screen { - case .LOGO: - { - // Wait for 2 seconds (120 frames) before jumping to TITLE screen - if (frame_counter > int(target_fps * 2)) { - previous_screen = screen - screen = .TITLE - log.info("Updated screen enum", screen) - } - } case .TITLE: { // Press enter to change to GAMEPLAY screen @@ -56,24 +46,32 @@ update_screen :: proc(state: ^GameState) { } draw_screen :: proc(state: ^GameState) { + using state { switch state.screen { - case .LOGO: - { - // TODO: Draw LOGO screen here! - rl.DrawText("SPACE INVADERS", 220, 220, 40, rl.GREEN) - rl.DrawText("WAIT for 2 SECONDS...", 290, 400, 20, rl.GRAY) - - } case .TITLE: { - // TODO: Draw TITLE screen here! - rl.DrawRectangle(0, 0, state.screen_width, state.screen_height, rl.GREEN) - rl.DrawText("TITLE SCREEN", 20, 20, 40, rl.DARKGREEN) - rl.DrawText( - "PRESS ENTER or TAP to JUMP to GAMEPLAY SCREEN", - 120, - 220, + rl.DrawRectangle(0, 0, state.screen_width, state.screen_height, rl.WHITE) + + 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, + LOGO_TO[1].x * 4, + LOGO_TO[1].y * 4, + }, + {LOGO_TO[1].x * 2, LOGO_TO[1].y * 2}, + 0, + rl.GREEN, + ) + text : cstring = "PRESS ENTER TO START GAME" + size := rl.MeasureText(text, 20) + rl.DrawText( + text, + (screen_width/4) - (size/2), + (screen_height / 2)- 20, 20, rl.DARKGREEN, ) diff --git a/sprites.odin b/sprites.odin index ee684bc..43365e3 100644 --- a/sprites.odin +++ b/sprites.odin @@ -2,6 +2,8 @@ package space_invaders import glm "core:math/linalg/glsl" +LOGO_TO :: [2]glm.vec2{{0, 0}, {128-(SPRITE_CELL * 2), SPRITE_CELL * 2}} + GLOBAL_SPRITE_SCALE :: 2 SPRITE_CELL :: 16