From fb37b7077283c57f76bd82e9a08f8de513a46e30 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Tue, 4 Oct 2022 22:39:02 +0200 Subject: [PATCH] added sounds and updated model + collision --- Program.cs | 5 +-- dotnet-console.csproj => asdlteroids.csproj | 9 ++++- assets/explode.wav | Bin 0 -> 53656 bytes assets/shot.wav | Bin 0 -> 16456 bytes src/Controlls.cs | 29 +++++++++++++++ src/Scene.cs | 4 ++ src/engine/AudioPlayer.cs | 32 ++++++++++++++++ src/engine/KeyState.cs | 5 +++ src/entities/Asteroid.cs | 5 ++- src/entities/Ship.cs | 39 ++++++++++++-------- 10 files changed, 106 insertions(+), 22 deletions(-) rename dotnet-console.csproj => asdlteroids.csproj (55%) create mode 100644 assets/explode.wav create mode 100644 assets/shot.wav create mode 100644 src/Controlls.cs create mode 100644 src/engine/AudioPlayer.cs diff --git a/Program.cs b/Program.cs index d23767e..3bd12d3 100644 --- a/Program.cs +++ b/Program.cs @@ -1,6 +1,5 @@ -// See https://aka.ms/new-console-template for more information - -var window = new Window("ASDLteroids", 800, 600); +var window = new Window("ASDLteroids", 800, 600); var renderer = new Renderer(window); var scene = new Scene(renderer); + scene.Run(); diff --git a/dotnet-console.csproj b/asdlteroids.csproj similarity index 55% rename from dotnet-console.csproj rename to asdlteroids.csproj index c033c20..5524382 100644 --- a/dotnet-console.csproj +++ b/asdlteroids.csproj @@ -3,13 +3,20 @@ Exe net6.0 - dotnet_console + asdlteroids enable enable + + + + + + + diff --git a/assets/explode.wav b/assets/explode.wav new file mode 100644 index 0000000000000000000000000000000000000000..0741f6663b115fb24bc69fc010856f5f106b2943 GIT binary patch literal 53656 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 Vf!yf#1ODeDi-huzJ~Zt|{0Cke{FMLz literal 0 HcmV?d00001 diff --git a/assets/shot.wav b/assets/shot.wav new file mode 100644 index 0000000000000000000000000000000000000000..7de2c5f2740c645d5ddf6d2ce85f430d0d0d05e9 GIT binary patch literal 16456 zcmXAQbyQ;A_dcD1fP$zf1}dV0Aa=LY-S2eAJKf#$nVxaF=p|}u@yTIL_q2M zvVOm{*I9Snb@$nK@8@~;Ie*-H=1xgVOGp3!79}oB-SF>T4;%mh0NO0&69DkP#XtZE zfCH>sy>~Um=Cc^U19pL>&@ea=PK8bZDvUz4PJUW?c=WL(K;EvY0Ng{rB1XFnd3>Oz zI7ec00dOU{pU~n}|D^8U;>_k5ayzu1b|f+<6`FxfP%+6)4Ms^Xt@=aG+h5AR6BSuq zG1>;ge*p<`ed$f<^|9=LON1CLOmvd>G<(W#=iH>~AH55W7f9Eb9tkZO$J3|Al+y3n zN2&hp$Szm??foszBk>RSjTqZW-5&qz?`_X8O<5@ zeKTqnowJ%p=(?ibf^+qs7jrH>Y|7chNcKUOIDm1;tNurU@Xyu1Z%W^{ILUL7 zPTsBINvU_HB&29V?|V$b){kvz@+|@Woss2Tw4`BtNNLqNzYazvBBtC;ABt{hzm z?x&P+7)i7#{Is3Xr|Da9iJFC?j>=8B*?-pN)>Wp87@FC*wRCv&{xrmttx3B>K<+gV zlSClolq~yuE~~bXCO9>W13Y$?v!W7qW?V{t9cv9}aD*GX`i|EAF4&(HlU-LTYG%k9 zV6Uh*xW**Pl;E^GQMrCP`vgsq=v);x50OR4{lH7?+&t-tiT25k2u_7eVWb$s@ZLSB zrOIdRcPnn?V6yh)xmGXj{;gr-e)=tr>PT(K=uIl&277#kCyX0g^2+kEcV=PoE2@>< z?%H*@-+oC^b*ZY1xykoKw|T}P_42oE&J|a3)@1?nv#LeiP;D~qx*s{}MQU!wmSkes z9Ir#DbxOOANFF^mBg;N-ta4$Oc@mGgM=J@Rn({MaUkV`t>T?5gN>$%AvubwU->io@ z@5}GEP8%n|9jUuQsuH(n+)q0ZGbg}-xW?o)7*wwb3T^wo6Dv4kYU%G!QbPrrzfR1$HlTzTxNjCk_}BiN{6!D{$49MTsy5dPwRm@ z>U%vRDJ3bxEoEwihwlgb-P+*Z^R*ue0{&KHPcMBhgpO(fd~$2h@7SklH`8|~;5aCE z3tTVHYcJuU^9Hj@bE9~`cB-5LpXu(!S)Fho{Xtq^YzFh9vkK@hscnicTb#rG3oj_C zqIDgan2W-A26AsF)}=GjT4Oo_HBNg0V`90GUpg&k@82T@e`>yWFH-wsu6QHE9wrs0 zuSh)1y;VMdzITn^yp|`s$4Z<$pitjFz4h){eZhd?2o4yooxKaxxu} zd^>!BFBwlXd>e=tR2Mg7GqQ&YXYoP3NR11o)~lPlEs>snDD_Ir?4V`NC7^#~C)=`k zd3oRdnscXBTyDWh^MSGCguvg?u+-Re&!q6M9NGcxW^#B1e_uFmQo1+46Woad!y8sWnnQ!ydNuPwYI$uE6Q z%8Mvm0Mp3;_$s;Ba1833Ux8-|9P2R@rj=Z{x=`FWMjHa)IXTAervcxZGKU0EYq(ReM z9bnTHh_0}jJ%yrdQ_i1~>4M$;+q99GGEZ{I?D(40@2TMUbsVVYMY~>&W5285U5O>9 zEqhMkK=r}S6LJS=kV{=4HyWC~p-Aa>)susjjJ`vC7~rREk}>CcXc>z^8O&t|WW3V7RKgeX;C+pkq#H3`S&iQgT{y zGCt};fRXG4k&GvIM%ErJx}2lPc~K0iQ+5weU=T+r^O?G6dI~*_m-ufuiVh_@1DH}q zTV>_;0&GrO?#9v`g7UsLbvtUrof8}s`zZyIMogR?_SN^EL#f4Hvbc3dWkx}8&YHZB zWvv32evD=qRp)MHDPxYO7*bObE5dg8J#jQzS4bbVEw3^cY|eq@eJ{-w82YYF#v!68 z`9bl~HbsBS6qiacHSJYJMwr^S*kf{ zLsUT^*L4=WdSY`=cip{`*SRlqUKhqzpKNy?+XndU$nmoe+mkReH9RFH)}H;!V;csm z&lsu|x>T&nU!F5J-&+1k=rq)(3&Cvj5Cyx&Dw3m9-z3})>+!23wgL-e!JS1l1w~G| z8M)JnpVm(6vW!!~M$!O%Zn%A7TI#3dlQ9XwlT@wUpl;(3t?61tMgHX+&-~ftn;Pd1 zywLnX4Z2-t&W(0XPDss8C=`?IUWLA<8yd=J235Kj&dlx3`&t@V zf2;eV;wLzh^ug~<=(hOCl+VeixSJu)K7|fl0I_UI*A@Pol9PG2awiJYs#3Ps z%%YAmd!ka3&ZlH1zKNU}bkuD{=xpMNGdwm?~qY<%2zWO6F(DcQk)bJ(`{f#ihb zo3TkDE~J2$%UK9AXi9<-{zA#z;qGFFA#C1{eHl5%4_IDBsb zVLJdkF6-J^_pCG{zd!e4p@w(4Y0)54Q-HYPvX$W%-V!fNZcZAHxyCs_`{{5L=r6~2 zAE@72R**lIOD=@-yo49}Q4@0^(@3v;SzKjoNb>DuY`iK|L06Ie;hm~w14>~w??ItY z-qZZi(qsJDomJ9obCZ3&$8Oe_s6UCwlp~2TQ4LJAhY8zd(n%h4jMd6Y=H|c13oTk$ zxx4A(z?e!8yGq_bUl;l?ZgujSwUiD& zNulvI=7Ia>AavxXgtBDUr26PN>=oVli*Qmzuw|0^A;VirY!=Ox9kCSJYpEC}Au=N&H2F

-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 literal 0 HcmV?d00001 diff --git a/src/Controlls.cs b/src/Controlls.cs new file mode 100644 index 0000000..1a27b7c --- /dev/null +++ b/src/Controlls.cs @@ -0,0 +1,29 @@ +using static SDL2.SDL; + +enum Control +{ + THRUST, + LEFT, + RIGHT, + SHOOT +} + +static class ControlKeyExtension +{ + public static SDL_Keycode Key(this Control c) + { + switch (c) + { + case Control.THRUST: + return SDL_Keycode.SDLK_UP; + case Control.LEFT: + return SDL_Keycode.SDLK_LEFT; + case Control.RIGHT: + return SDL_Keycode.SDLK_RIGHT; + case Control.SHOOT: + return SDL_Keycode.SDLK_SPACE; + default: + throw new ArgumentException("Invalid control"); + } + } +} diff --git a/src/Scene.cs b/src/Scene.cs index 68181f6..0be4c91 100644 --- a/src/Scene.cs +++ b/src/Scene.cs @@ -12,6 +12,7 @@ class Scene public HashSet Asteroids; public int Score = 0; public int Level = 1; + public AudioPlayer AudioPlayer; public Scene(Renderer renderer) { @@ -19,6 +20,9 @@ class Scene this.Shots = new HashSet(); this.Asteroids = new HashSet(); this.renderer = renderer; + this.AudioPlayer = new AudioPlayer(); + this.AudioPlayer.Register(Sound.SHOT, "assets.shot.wav"); + this.AudioPlayer.Register(Sound.EXPLOSION, "assets.explode.wav"); instance = this; } diff --git a/src/engine/AudioPlayer.cs b/src/engine/AudioPlayer.cs new file mode 100644 index 0000000..5bbc7f2 --- /dev/null +++ b/src/engine/AudioPlayer.cs @@ -0,0 +1,32 @@ +enum Sound : int +{ + SHOT = 0, + EXPLOSION = 1, +} + +class AudioPlayer +{ + private Dictionary audioFiles = new(); + private string assemblyName; + + public AudioPlayer() + { + SDL2.SDL_mixer.Mix_OpenAudio(44100, SDL2.SDL_mixer.MIX_DEFAULT_FORMAT, 2, 2048); + this.assemblyName = this.GetType().Assembly.GetName().Name!; + } + + public void Register(Sound name, string path) + { + var stream = this.GetType().Assembly.GetManifestResourceStream($"{this.assemblyName}.{path}"); + var buffer = new byte[stream!.Length]; + stream.Read(buffer, 0, buffer.Length); + this.audioFiles.Add(name, buffer); + } + + public void Play(Sound name) + { + var buffer = this.audioFiles[name]; + var sound = SDL2.SDL_mixer.Mix_QuickLoad_WAV(buffer); + SDL2.SDL_mixer.Mix_PlayChannel((int)name, sound, 0); + } +} diff --git a/src/engine/KeyState.cs b/src/engine/KeyState.cs index 15032f0..5793a70 100644 --- a/src/engine/KeyState.cs +++ b/src/engine/KeyState.cs @@ -17,4 +17,9 @@ class KeyState byte scanCode = (byte)SDL_GetScancodeFromKey(keycode); return (this.keys[scanCode] == 1); } + + public bool isPressed(Control c) + { + return this.isPressed(c.Key()); + } } diff --git a/src/entities/Asteroid.cs b/src/entities/Asteroid.cs index b000814..7d7bef1 100644 --- a/src/entities/Asteroid.cs +++ b/src/entities/Asteroid.cs @@ -34,7 +34,6 @@ class Asteroid : Renderable, Logic public void Render(Renderer renderer, double dx) { renderer.setColor(255, 255, 255); - // renderer.DrawRect(X - (int)Size / 2, Y - (int)Size / 2, (int)Size, (int)Size); double[][] drawLines = new double[shape.Length + 1][]; for (int i = 0; i < shape.Length; i++) { @@ -65,7 +64,8 @@ class Asteroid : Renderable, Logic foreach (var shot in Scene.Instance.Shots) { - if (Point.Distance(shot.X, shot.Y, X, Y) < (int)Size / 2) + var halfSize = (int)Size / 2; + if (Point.Distance(shot.X, shot.Y, X - halfSize, Y - halfSize) < (int)Size / 2) { shot.Destroy(); this.Destroy(); @@ -88,6 +88,7 @@ class Asteroid : Renderable, Logic public void Destroy() { + Scene.Instance.AudioPlayer.Play(Sound.EXPLOSION); Scene.Instance.Score += (int)Size; Scene.Instance.Asteroids.Remove(this); Console.WriteLine("Asteroid destroyed"); diff --git a/src/entities/Ship.cs b/src/entities/Ship.cs index deaf974..39eddda 100644 --- a/src/entities/Ship.cs +++ b/src/entities/Ship.cs @@ -1,6 +1,3 @@ -using static SDL2.SDL; - - class Ship : Logic, Renderable { const double SPEED = 0.3; @@ -22,24 +19,25 @@ class Ship : Logic, Renderable public void Update(KeyState keyState, double dt) { thrust = false; - if (keyState.isPressed(SDL_Keycode.SDLK_LEFT)) + if (keyState.isPressed(Control.LEFT)) { rotation -= ROTATION_SPEED * dt; } - if (keyState.isPressed(SDL_Keycode.SDLK_RIGHT)) + if (keyState.isPressed(Control.RIGHT)) { rotation += ROTATION_SPEED * dt; } - if (keyState.isPressed(SDL_Keycode.SDLK_UP)) + if (keyState.isPressed(Control.THRUST)) { thrust = true; this.dx += Math.Cos(rotation) * SPEED * dt; this.dy += Math.Sin(rotation) * SPEED * dt; } - if (keyState.isPressed(SDL_Keycode.SDLK_SPACE) && (DateTime.Now - lastShot).TotalMilliseconds > 200) + if (keyState.isPressed(Control.SHOOT) && (DateTime.Now - lastShot).TotalMilliseconds > 200) { lastShot = DateTime.Now; var shot = new Shot(x, y, rotation); + Scene.Instance.AudioPlayer.Play(Sound.SHOT); Scene.Instance.Shots.Add(shot); } rotation = rotation % (2 * Math.PI); @@ -63,7 +61,8 @@ class Ship : Logic, Renderable } foreach (var asteroid in Scene.Instance.Asteroids) { - if (Point.Distance(x, y, asteroid.X, asteroid.Y) < (int)asteroid.Size / 2) + var halfAsteroidSize = (int)asteroid.Size / 2; + if (Point.Distance(x, y, asteroid.X - halfAsteroidSize, asteroid.Y - halfAsteroidSize) < halfAsteroidSize + 3) { Scene.Instance.Loose(); } @@ -74,20 +73,28 @@ class Ship : Logic, Renderable { renderer.setColor(255, 255, 255); renderer.DrawLines(new double[][] { - new double[]{x + Math.Cos(rotation) * 10, y + Math.Sin(rotation) * 10}, - new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10}, - new double[]{x + Math.Cos(rotation + Math.PI * 4 / 3) * 10, y + Math.Sin(rotation + Math.PI * 4 / 3) * 10}, - new double[]{x + Math.Cos(rotation) * 10, y + Math.Sin(rotation) * 10} + new double[] { x + Math.Cos(rotation) * 10, y + Math.Sin(rotation) * 10 }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3) * 10, y + Math.Sin(rotation + (Math.PI * 2) / 3) * 10 }, + new double[] { x + Math.Cos(rotation) * 10, y + Math.Sin(rotation) * 10 }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3 * 2) * 10, y + Math.Sin(rotation + (Math.PI * 2) / 3 * 2) * 10 }, }); + renderer.DrawLines(new double[][] { + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3) * 5, y + Math.Sin(rotation + (Math.PI * 2) / 3) * 5 }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3 * 2) * 5, y + Math.Sin(rotation + (Math.PI * 2) / 3 * 2) * 5 }, + }); + if (thrust) { renderer.setColor(255, 0, 0); + var random = new Random(); // Draw flame behind ship renderer.DrawLines(new double[][] { - new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10}, - new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10 + Math.Cos(rotation + Math.PI) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10 + Math.Sin(rotation + Math.PI) * 10}, - new double[]{x + Math.Cos(rotation + Math.PI * 4 / 3) * 10, y + Math.Sin(rotation + Math.PI * 4 / 3) * 10}, - new double[]{x + Math.Cos(rotation + Math.PI * 2 / 3) * 10, y + Math.Sin(rotation + Math.PI * 2 / 3) * 10} + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3) * 10, y + Math.Sin(rotation + (Math.PI * 2) / 3) * 10 }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3 * 1.2) * 5+random.Next(5), y + Math.Sin(rotation + (Math.PI * 2) / 3 * 1.2) * 5+random.Next(5) }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3 * 1.4) * 10, y + Math.Sin(rotation + (Math.PI * 2) / 3 * 1.4) * 10 }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3 * 1.6) * 6+random.Next(5), y + Math.Sin(rotation + (Math.PI * 2) / 3 * 1.6) * 5+random.Next(4) }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3 * 1.8) * 10, y + Math.Sin(rotation + (Math.PI * 2) / 3 * 1.8) * 10 }, + new double[] { x + Math.Cos(rotation + (Math.PI * 2) / 3 * 2) * 5+random.Next(5), y + Math.Sin(rotation + (Math.PI * 2) / 3 * 2) * 5+random.Next(5) }, }); } }