From e8d99dd002950ef71dfd68f9cfc69115a6a7b540 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Sun, 24 Aug 2025 09:32:43 +0200 Subject: [PATCH] Tower defense, start, ending --- collision/types.go | 2 + main.go | 58 +++++++++++------------------ resources/constants.go | 1 + resources/embed.go | 6 +++ resources/ending.png | Bin 0 -> 841 bytes resources/grass.png | Bin 14502 -> 8849 bytes resources/hero.gif | Bin 0 -> 9305 bytes resources/hero.png | Bin 12733 -> 3869 bytes resources/starting.png | Bin 0 -> 819 bytes resources/zombie3.png | Bin 830 -> 1736 bytes tiles/common.go | 6 +++ tiles/ending.go | 81 +++++++++++++++++++++++++++++++++++++++++ tiles/starting.go | 77 +++++++++++++++++++++++++++++++++++++++ zombie/zombie.go | 57 ++++++++++++++++++++++------- 14 files changed, 238 insertions(+), 50 deletions(-) create mode 100644 resources/ending.png create mode 100644 resources/hero.gif create mode 100644 resources/starting.png create mode 100644 tiles/common.go create mode 100644 tiles/ending.go create mode 100644 tiles/starting.go diff --git a/collision/types.go b/collision/types.go index fd070a9..57f2e38 100644 --- a/collision/types.go +++ b/collision/types.go @@ -15,6 +15,8 @@ const ( Hero ObjectType = 1 << iota Zombie Bullet + Ending + Starting ) type Collidable interface { diff --git a/main.go b/main.go index 6203d06..f12fbfd 100644 --- a/main.go +++ b/main.go @@ -2,23 +2,24 @@ package main import ( "fmt" + _ "image/png" + "log" + "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/ebitenutil" "github.com/hajimehoshi/ebiten/v2/inpututil" "gitlab.com/kbr4/9heroja/collision" "gitlab.com/kbr4/9heroja/configuration" - "gitlab.com/kbr4/9heroja/hero" "gitlab.com/kbr4/9heroja/input" "gitlab.com/kbr4/9heroja/terrain" + "gitlab.com/kbr4/9heroja/tiles" "gitlab.com/kbr4/9heroja/weapons" "gitlab.com/kbr4/9heroja/zombie" - _ "image/png" - "log" ) const ( - screenWidth = 640 - screenHeight = 480 + screenWidth = 720 + screenHeight = 1280 tileSize = 33 titleFontSize = fontSize * 1.5 fontSize = 24 @@ -52,35 +53,17 @@ type Game struct { control *input.Keyboard - hero *hero.Hero - terrain *terrain.Terrain - zombies []*zombie.Zombie - world *collision.World - bullets []*weapons.Handgun + terrain *terrain.Terrain + zombies []*zombie.Zombie + world *collision.World + bullets []*weapons.Handgun + ending *tiles.Ending + starting *tiles.Starting } func (g *Game) Update() error { g.keys = inpututil.AppendPressedKeys(g.keys[:0]) - GameInstance.hero.ChangeDirection(GameInstance.control.DirectionFromKeys(g.keys)) GameInstance.terrain.ChangeDirection(GameInstance.control.DirectionFromKeys(g.keys)) - bullet := GameInstance.hero.Fire(g.terrain.PositionX, g.terrain.PositionY) - if bullet != nil { - GameInstance.world.AddEntity(bullet) - g.bullets = append(g.bullets, bullet) - } - - if len(g.keys) <= 0 { - g.hero.Stop() - } else { - g.terrain.Move() - g.hero.Walk() - } - - for _, b := range g.bullets { - if b.IsFlying { - b.Move() - } - } g.world.NotifyAboutCollisions() return nil @@ -101,7 +84,9 @@ func (g *Game) Draw(screen *ebiten.Image) { b.DrawHandgunBullet(screen) } } - g.hero.DrawHero(screen) + + g.ending.DrawEnding(screen) + g.starting.DrawStarting(screen) msg := fmt.Sprintf(`TPS: %0.2f FPS: %0.2f`, ebiten.ActualTPS(), ebiten.ActualFPS()) ebitenutil.DebugPrint(screen, msg) @@ -120,10 +105,13 @@ func init() { GameInstance = &Game{} GameInstance.world = collision.NewWorld() GameInstance.control = &input.Keyboard{} - GameInstance.hero = hero.NewHero() GameInstance.zombies = []*zombie.Zombie{zombie.NewZombie(), zombie.NewZombie(), zombie.NewZombie(), zombie.NewZombie(), zombie.NewZombie()} + GameInstance.ending = tiles.NewEnding() + GameInstance.starting = tiles.NewStarting() + + GameInstance.world.AddEntity(GameInstance.starting) + GameInstance.world.AddEntity(GameInstance.ending) - GameInstance.world.AddEntity(GameInstance.hero) // put zombies in random places on the screen but not too close to the hero or each other for _, z := range GameInstance.zombies { z.X = float64(configuration.Random(50, screenWidth-50)) @@ -132,15 +120,13 @@ func init() { z.X = float64(configuration.Random(0, screenWidth)) z.Y = float64(configuration.Random(0, screenHeight)) } + z.WhereToGoX = GameInstance.ending.X + z.WhereToGoY = GameInstance.ending.Y z.Walk() GameInstance.world.AddEntity(z) } GameInstance.terrain = terrain.NewTerrain() - - GameInstance.hero.ChangeDirection(configuration.North) - GameInstance.terrain.ChangeDirection(configuration.North) - GameInstance.hero.Walk() } func main() { diff --git a/resources/constants.go b/resources/constants.go index a3ea203..fd64190 100644 --- a/resources/constants.go +++ b/resources/constants.go @@ -2,3 +2,4 @@ package resources const HeroTileSize = 33 const ZombieTileSize = 32 +const TileTileSize = 64 diff --git a/resources/embed.go b/resources/embed.go index 90936c9..daf3491 100644 --- a/resources/embed.go +++ b/resources/embed.go @@ -16,4 +16,10 @@ var ( //go:embed handgun.png Handgun_png []byte + + //go:embed ending.png + Ending_png []byte + + //go:embed starting.png + Starting_png []byte ) diff --git a/resources/ending.png b/resources/ending.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9cd1e5169e0d3cc2d9308c292375eb7770bef3 GIT binary patch literal 841 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 literal 14502 zcmeHubyQSe_xB}~ltyU=7+M&H9;C~mTS6L!?vM^a0R^N%8l<}sP(qPT=}-_6P>}BQ zz4(pi`>gl3*1Mjy-rs-EurBx9bN1P1pU;l7&zU>V)K%}_!ll9m0N|DaQdScH&?Ld~ z7wnthf4B4Y9q=}a(o?WfP~ZTt!3U5M4HG~EOOoI}v_H#Vz-M$c3;+YXhk+LfSiYvY zzNpY{{JuwlW$Hi6iC~%SPa1Tv3`au;Zh`j<@Ztr_WZ=CNyllh&7^@8|Uw^QF{~^KB zHRr$X_Z3vsA-vph9&SEI=4@r_fC2#TjDR>XWTzxem&rr9kEO_a5p0&ls*f~?dkmg3YGXG@ml3d} z1WF}@LA$y%T)2c!YVZ{&*ys`CNRFq zpAl%KR+J^OhP{@$Pb+l~%!wEdEVRuF#aW*#c)zIfJ2~;av!cJSc107QIBXfL26+Mh zTpb}4VJ*m&xi9YelAQVJNrw0P96S;UH={?V(eCfeBu4P5e@uwFzSLu@uldwnZd3eW z`~$JvB->)PtNzm4E`2Ut{r#+qr|&WvYX?2kn2@H#N<<8j^5o2kW(=Q>6Wsj>>%ptr5Io`;@_vWSJVBe$8Q zvpI^}+tKA(VSuQFw~LvDJ<0=Ojj49;_v=0o^B4mr(z_3tFX_!#}0EW@QPo z;uqwF!}%=`Ts-{df?WK(W(Y2Ggb)uGO4!`e0&WH8NAZ~dW@Tw1BJb?xXa=g&*3rxw z1#@w-{@rj5xQLXxf*2z&H_yLn)E&$`tiTRpjLNo7p5Fgz(6)6%X?d7kqX`${;o;>M z7T^UxLc)AP{~~&Ta&reQ@tWuF*!jEVS}h{rWI$leuI&_L@Vg$Ii-?RH%FM&rP21Vo zL5%V5sQY)b3g}LjW*%m;W*#Vz>ECf!`>#06$paVR`9u6`b}G)6wpKp>FY0UOfrx_i zpvsZ9?%?=7zpMW6C@qxhA5VWgI@tbpB?#oVQ;3*Z{4oW0vqvb)-*SSy{%EqWF>|s; zfzjhnbN#E{_J1%10ZR)jK0W~}E&(A6I2Wixel9a}xF8p=nH5TyR{&*UDfove{LS6n z*~-Jq%nc=F4dMu51)AsY6$--kTT$%)E{m59>RJmRU|euG7hLEsz* ze}uq)MEqat`Y&An5d!}a@qexB{~KJm|JqKWoWLx|3*0PWTc!O7~@dZ@GX| znKwaT3C9Jg?+yTXq}LZ3kd{FKR$_T5sK{Zh;SrM(-WC|-?*;$}pdc%y?LD_?v>9nQ z?Gto_($hjbt2WYqZu;gygTW4NIe-0=rboAMD^hyxf1Zv?;yt}7JO4CrGbIp7THHrp zT`-xVIZkxkDdJsFTj>36hP+6_(BwXqJ{Je5N3BeJ^<#%j9rgk|oBgM4c%h_$SH zURGP%Sa@TDVzA@kj78Dyk(tGS^8r7h%Ef}t``vwCx)0yT${JO<_8!xViOUOB{fxV5 z^^;Uhg^2j07o8{_jr*4wg%)>D8G)d+JpsF+k;FE6j&p;Suxmt+G)`GzDa7< zdNX00+E9S8p+72$Dk`D<=o=kcgK5B~4kM#T>yEjjAH{20ei>D98gX9L7&`h$MhU** z!7AD!=5`KK>?hl~?x$3lt@Y#rG5&=YsYRkeFX~bni``ERM#LMSgn&v{Qyh!1lku#( zBK>N|LQ`PMf}h_sM=FJ=?k zAjVfmM+BbSCUwKa@x^EWB<+BI{S z4S>Q1y8gOEFlZ)$Ke(G`ld#O>yAb*wUoT5o(Zp>R&ft% z*awE)o)&zAB;eo%pd_Yu{Xbacr)uNy+$n`VkP*Fnd%y01j-V!BLxUDZP^~7wM`xA} z?OaQWkCJEpnUY3>m#t0H0-LW>^|^wRhyVZ`dZMe1W^F=gs{B{@g7SXKE0U=j3gw2+ z4c9$vnkO|&Y8tI={chKcWG{az(KlH4D9`2byg~vUqa_`4>dAUItSP0l+ckoBUmM(5 zIuU)hH*1@vG`KHh#$ye0{ODG8;}u45EoLus9BWpZiz3~sNZ!@id$Uq#sR;fRI5`n7 zy9dl@`#Dxa?jOa26nY^NK(A!*DiIy1_wCl!jU)qynqVD;h)dBg2AX0gpD1C?siv+e zI334^0VCNXo;%HarPdfDJOCSxI-M-nV^`0iI~X(0c>x4_iDR~)-HEimm1ZA-C1VE& zx4t$1Obwn@p)1FA8-|Y|Ls)L|$iCb=BzslL^hkZ~N>iayIab(Yd@_qad{ z+F+1Muh)AD{mz7*LPe3z&QK?*nMF^p_2?}NHI!xi20$ef%s|4c`TRg$(NjoJbtu+S zHDn{4%CS~5qBr%%-uGR2l1Gt-tI^0}$Io{^*;D!nfoMp_{g@cU0IW}#KM=cMS>{35 zN95yB8m#Y(iv_CTQz>&33kyFOY4^+X?|+gDQ4DLhssQ^n`X ze{+0*)A(V|Th`(}K$8E5rrFBlDQQKHN}e=r#)|VVjjPr+m(2cksG^&2LCt8bN&=4kBBYiZ%RkM$xGzZ<;;sdDa% zy`kg?#*R<}jH^yG0HXr^94bOx(j0Y8wRRu3rT~&6(;+ZYv47`Pw$WW__ogGj8XI84 z<{_(G;v7xoOXk9I6GoW#Cf||uJUrU@{HD;nu`C7q<7G&(&aYUYqgN?7&EXblBeCX^ zv|tD5x;IgiQcOl%m5#SxU@tJkR#OW_gZ7nA&j8?q#n^|O*{B_E^zm3-RdQjST0G*+ zDXZQ!cula-lwc$enXba!MZVaYAULR0VR6tMf9%BVR^kd&pP~gzqw{kli^d8nY_BG@ zR)!iRe=}SbI4Uc3FihibqMqKqUE&gE<7C*r;c(2J&Ac5+bAHk6;W%Xsdif<=E+q+o zjT2i|t{FYVFxzZCe@3aM$5K5PHu)4`SLHZ{`{N9KzShct1!HJm$o?}J*ucRfk1{Ij zMZqII5>ra)=QSt=oTBnu>eO!ylVt08#U^zKtINNopM|=BzOrxxo(Z#It1G#%W6eI8 zo$>nOK3`S8-xXi{4DH~v66LFDvb^YM8Ch?9(4lz3(|k{QPe#ebB9gxG%O)vlCVq=} z;R2|K01YIHFLD;Ne;`TQZ!-yWBc&?CmajvVQ-e)FN#;elIqs{uRYMcI;{%MiTb~BR zbpZ;La#|=wJk;M2ZuIQDvU$TPF-z&tX=sEjmEuBNfCQHE1q6lKA=r|$hP+?)N4O6f zTlisvuD#K(gZGiqfmar4m4Qs&1`WGz^6S{Nyn#crN)N@LCAVG)ZYzyV62)*5sFi8% z30NEt;Ao8-IVHNf?k3f+EdClw7qV|4yxb@_kUS%lxQKW`7vNpoqn6B2t38&uulUvb zYYC3EDG$BH#CrAwKMLd} zf|8n+&(TvV_}2P!4~d^>P%|sor9U4CM(F}|js(qNwnmh5Rj{IIqNfku4@()QO`GR_ zrgn(w$T6+mx|Qz>cRXsGDIG9S7-?7}(nx9bivFfu01E-*g$Y-Lx?DN^SFFd~r5)^cN>Ot(@pJr|$u!obg)b$zh|@Ms^b`!K`o<=4 zs_yQ7+xa>to=y`_B|6xlPHMVd<)0}?OJ6hFQrtDTkucZKFW}r#irqj#A%ZjNZ)*{> zf+#s_J7M76E$J3#A0n@^SxsDaSQ6&`!K*V_Aws}=KZ`$&4NXOoOO?wKuS-Lo_wStqvb~JH zG>5AyJE!NcI=0Gs%+u{UFqDx6t=3f!y^~;_x3=nTTEz^GW0Kr7i`+~n#^9zs4M}L` zN7++lDNWW7u~SQ&Qg!Y}C2-)~nc>h%VJ=TZm@Q(+E25Vx8tujv@3y5umWlKg_m;b) z9OKgqU*yuTu1)Yi7kW3h8t5iQpOU!BR6B!C)V3ir#teMx2&WI!mOz_x*|@l2U^t%- z<`41FD^v>agD`MRV~aq8K8vTZDDuZKz)Cds}In8klN7t9V%{B*Jg^~<8*bsQRj z-g)S`N%{oGCSp5$+pwU$_4M-@_Nbf-7}WB?459+o@WT(*rcQI)$7pS@!CW+j?b|P{ z3GF*2JA!d(on{M;Ie+<7J#z`1?mtEsiS&fCR z^JSa<6ieiw3wE&5<2H5_`FUZ1-B)GQ<2V?M%;#8}>+&BHLbeocaeDj$xI9JbKiO@1 zsq+OmtZk13o%9N4TFAz7u)C7r_)u8PY1={54bK~WR0W}eOI z6M`NXaU2|3O&^BGIDEWS6COH}$F}MQ=2fJ&!0TKv_C3%JVd9{Pg8ykgM?SSQ)at5*}CX`S&!254!4qi zOWP+A(ju}Bc6NS#MG*bE*N1DW@+r|mdM0*SN;G4Y^jNhiExrdQFH7G(P(6IPm{)O{ z=x@A=6{+M`*}983lGt#;VJ>dTbGE+cd$82sbG|TAbCu7~NPSEYi$I1QoIK9;+a@>a zZS=O7661QlOI`ek_X7MNhYfmKkwY7=^)#D5XM zv@&Okj8&4(z?QjTb}KhLzm*~(xQZp$M{Pmk^P69X1&>B9=a0Ci+4J7ZoKfTB`-!#J zF0)=8e1HXQ%-oY;Z<~1SyiLE*%t`-oxqXJ~ii^Qy+2R)6uP&!u)+(W@7|-tS!##oI zAD^^b^sG2l{p_}WZTtF=QiVnYnO+w&y84spI`M1wTw6QXS_&@#Gu_smEtR>9fG2|D zZ&WrnX{lV_=Z#eoZf)xb9NY_^q)%)xLWF zM#wgxM5SlpQ~{nf(ly--l7bWGzMS3`mHD+l@=G3+>EGcyo4$9jnet4AZxe*Rj+^$eoJ4C*jXCzysH2c?*T^U&&@3wh9j+w11VJ>#|pR%tT0h^YMJ*0lrpC-FcmXtAQx?du9w?pe;iuWl1d{MOIntNRbUn7`h z?|>_L1)Z9Vc|6T696JK$_HMyKmv!L?rDX@#&qek@1`ksQ!)g@PQCYtNd(}U!5!|Ea z`A)HYh1!-c*7o-@!9RX?7lSX0eiRG|M!ODsIemAZlRcAt5$B#JFeL6^JX4C7lO`;$ z%K>TcX5E}McJD&&X?M(A*dW6?BuPxm$$AJ4i+$o?9$j9e4$BCfWQAd`8|X!Y7Ds0D zdE3n`Tj``_(UKtYz9Ctt{+xzXtZM#$QHaMYF{ppi$ zhu6NO(u=wm;7)D~PewDo>6$sUw2El_<(j%f9N6w}l%2rQrEFGb)-ts;f&qjj14gIi z;j7Y}p{u|jm97~_}l?)1UDgl{9{0~DPft5@!kc#)hcx{Jb7 z-sVMAP=Bu5>3fY6I>Td1&RM(OPMy=PLaUT#a{NcqDJr_%R;x`y09$C)_7!o!kLj2n zI;PoRR+Je9=hF;fp%5fHd&P{LmlEs}F`A5S;CT6fwyuH+FRbM#ZMo+iQlFbOVi5f! zrfB%W{*Z0ihg;j+>Z}9-yLcMYYH6@qC`ZMC>3cQv=b>r#7Tt3b)>`lT3Kv!z;j^nh z4cp|4xJru~lM1b>Xzwf1joe!u(Yo5%q33k+YBQnF<~-r|)34oycl z&Q&K3xU8+;ETzDht=Zka)3a{)E9TdZ zd0zIfrm9#gWCd4V+uk~JT7#qe%zIcVlnwEklSYmcVSlty>)5YMlB{r?ZST9|(MvhHC;!O@l#cApC zco0zdmS@77Qd&-m4zi7?~!xVbyaXj3()bX`{91cHA-K zn&~rghj8tlw>Yf&C?~Dq{NoAoruX?*`k|N?+K$bN_F5^;{daXxivi`_gNK+=7#-?F zId?yDGv9P4l8){gc%}R{r*H7PVPzv#O&>ozm9=?Gpo^M{FD%Fy+=YHDm~xv;R`P{s zyH1{C1uHU3s_cgFej`^bd|jf?a37s8j3CaKJij+I*J69IxTwT0>4sjz$S0kLaP3Z> z1O1oi4eYC!Kyeb#P`Uvg8hK-&8st<~JXc-1$YiSH7MGZoOW$Kt^>uoxM<4X~#n>Q6 zAK**L+-(zk0u`9v=X)g9)_B_Ptcj_-RBVOMNX!|^Elz-gK#$0E* zt*VV$#%oBD3yPu+W*TVFOJ#U%Y znvZ=Ay9hhpS;-EKj3{_g(MNm~9Vg*kIPJnlgY$yWv{?HKQ3<7Ae3g4f)pEuIqXeu` z%V3*_3U<(hQ3~BPL>=Kn2jj}*Tm}+>>`=~F{c*Vh#O`P(fcXDjP_qjOv=T%^7WN~E>$sn4-^)e{S&7l{H)`P`UO_G!R z)6gUk5x(s^uV>QoX^7L$DBtY8B$T)kTx0$G!jnZZvwZMfLHh(xk6wF^yOrr6T^dJ| z!Gn>x`FmoTS+f{~Dsjf{x?*zanRhW|LU<4FPQ;HJI{Tg|?ihEvZN<7<2b9pFV&p_2 zJZu!_(J5`Utb{x3?+x!XKRGkGw)_12)ak)@vD;N(fgh!Z|3!| z3ERFJMfNpLV2BzbGa(fnJD#9 z{C$JMVf>Ef8j?ZMeFP$z^N4(ArX5V=n;P|n$&*EB!Bf}K%ra`DRvvt~Tg*?e*wwCE zScIEy1cD3Z;gX!=S~pIc36ex31RFGbA&#fbX^C)p2X^E53x_QAig4`>(Xj^+ODbvp zt2b2*$0{j!y+F`%_waalU-BQp(zcTDqc-iECpi?eUV|q;Pb3K?GQOpZRN2*dMZ3r#RUAGUTo}2c5b>YR{^cE%!H2WF-;?ACE7VfC#2uD0D97P2FT>zyAC_lqCC zYkrT|jkX5^-(agC?HhyKll1nPNZzOwcXy~0o9dY8W#d{#bdpbSDkxb=^#)QRcp1KB zw1p5}h-k^N3hEi=F}it9>1L0n2qd_Pv5qI+r3NUF=o9fqgLg!dB@r5LkB^+HlXGx@ z#)6O)b-1H@nnQ#-JI~fFf;d#vw@pSag%H%_L?R+?8xNn9#bSbLF=ZjvT>nk%T_N&x zwTE&}cIz2}Bc6B7OAWmca>etNYjyiAxG*wf^MQ=!V*&u91YH*`U7O9(Me{~dd=9vx z!rpZ0l)sx|VhV$tQp~qDLEp^?#$WjAXE3nt_9B`S@60EYJ;BCjMoWVQlq=fb%V*b2 zRw4POe`hb?;fUG8v&=FqTzXE0*s}Jt#v;Cei8FscUt<5c(i`(XOqAsz-UfiH40dwCM5^ zT8;*ZsSfhitr`ToA?;efKMLeYm4+ifGJq{$Lhg0m|Cf``^!TvyZWrdz^BkDy3; zaQk)xIkQV#S_N0Wd~KrrOViEKK*#<4=6Vi?7j$eWOnD3pwP2JE-C~Miyk#*% zOr&wHqz#CRb^SU#Tb-RN90kk&2BE=w%Kk~YG>>ORsc0elx?*;oiJmz9xi z{Z-U)E>W;xhxfRKQzEJAzBq21)z83L`!vU%3A_nR`gD7TB(t+-amjT{6J&vSs(q#wazMvS@e%4pz$-jz;3My9J-nNxTA_5ePdgTDO7?RM^$BHY~sKnm%z@%eJI=4$Y^8r z6Mf3XlySSseBF0kUHKavOzab4;^DY2TLNFSrWm!C=j$HPr7e(et?8J7GG=6qSjxZk!1a$J)A%0YgIWxLM1^4DP%>pu6m)j7Y|h4h#`{^vbl7S9 zNj#;)-sC6i#Hejfb`(jPn33Vs}{$XS@TMDTB7B{-OPYeXUt z50cs9 z#AkDoLOn8vSiUo*W>h8V%iNnPIrzEmZ zZqIC#dQ{rEmuUICdCNkSb(Av+QMMDd%hu_sIVvC_aOxtkTlqG1#VllFeaeRm1_rm z2S%K!WJ(gHz&T#sf&sHzd|^Y&KG)~!zK_meFM_6P#MQB+-;L>5`S-rRX`ogqc%tw3 z+0v>TgTF&pNR_#P+c zrtQRM3TYjs;OaxE5R98z&y_SHw|@n1L}-?F3X)6+a*a^#Y2IE|fe^;B@mUz-aanwwDj`+#9D&W&~H#g3Vnn5 zeIR@D{+;T=DniLQK4>A1k1KJ3{hUY^xkt zBBTgj)%*IHEPi5@^3CZXNa5>fj*|V+!aa90A~u;a;{oK}O@?oBGGk*)uGh=o!84;j zm%oyv9ZkElB-fA+!b-JAH>P|MGB2Khv*f?ioB=^Z@X7|#2$Gb)Pbl*Yv8kdS@u@Bo z`F<^2r9nm=+?Vnd{^WiFR4@5Mzi(v2%fa)Pv-N)iF+EBVuTuBHVw?~F1 z;h1arMR$fKkOmE@gd`3%TFV?M6Gd;9DxNrA%?R$Za$VN29LvCijS5f1pWK&oG zwK<=ZdBhmA${bWeMq2O(*VL93GM02BvuvBtiUqk9N^{TTdOY^7rxTymS&)>{4di@> z2n2MgcjKEq-pKIh5elDxIwfA}5;r{nz)vx7P;wp@Mi@>vcc1afpJ`n1>))6ODeS(4efmGr0c2*G^BGfojX*j&fvCv6pw-UdAoK#Ii<>0ypo0B5^{gz=(mE+oR zyTo?uo){{@&Arfu44uy#7{STf4h*n+^AC+=5!iwf^ujm<{wzoVdZOLEZm#x0%}Ny%Es4qxX7NEMjFa`0p!F6} z!)36Bq|Qn;^mKCRTLkR@pZt{Z;$37rX!|N$^18wR1?0)|w6MzMFH*x9Na=WMC)WFl z!3~@iP@OqyMON(lsj-PPOLsj%%huwWI>5wL38_9r%i{)Pj=717#6ty68SLY}Q8k*9 z=@mLolYx&mB{eJ6l39|Z*okGWh>SaP8*VY4t%Z(lS*n}&g zY@Cn7DhI@-roHq;gE=%G~-1abxOVR8L}pgI%SZgfdKfzhVY;om4UKH+8+i}EIz;L!7f-6 zBFx7%WN{j1&Fmr*sBj1MIF=9i;ktGnpx#p+u=J*qfb{J!qAQhk2*tH-QzP!z5=m4k~h4f4ivK1auR$> z{tHWSBbZX3B~0~}+(MdoMGY-^iie*EZX#GLo)qV*63q}lmU=pP9*yHh=V2|^engW1 z=N)r|%gE*p4HjP;rHypheVsx~$L?N95vfuer!7VZb@QS7Wsu0}no9^j1ve`;4c)0J z4U^0UCOcmK2wEp&GqNwn#)Xe}or?NR7?-L`v9@WnZ)$w2Mz^iT@mYsW?hAavP0vns z4$k^8E{i8Nl9`a^f`XaTYac1ZoY}r^4K?OadK0EXLery52&{)|`#rv>M#zUTl0v-} zqxI4alQx)0^Jl$J2QBFMztE&>FQflbPxZc^FY!wH8$;8s3om8iK?T7#%p9r|eDcB7= zf`$T&LeOOqoZ#DXXd!ywuh`Iz)KqAv4$**MOz`)0JS~`dETC}^z!*U+!$^k z`1*%(lEI-YsMDX`27X4@Tmc*+@bx{+;-u=dYOpJlYH$fO@31yZ`%??(P5_B1e~q>r z|L-BSzd+Q%1ODJ{64ObJqvCQxpo56mwA7NEk*dP(;W7B?34a72&{)T@Y5#|a9c?6Y zY@o0m5yUy#FfC+Z)cAF91SmAn2RES+nN`;hzh?@dPk1X?R diff --git a/resources/hero.gif b/resources/hero.gif new file mode 100644 index 0000000000000000000000000000000000000000..521f4d44b5dd4e7e12b85fb98727174487b546c4 GIT binary patch literal 9305 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 UX1ebi#R+Tw-S2^Z@4wpr2kM{P(*OVf literal 0 HcmV?d00001 diff --git a/resources/hero.png b/resources/hero.png index 2237754b3202921cee8e6cf461ad66949a5d94af..0060c97a628261cc3133d95cb278137eb6c218ca 100644 GIT binary patch literal 3869 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 literal 12733 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 literal 0 HcmV?d00001 diff --git a/resources/zombie3.png b/resources/zombie3.png index 0111fb733e0b486807a0272e5ca9344aa711358b..d49465c4e81ff5fae7182d232ce0488c177f1025 100644 GIT binary patch delta 1708 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 Z3ls+~J31|TT5A9R002ovPDHLkV1kv6k@^4t diff --git a/tiles/common.go b/tiles/common.go new file mode 100644 index 0000000..7bceaf3 --- /dev/null +++ b/tiles/common.go @@ -0,0 +1,6 @@ +package tiles + +type spritePosition struct { + x int + y int +} diff --git a/tiles/ending.go b/tiles/ending.go new file mode 100644 index 0000000..f68363a --- /dev/null +++ b/tiles/ending.go @@ -0,0 +1,81 @@ +package tiles + +import ( + "bytes" + "fmt" + "image" + "log" + + "github.com/hajimehoshi/ebiten/v2" + "gitlab.com/kbr4/9heroja/collision" + "gitlab.com/kbr4/9heroja/resources" +) + +var ( + destinationImage *ebiten.Image +) + +type Ending struct { + X float64 + Y float64 + IsDead bool +} + +func (e *Ending) DrawEnding(screen *ebiten.Image) { + + // set movement positions to be hashmap of sprite positions for each direction + + op := &ebiten.DrawImageOptions{} + op.GeoM.Reset() + op.GeoM.Translate(e.X, e.Y) // Center the sprite on the tile + op.GeoM.Scale(1, 1) + // Apply red tint if the zombie is dead + if e.IsDead { + op.ColorScale.Scale(1, 0, 0, 1) // Scale the red channel up, green and blue down. + } + screen.DrawImage(destinationImage.SubImage(image.Rect(0, 0, resources.TileTileSize, resources.TileTileSize)).(*ebiten.Image), op) +} + +func init() { + img, _, err := image.Decode(bytes.NewReader(resources.Ending_png)) + if err != nil { + log.Fatal(err) + } + destinationImage = ebiten.NewImageFromImage(img) +} + +func NewEnding() *Ending { + ending := &Ending{} + ending.X = 45 + ending.Y = 75 + return ending +} + +func (e *Ending) CollisionShape() collision.Polygon { + if !e.IsDead { + return collision.Polygon{ + Points: []collision.Point{ + {X: e.X, Y: e.Y}, + {X: e.X + resources.TileTileSize, Y: e.Y}, + {X: e.X + resources.TileTileSize, Y: e.Y + resources.TileTileSize}, + {X: e.X, Y: e.Y + resources.TileTileSize}, + }, + } + } else { + return collision.Polygon{ + Points: []collision.Point{}, + } + } +} + +func (e *Ending) CollisionObjectType() collision.ObjectType { + return collision.Ending +} + +func (e *Ending) HandleCollisionEvent(other collision.Collidable) { + coll := other.CollisionObjectType() + switch coll { + case collision.Zombie: + fmt.Println("Ending hit by zombie") + } +} diff --git a/tiles/starting.go b/tiles/starting.go new file mode 100644 index 0000000..9fda11b --- /dev/null +++ b/tiles/starting.go @@ -0,0 +1,77 @@ +package tiles + +import ( + "bytes" + "fmt" + "image" + "log" + + "github.com/hajimehoshi/ebiten/v2" + "gitlab.com/kbr4/9heroja/collision" + "gitlab.com/kbr4/9heroja/resources" +) + +var ( + startingImage *ebiten.Image +) + +type Starting struct { + X float64 + Y float64 + IsDead bool +} + +func (s *Starting) DrawStarting(screen *ebiten.Image) { + op := &ebiten.DrawImageOptions{} + op.GeoM.Reset() + op.GeoM.Translate(s.X, s.Y) + op.GeoM.Scale(1, 1) + if s.IsDead { + op.ColorScale.Scale(1, 0, 0, 1) + } + screen.DrawImage(startingImage.SubImage(image.Rect(0, 0, resources.TileTileSize, resources.TileTileSize)).(*ebiten.Image), op) +} + +func init() { + img, _, err := image.Decode(bytes.NewReader(resources.Starting_png)) + if err != nil { + log.Fatal(err) + } + startingImage = ebiten.NewImageFromImage(img) +} + +func NewStarting() *Starting { + starting := &Starting{} + starting.X = 550 + starting.Y = 1000 + return starting +} + +func (s *Starting) CollisionShape() collision.Polygon { + if !s.IsDead { + return collision.Polygon{ + Points: []collision.Point{ + {X: s.X, Y: s.Y}, + {X: s.X + resources.TileTileSize, Y: s.Y}, + {X: s.X + resources.TileTileSize, Y: s.Y + resources.TileTileSize}, + {X: s.X, Y: s.Y + resources.TileTileSize}, + }, + } + } else { + return collision.Polygon{ + Points: []collision.Point{}, + } + } +} + +func (s *Starting) CollisionObjectType() collision.ObjectType { + return collision.Starting +} + +func (s *Starting) HandleCollisionEvent(other collision.Collidable) { + coll := other.CollisionObjectType() + switch coll { + case collision.Zombie: + fmt.Println("Starting hit by zombie") + } +} diff --git a/zombie/zombie.go b/zombie/zombie.go index 7ba9987..7fc993d 100644 --- a/zombie/zombie.go +++ b/zombie/zombie.go @@ -12,22 +12,25 @@ import ( "time" ) -const WalkSpeedMs = 50 +const WalkSpeedMs = 10 var ( - zombieImage *ebiten.Image - walkTicker *time.Ticker + zombieImage *ebiten.Image + walkTicker *time.Ticker + animationTicker *time.Ticker ) type Zombie struct { - step int - direction configuration.Direction - IsWalking bool - X float64 - Y float64 - OffsetX float64 - OffsetY float64 - IsDead bool + step int + direction configuration.Direction + IsWalking bool + X float64 + Y float64 + OffsetX float64 + OffsetY float64 + WhereToGoX float64 + WhereToGoY float64 + IsDead bool } type spritePosition struct { @@ -63,8 +66,9 @@ func (z *Zombie) DrawZombie(screen *ebiten.Image) { // Apply red tint if the zombie is dead if z.IsDead { op.ColorScale.Scale(1, 0, 0, 1) // Scale the red channel up, green and blue down. + } else { + screen.DrawImage(zombieImage.SubImage(image.Rect(p.x+1, p.y, p.x+resources.ZombieTileSize, p.y+resources.HeroTileSize)).(*ebiten.Image), op) } - screen.DrawImage(zombieImage.SubImage(image.Rect(p.x+1, p.y, p.x+resources.ZombieTileSize, p.y+resources.HeroTileSize)).(*ebiten.Image), op) } func init() { @@ -74,8 +78,7 @@ func init() { } zombieImage = ebiten.NewImageFromImage(img) walkTicker = time.NewTicker(WalkSpeedMs * time.Millisecond) - // go routine that runs on every tick and increases step - + animationTicker = time.NewTicker(WalkSpeedMs * 5 * time.Millisecond) // Adjust the speed of animation frames } func NewZombie() *Zombie { @@ -89,6 +92,27 @@ func NewZombie() *Zombie { for { select { case <-walkTicker.C: + if zombie.IsWalking { + // Move the zombie towards its target position + if zombie.X < zombie.WhereToGoX { + zombie.X += 1 + } else if zombie.X > zombie.WhereToGoX { + zombie.X -= 1 + } + if zombie.Y < zombie.WhereToGoY { + zombie.Y += 1 + } else if zombie.Y > zombie.WhereToGoY { + zombie.Y -= 1 + } + } + } + } + }() + + go func() { + for { + select { + case <-animationTicker.C: if zombie.IsWalking { zombie.step++ if zombie.step > 3 { @@ -98,6 +122,7 @@ func NewZombie() *Zombie { } } }() + return zombie } @@ -152,5 +177,9 @@ func (z *Zombie) HandleCollisionEvent(other collision.Collidable) { fmt.Println("Zombie hit by bullet") z.Stop() z.IsDead = true + case collision.Ending: + fmt.Println("Zombie hit the ending") + z.Stop() + z.IsDead = true } }