diff --git a/TippuKivet/.idea/.idea.TippuKivet/.idea/vcs.xml b/TippuKivet/.idea/.idea.TippuKivet/.idea/vcs.xml index 94a25f7f4cb416c083d265558da75d457237d671..288b36b1efb71c411d5c27a1ea6c08e41a7fed46 100644 --- a/TippuKivet/.idea/.idea.TippuKivet/.idea/vcs.xml +++ b/TippuKivet/.idea/.idea.TippuKivet/.idea/vcs.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> <mapping directory="$PROJECT_DIR$" vcs="Git" /> </component> </project> \ No newline at end of file diff --git a/TippuKivet/.idea/.idea.TippuKivet/.idea/workspace.xml b/TippuKivet/.idea/.idea.TippuKivet/.idea/workspace.xml index 8819f18e5fca56ef96074b7ae1b38f0847ee92b9..55058ec3487f69d268dae665dce9d956660b4df5 100644 --- a/TippuKivet/.idea/.idea.TippuKivet/.idea/workspace.xml +++ b/TippuKivet/.idea/.idea.TippuKivet/.idea/workspace.xml @@ -14,11 +14,11 @@ <option name="LAST_RESOLUTION" value="IGNORE" /> </component> <component name="Git.Settings"> - <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> + <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." /> </component> - <component name="ProjectColorInfo"><![CDATA[{ - "associatedIndex": 4 -}]]></component> + <component name="ProjectColorInfo">{ + "associatedIndex": 4 +}</component> <component name="ProjectId" id="2ul5Xh6t4LXvV8I0yFwY1wP6QLU" /> <component name="ProjectViewState"> <option name="hideEmptyMiddlePackages" value="true" /> @@ -28,7 +28,8 @@ "keyToString": { ".NET Project.TippuKivet.executor": "Run", "RunOnceActivity.ShowReadmeOnStart": "true", - "git-widget-placeholder": "master", + "XThreadsFramesViewSplitterKey": "0.88839287", + "git-widget-placeholder": "main", "node.js.detected.package.eslint": "true", "node.js.detected.package.tslint": "true", "node.js.selected.package.eslint": "(autodetect)", @@ -67,6 +68,7 @@ <option name="presentableId" value="Default" /> <updated>1742810361526</updated> <workItem from="1742810362569" duration="8643000" /> + <workItem from="1742821846343" duration="7405000" /> </task> <servers /> </component> diff --git a/TippuKivet/TippuKivet/Content/kivi.png b/TippuKivet/TippuKivet/Content/kivi.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f1369a7de898b2b06cb370f19ec52a0add6a5c Binary files /dev/null and b/TippuKivet/TippuKivet/Content/kivi.png differ diff --git a/TippuKivet/TippuKivet/Content/pelaaja.png b/TippuKivet/TippuKivet/Content/pelaaja.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2f6b8f65065cd9f0a35b4e4887ee63f60024e6 Binary files /dev/null and b/TippuKivet/TippuKivet/Content/pelaaja.png differ diff --git a/TippuKivet/TippuKivet/Content/taustakuva.png b/TippuKivet/TippuKivet/Content/taustakuva.png new file mode 100644 index 0000000000000000000000000000000000000000..8c173054ac6f1b4e0c90a179221e025bf378cafc Binary files /dev/null and b/TippuKivet/TippuKivet/Content/taustakuva.png differ diff --git a/TippuKivet/TippuKivet/Content/timantti.png b/TippuKivet/TippuKivet/Content/timantti.png new file mode 100644 index 0000000000000000000000000000000000000000..62c84fbbc726b5cda597c34ef1c00b830580b6b5 Binary files /dev/null and b/TippuKivet/TippuKivet/Content/timantti.png differ diff --git a/TippuKivet/TippuKivet/TippuKivet.cs b/TippuKivet/TippuKivet/TippuKivet.cs index 78f117be66fe5f0547760930173ab38eccc569b1..3e29fe52f25e69e950bc93447e0c1f58d3803074 100644 --- a/TippuKivet/TippuKivet/TippuKivet.cs +++ b/TippuKivet/TippuKivet/TippuKivet.cs @@ -4,87 +4,111 @@ namespace TippuKivet { public class TippuKivet : PhysicsGame { + // Pelaajan liikkumisnopeudet oikealle ja vasemmalle private readonly Vector nopeusOikea = new Vector(800, 0); private readonly Vector nopeusVasen = new Vector(-800, 0); + // Pelin keskeiset muuttujat private PhysicsObject pelaaja; - private IntMeter pistelaskuri; - private Timer ajastinTimantit; - private Timer ajastinKivet; - private int ohimenneetTimantit; + private IntMeter pistelaskuri; // Pisteiden laskuri + private Timer ajastinTimantit; // Ajastin timanttien luomiselle + private Timer ajastinKivet; // Ajastin kivien luomiselle + private int ohimenneetTimantit; // Laskuri, montako timanttia pelaaja on missannut public override void Begin() { - SetWindowSize(1024, 768, false); + // Asetetaan pelin ikkunan koko + SetWindowSize(800, 600, false); + // Aloitetaan timanttien ja kivien generointi ajastinTimantit = Timer.CreateAndStart(1.5, LuoTimantti); ajastinKivet = Timer.CreateAndStart(3.0, LuoKivi); + // Alustetaan pistelaskuri pistelaskuri = new IntMeter(0); LuoPisteNaytto(); + // Asetetaan painovoima Gravity = new Vector(0, -700); + + // Luodaan pelaaja ja pelin kenttä pelaaja = LuoPelaaja(0); LuoKenttä(); + + // Asetetaan ohjaimet AsetaOhjaimet(); } private void LuoKenttä() { + // Luodaan näkymätön alalaatta, johon kivet ja timantit voivat osua PhysicsObject alalaatta = Level.CreateBottomBorder(); alalaatta.IsVisible = false; AddCollisionHandler(alalaatta, "Kivi", KiviAlalaattaCollide); AddCollisionHandler(alalaatta, "Timantti", TimanttiAlalaattaCollide); - + + // Asetetaan taustakuva ja taustan väri + Level.Background.Image = LoadImage("taustakuva"); Level.Background.Color = Color.Black; + + // Zoomataan kamera kenttään sopivaksi Camera.ZoomToLevel(); } + // Luodaan pelaaja-objekti private PhysicsObject LuoPelaaja(double x) { - PhysicsObject pelaaja = LuoObjekti(350, 100, x, -400, Color.Red, "Pelaaja"); - pelaaja.IgnoresCollisionResponse = true; - pelaaja.IgnoresGravity = true; + PhysicsObject pelaaja = LuoObjekti(150, 200, x, -300, Color.Red, "Pelaaja"); + pelaaja.IgnoresCollisionResponse = true; // Törmäykset Pelaajaan ei vaikuta. + pelaaja.IgnoresGravity = true; // Painovoima ei vaikuta Pelaajaan + pelaaja.Image = LoadImage("pelaaja"); + // Lisätään törmäyskäsittelijät pelaajalle AddCollisionHandler(pelaaja, "Kivi", PelaajaKiviCollide); AddCollisionHandler(pelaaja, "Timantti", PelaajaTimanttiCollide); - Add(pelaaja); return pelaaja; } + // Luodaan pistelaskuri-näyttö private void LuoPisteNaytto() { + Label pisteNaytto = new Label { - Position = new Vector(-400, 200), + Position = new Vector(340, 250), TextColor = Color.Red, Color = Color.White, - Size = new Vector(5000, 5000) + Size = new Vector(5000, 5000), + Title = "Pisteet: ", }; pisteNaytto.BindTo(pistelaskuri); Add(pisteNaytto); } + // Luodaan satunnaiseen paikkaan ilmestyvä timantti private void LuoTimantti() { + double x = RandomGen.NextDouble(Level.Left + 50, Level.Right - 50); PhysicsObject timantti = LuoObjekti(60, 60, x, Level.Top + 50, Color.Yellow, "Timantti"); timantti.AngularVelocity = RandomGen.NextDouble(-5.0, 5.0); - AddCollisionHandler(timantti, "Pelaaja", PelaajaTimanttiCollide); + timantti.Image = LoadImage("timantti.png"); Add(timantti); } private void LuoKivi() { + // Luodaan satunnaiseen paikkaan ilmestyvä kivi double x = RandomGen.NextDouble(Level.Left + 20, Level.Right - 20); double randomSize = RandomGen.NextDouble(30.0, 120.0); PhysicsObject kivi = LuoObjekti(randomSize, randomSize, x, Level.Top + 50, Color.White, "Kivi"); kivi.Velocity = new Vector(0, -400); - AddCollisionHandler(kivi, "Pelaaja", PelaajaKiviCollide); + kivi.Image = LoadImage("kivi.png"); Add(kivi); } + // Aliohjelma objektien luomiseen private PhysicsObject LuoObjekti(double width, double height, double x, double y, Color color, string tag) { return new PhysicsObject(width, height, Shape.Rectangle) @@ -107,18 +131,21 @@ namespace TippuKivet VoitaPeli(); } } - + + // Pelaajan ja kiven törmäyskäsittelijä private void PelaajaKiviCollide(PhysicsObject pelaaja, PhysicsObject kivi) { kivi.Destroy(); LopetaPeli("Kivi osui sinua päähän, Peli ohi!"); } + // Kiven ja alalaatan törmäyskäsittelijä private void KiviAlalaattaCollide(PhysicsObject alalaatta, PhysicsObject kivi) { kivi.Destroy(); } - + + // Timantin ja alalaatan törmäyskäsittelijä private void TimanttiAlalaattaCollide(PhysicsObject alalaatta, PhysicsObject timantti) { timantti.Destroy(); @@ -129,9 +156,11 @@ namespace TippuKivet LopetaPeli("Et ollut tarpeeksi tehokas!"); } } - + + // Pelaajan koko pienenee timantin keräämisen jälkeen private void KutistaPelaaja() { + const double shrinkFactor = 0.9; const double minSize = 10.0; @@ -142,37 +171,41 @@ namespace TippuKivet } } + // Peli päättyy voittoon, jos pelaaja kerää tarpeeksi pisteitä private void VoitaPeli() { MessageDisplay.Add("Olet TippuKiviLuolan suvereeni Päällikkö!"); ajastinTimantit.Stop(); ajastinKivet.Stop(); Timer.SingleShot(6, Exit); + Pause(); } - + + // Peli päättyy häviöön, jos pelaaja osuu kiveen tai missaa liikaa timantteja private void LopetaPeli(string viesti) { MessageDisplay.Add(viesti); ajastinTimantit.Stop(); ajastinKivet.Stop(); Timer.SingleShot(7, Exit); + Pause(); } - + + // Määritellään pelin näppäimet, pelaajan liike, pause ja ESC. private void AsetaOhjaimet() { - Keyboard.Listen(Key.A, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa vasemmalle", pelaaja, nopeusVasen); - Keyboard.Listen(Key.A, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero); - Keyboard.Listen(Key.D, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa oikealle", pelaaja, nopeusOikea); - Keyboard.Listen(Key.D, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero); - Keyboard.Listen(Key.Left, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa vasemmalle nuolinäppäimellä", pelaaja, nopeusVasen); + + Keyboard.Listen(Key.Left, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa vasemmalle", pelaaja, nopeusVasen); Keyboard.Listen(Key.Left, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero); - Keyboard.Listen(Key.Right, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa oikealle nuolinäppäimellä", pelaaja, nopeusOikea); + Keyboard.Listen(Key.Right, ButtonState.Down, AsetaNopeus, "Liikuta pelaajaa oikealle", pelaaja, nopeusOikea); Keyboard.Listen(Key.Right, ButtonState.Released, AsetaNopeus, null, pelaaja, Vector.Zero); Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); + Keyboard.Listen(Key.P, ButtonState.Pressed, Pause, "Pysäyttää pelin"); } private void AsetaNopeus(PhysicsObject pelaaja, Vector nopeus) { + // Estetään pelaajaa menemästä kentän ulkopuolelle if ((pelaaja.X + pelaaja.Width / 2 >= Level.Right && nopeus.X > 0) || (pelaaja.X - pelaaja.Width / 2 <= Level.Left && nopeus.X < 0)) { @@ -183,7 +216,5 @@ namespace TippuKivet pelaaja.Velocity = nopeus; } } - - } } diff --git a/TippuKivet/TippuKivet/TippuKivet.csproj b/TippuKivet/TippuKivet/TippuKivet.csproj index d164748ef3ffb530b112a04baa4bad2904c8c70d..c1b0336c41f50140deaf20e82ce3aaf7db18ce25 100644 --- a/TippuKivet/TippuKivet/TippuKivet.csproj +++ b/TippuKivet/TippuKivet/TippuKivet.csproj @@ -10,4 +10,19 @@ <PackageReference Include="Jypeli.FarseerPhysics.NET" Version="2.*"/> </ItemGroup> + <ItemGroup> + <None Update="Content\kivi.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Update="Content\taustakuva.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Update="Content\timantti.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Update="Content\pelaaja.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + </ItemGroup> + </Project>