Skip to content
Snippets Groups Projects
Commit 4d19e3c9 authored by Joona Helin's avatar Joona Helin
Browse files

Pelin uusi versio

parent 21bfe497
No related branches found
No related tags found
No related merge requests found
No preview for this file type
File added
File added
using System;
using System.Collections.Generic;
using Jypeli; using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls; namespace GnomeGrab
using Jypeli.Widgets;
namespace GnomeGrab;
/// @author joona
/// @version 16.02.2025
/// <summary>
///
/// </summary>
public class GnomeGrab : PhysicsGame
{ {
public override void Begin() /// <summary>
/// Peliluokka, jossa pelaaja kerää esineitä ja välttelee esteitä.
/// </summary>
public class GnomeGrab : PhysicsGame
{ {
// Kirjoita ohjelmakoodisi tähän private PhysicsObject pelaaja;
private IntMeter pisteet;
private Timer esineidenLisaaja;
// Kuvat ladattuna vain kerran pelin aikana
private static readonly Image PelaajaKuva = LoadImage("puutarhatonttu");
private static readonly Image EsineKuva = LoadImage("kukka");
private static readonly Image EsteKuva = LoadImage("rikkaruoho");
// Vakioita pelin sääntöjä varten
private const double PelaajanNopeus = 300;
private const double EsineenPutousNopeus = -300;
private const double EsineidenLuontiInterval = 0.7;
public override void Begin()
{
LuoKentta();
AsetaOhjaimet();
LisaaPistelaskuri();
AloitaEsineidenLuonti();
}
/// <summary>
/// Luo pelin kentän ja pelaajan alkuasetukset.
/// </summary>
private void LuoKentta()
{
Level.Background.Color = Color.SkyBlue;
Level.CreateBorders();
pelaaja = new PhysicsObject(100, 100)
{
Shape = Shape.Rectangle,
Y = Level.Bottom + 50,
Tag = "pelaaja",
IgnoresCollisionResponse = true
};
pelaaja.Image = PelaajaKuva;
Add(pelaaja);
}
/// <summary>
/// Määrittelee ohjaimet pelaajan liikkumiselle.
/// </summary>
private void AsetaOhjaimet()
{
Keyboard.Listen(Key.Left, ButtonState.Down, LiikutaVasemmalle, "Liikuta vasemmalle");
Keyboard.Listen(Key.Right, ButtonState.Down, LiikutaOikealle, "Liikuta oikealle");
Keyboard.Listen(Key.Left, ButtonState.Released, PysaytaLiike, "Pysäytä liike");
Keyboard.Listen(Key.Right, ButtonState.Released, PysaytaLiike, "Pysäytä liike");
Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Lopeta peli");
}
/// <summary>
/// Liikuttaa pelaajaa vasemmalle.
/// </summary>
private void LiikutaVasemmalle()
{
if (pelaaja.Left > Level.Left)
{
pelaaja.Velocity = new Vector(-PelaajanNopeus, 0);
}
else
{
pelaaja.Velocity = Vector.Zero;
pelaaja.X = Level.Left + pelaaja.Width / 2;
}
}
/// <summary>
/// Liikuttaa pelaajaa oikealle.
/// </summary>
private void LiikutaOikealle()
{
if (pelaaja.Right < Level.Right)
{
pelaaja.Velocity = new Vector(PelaajanNopeus, 0);
}
else
{
pelaaja.Velocity = Vector.Zero;
pelaaja.X = Level.Right - pelaaja.Width / 2;
}
}
/// <summary>
/// Pysäyttää pelaajan liikkumisen.
/// </summary>
private void PysaytaLiike()
{
pelaaja.Velocity = Vector.Zero;
}
/// <summary>
/// Lisää pistelaskurin peliin.
/// </summary>
private void LisaaPistelaskuri()
{
pisteet = new IntMeter(0);
Label pistelaskuri = new Label
{
TextColor = Color.Black,
Position = new Vector(Screen.Left + 100, Screen.Top - 50)
};
pistelaskuri.BindTo(pisteet);
Add(pistelaskuri);
}
/// <summary>
/// Aloittaa esineiden luontiintervallin.
/// </summary>
private void AloitaEsineidenLuonti()
{
esineidenLisaaja = new Timer
{
Interval = EsineidenLuontiInterval
};
esineidenLisaaja.Timeout += LisaaEsine;
esineidenLisaaja.Start();
}
/// <summary>
/// Luo uuden esineen kentälle satunnaiseen paikkaan.
/// </summary>
private void LisaaEsine()
{
for (int i = 0; i < RandomGen.NextInt(1, 3); i++) // Luodaan 1–2 esinettä kerrallaan
{
double x = RandomGen.NextDouble(Level.Left + 50, Level.Right - 50);
PhysicsObject esine = new PhysicsObject(100, 100)
{
Position = new Vector(x, Level.Top),
Velocity = new Vector(0, EsineenPutousNopeus),
Restitution = 0.0,
IgnoresCollisionResponse = true
};
if (RandomGen.NextDouble(0, 1) > 0.3)
{
esine.Tag = "este";
esine.Image = EsteKuva;
}
else
{
esine.Tag = "pisteesine";
esine.Image = EsineKuva;
}
Add(esine);
AddCollisionHandler(esine, "pelaaja", PelaajaOsuiEsineeseen);
AddCollisionHandler(esine, "pohja", EsineOsuiPohjaan);
}
}
/// <summary>
/// Käsittelee tilanteen, jossa pelaaja osuu esineeseen.
/// </summary>
private void PelaajaOsuiEsineeseen(PhysicsObject esine, PhysicsObject pelaaja)
{
if ((string)esine.Tag == "este")
{
ResetoiPeli();
}
else if ((string)esine.Tag == "pisteesine")
{
pisteet.Value += 1;
esine.Destroy();
}
}
/// <summary>
/// Käsittelee tilanteen, jossa esine osuu pohjaan.
/// </summary>
private void EsineOsuiPohjaan(PhysicsObject esine, PhysicsObject pohja)
{
esine.Destroy();
}
/// <summary>
/// Resetoi pelin alkuasetuksiin.
/// </summary>
private void ResetoiPeli()
{
pisteet.Value = 0;
foreach (GameObject obj in GetObjects(o => o is PhysicsObject))
{
if (obj != pelaaja)
{
obj.Destroy();
}
}
PhoneBackButton.Listen(ConfirmExit, "Lopeta peli"); pelaaja.Position = new Vector(0, Level.Bottom + 50);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); pelaaja.Velocity = Vector.Zero;
}
} }
} }
\ No newline at end of file
...@@ -18,7 +18,7 @@ Puutarhatontun pitää ylläpitää puutarhaa ja näinollen napata oikeanlaisia ...@@ -18,7 +18,7 @@ Puutarhatontun pitää ylläpitää puutarhaa ja näinollen napata oikeanlaisia
## Pelin idea ja tavoitteet ## Pelin idea ja tavoitteet
Kukista saa pisteen, rikkaruohoista peli päättyy ja vesikannuista saa bonuspisteitä. Kukista saa pisteen, rikkaruohoista peli päättyy ja vesikannuista saa bonuspisteitä. Puutarhatonttua liikutellaan nuolinäppäimillä oikealta vasemmalle.
## Hahmotelma pelistä ## Hahmotelma pelistä
......
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