Skip to content
Snippets Groups Projects
Commit 9a3143f4 authored by Salmi Eero Niilo Einari's avatar Salmi Eero Niilo Einari
Browse files

Päivitetty harjoitustyö

parent 526d5045
Branches main
No related tags found
No related merge requests found
......@@ -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())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment