diff --git "a/NukkuMatti -harjoitusty\303\266/NukkuMatti -harjoitusty\303\266/Ohjelma.cs" "b/NukkuMatti -harjoitusty\303\266/NukkuMatti -harjoitusty\303\266/Ohjelma.cs" index 676af722692b84adceb8134fa80743c3bd6eba16..68527dc5f7f2ffc189035245ac1f64976d7ee2e1 100644 --- "a/NukkuMatti -harjoitusty\303\266/NukkuMatti -harjoitusty\303\266/Ohjelma.cs" +++ "b/NukkuMatti -harjoitusty\303\266/NukkuMatti -harjoitusty\303\266/Ohjelma.cs" @@ -3,11 +3,11 @@ using System.Collections.Generic; using Jypeli; // Eero Salmen tekemä tasohyppelypeli osana ohjelmointi 1 -kurssia. Pelin nimi on NukkuMatti. -// Pelaajan tehtävänä on kuljettaa NukkuMattia tasolta toiselle, tippumatta alas. +// Pelaajan tehtävänä on kuljettaa NukkuMattia tasolta toiselle tippumatta alas. public class Tasohyppely : PhysicsGame { - // Muutama vakio arvo määritelty pelin mekaniikalle, jotta ne on helpommin hallittavissa samassa paikassa + // Muutama vakio arvo määritelty tähän, jotta ne on helpommin hallittavissa samassa paikassa private const double GravityStrength = -800; private const double HyppyVoima = 1100; @@ -18,27 +18,34 @@ public class Tasohyppely : PhysicsGame private const double AlkuperainenHyppyNopeus = 1000; private const double TasoPoistoMarginaali = 200; private const double StartingHeight = -20; + private const double FallThreshold = 1200; // Pelaaja saa pudota enintään 1200 yksikköä huippupisteestään + private double highestY; + +/// <summary> +/// Pelin keskeiset objektit ja tilamuuttujat +/// </summary> private PhysicsObject pelaaja; private bool peliKaynnissa = true; private GameObject taustakuva; private Label gameOverTeksti; - private int score = 0; private List<PhysicsObject> tasot = new List<PhysicsObject>(); + /// <summary> + /// Aloitetaan peli. + /// </summary> public override void Begin() { // Asetetaan painovoima Gravity = new Vector(0, GravityStrength); - // Luodaan kentän elementit LuoKentta(); LisaaOhjaimet(); LuoGameOverTeksti(); // Ajastin sille, kyinka usein uusia tasoja ilmestyy pelikenttään Timer tasoAjastin = new Timer(); - tasoAjastin.Interval = 0.8; + tasoAjastin.Interval = 1.4; tasoAjastin.Timeout += LuoTaso; tasoAjastin.Start(); @@ -46,6 +53,11 @@ public class Tasohyppely : PhysicsGame pelaaja.Velocity = new Vector(0, AlkuperainenHyppyNopeus); } + + /// <summary> + /// Luodaan peliin kenttä, joka sisältää taustan, pelaajan, + /// aloitustason ja törmäystenkäsittelijän + /// </summary> private void LuoKentta() { LuoTausta(); @@ -53,6 +65,7 @@ public class Tasohyppely : PhysicsGame // Asetetaan pelaajan ominaisuudet ja lisätään kentälle pelaaja.Position = new Vector(0, StartingHeight); + highestY = pelaaja.Y; pelaaja.CanRotate = false; pelaaja.Restitution = 0; Add(pelaaja); @@ -75,6 +88,10 @@ public class Tasohyppely : PhysicsGame LuoTaso(); } + + /// <summary> + /// Luodaan peliin tausta. + /// </summary> private void LuoTausta() { // Lisätään taustakuva ja sijoitetaan se taustalle @@ -84,6 +101,10 @@ public class Tasohyppely : PhysicsGame Add(taustakuva, -1); } + + /// <summary> + /// Luodaan peliin lopetusteksti, joka ilmoittaa pelaajalla, että peli on päättynyt + /// </summary> private void LuoGameOverTeksti() { // Asetetaan pelin päättymis teksti @@ -95,6 +116,10 @@ public class Tasohyppely : PhysicsGame Add(gameOverTeksti); } + + /// <summary> + /// Luodaan pelaaja-olio ja määritellään sen perusasetukset + /// </summary> private void LuoPelaaja() { //Luodaan hahmo @@ -103,21 +128,32 @@ public class Tasohyppely : PhysicsGame pelaaja.Restitution = 0; } + + /// <summary> + /// Luodaan peliin tasoja. + /// </summary> private void LuoTaso() { - //Luodaan tasoja - double x = RandomGen.NextDouble(Level.Left + 100, Level.Right - 100); - double y = Camera.ScreenToWorld(new Vector(0, Screen.Height / 2)).Y + RandomGen.NextDouble(10, 10); - - PhysicsObject taso = PhysicsObject.CreateStaticObject(TasoLeveys, TasoKorkeus); - taso.Position = new Vector(x, y); - taso.Color = Color.White; - taso.Tag = "taso"; - Add(taso); - - tasot.Add(taso); + // Luodaan useampi taso yhdellä silmukalla + + for (int i = 0; i < 1; i++) + { + double x = RandomGen.NextDouble(Level.Left + 100, Level.Right - 100); + double y = Camera.ScreenToWorld(new Vector(0, Screen.Height / 2)).Y + RandomGen.NextDouble(10, 10); + + PhysicsObject taso = PhysicsObject.CreateStaticObject(TasoLeveys, TasoKorkeus); + taso.Position = new Vector(x, y); + taso.Color = Color.White; + taso.Tag = "taso"; + Add(taso); + tasot.Add(taso); + } } + + /// <summary> + /// Määritellään näppäimistöohjaimet pelaajan liikkumiseen ja pelin lopettamiseen. + /// </summary> private void LisaaOhjaimet() { // Asetetaan komennot näppäimistöltä @@ -126,12 +162,23 @@ public class Tasohyppely : PhysicsGame Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu pelistä"); } + + /// <summary> + /// Muutetaan pelaajan vaakasuuntaista liikettä annetun nopeuden perusteella. + /// </summary> + /// <param name="nopeus"></param> private void Liikuta(double nopeus) { if (peliKaynnissa) pelaaja.Velocity = new Vector(nopeus, pelaaja.Velocity.Y); } + + /// <summary> + /// Määritellään pelaajan ja tason törmäys. + /// </summary> + /// <param name="pelaaja"></param> + /// <param name="taso"></param> private void OsuiTasoon(PhysicsObject pelaaja, PhysicsObject taso) { // Törmäys pelaajan ja tason välillä @@ -147,9 +194,12 @@ public class Tasohyppely : PhysicsGame pelaaja.Velocity = new Vector(pelaaja.Velocity.X, HyppyVoima); } - pelaaja.IgnoresCollisionResponse = false; } + + /// <summary> + /// Poistetaan ne tasot, jotka poistuvat näkyvistä. + /// </summary> private void PoistaPoistuvatTasot() { // Turhat tasot poistetaan @@ -162,7 +212,11 @@ public class Tasohyppely : PhysicsGame } } } + + /// <summary> + /// Lopetetaan peli, mikäli pelaaja on pudonnut liikaa korkeimmasta saavutetusta pisteestä. + /// </summary> private void LopetaPeli() { // Pelin lopettamiskomento @@ -175,6 +229,12 @@ public class Tasohyppely : PhysicsGame } } + + /// <summary> + /// Päivitetään pelin tila jokaisella ruudunpäivityksellä, + /// mukaan lukien taustakuvan sijainti ja pelaajan pudotuksen valvonta. + /// </summary> + /// <param name="time"></param> protected override void Update(Time time) { base.Update(time); @@ -184,13 +244,24 @@ public class Tasohyppely : PhysicsGame PoistaPoistuvatTasot(); - if (pelaaja.Y < Level.Bottom - 100) + if (pelaaja.Y > highestY) + highestY = pelaaja.Y; + + // Tarkista, onko pelaaja pudonnut liian pitkän matkan huipustaan + + if (highestY - pelaaja.Y > FallThreshold) + LopetaPeli(); } } + +/// <summary> +/// Pääohjelman luokka, joka käynnistää pelin. +/// </summary> public class Program { + // Päämetodi, joka luo pelin oliot ja käynnistää pelin. public static void Main() { using (var peli = new Tasohyppely())