Skip to content
Snippets Groups Projects
Commit ff56a8a1 authored by Mattila Arttu Matias's avatar Mattila Arttu Matias
Browse files

lisätty ase sotilaalle, jolla voidaan tuhota asteroideja. Lisätty myös että...

lisätty ase sotilaalle, jolla voidaan tuhota asteroideja. Lisätty myös että peli päättyy kun asteroidi osuu sotilaaseen tai maahan. Lisätty myös aika ja pistelaskuri peliin, jotka tulevat näkyviin kun peli päättyy.
parent a8c7ea87
No related branches found
No related tags found
No related merge requests found
<component name="ProjectDictionaryState">
<dictionary name="Koti" />
</component>
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Net.Mail;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Widgets;
namespace Asteroid_Blaster;
/// @author Arttu Mattila
/// @version 23.10.2023
/// <summary>
/// Asteroid Blaster -peli
/// </summary>
public class Asteroid_Blaster : PhysicsGame
namespace Asteroid_Blaster
{
///@Author: Arttu Mattila
///@Version: 25.11.2023
/// <summary>
/// Asteroid BLaster peli, missä sotilas tuhoaa asteroideja ja peli päättyy kun asteroidi osuu sotilaaseen tai maahan. Pelissä näkyy lopuksi paljonko asteroideja on tuhottu ja miten kauan peli kesti.
/// </summary>
public class Asteroid_Blaster : PhysicsGame
{
private Vector _nopeusVasen = new Vector(-600, 0);
private Vector _nopeusOikea = new Vector(600, 0);
// private Image taustakuva = LoadImage("pelinTausta");
readonly Vector _nopeusVasen = new Vector(-600, 0);
readonly Vector _nopeusOikea = new Vector(600, 0);
readonly Image taustakuva = LoadImage("pelinTausta");
private PhysicsObject _sotilas;
private Animation _sotilasAnimaatio;
private Image _sotilasPaikallaan;
private Image[] _meteoriditTippuu = LoadImages("meteoridi1", "meteoridi2", "meteoridi3");
readonly Image[] _meteoriditTippuu = LoadImages("meteoridi1", "meteoridi2", "meteoridi3");
private Label asteroidiLaskuri;
private int _tuhotutAsteroidit;
private Timer _aikalaskuri;
private double _pelinKesto;
private int _meteoridiMaara = 1;
private double _meteoridiPerusNopeus = -70;
private AssaultRifle _sotilaanAse;
public override void Begin()
{
PhysicsObject alaReuna = Level.CreateBottomBorder();
Level.CreateLeftBorder(0, false);
Level.CreateBottomBorder(0, false);
Level.CreateRightBorder(0, false);
Camera.ZoomToLevel();
// Level.Background.Image = taustakuva;
Level.Background.Image = taustakuva;
_sotilas = LuoSotilas(Level.Width / 2, Level.Bottom + 75);
AddCollisionHandler(_sotilas, SotilasTormasi);
AddCollisionHandler(alaReuna, AlareunaTormasi);
AsetaOhjaimet();
Timer.SingleShot(1, LuoMeteoridi);
Timer.SingleShot(10, () => _meteoridiMaara = 2);
Timer.SingleShot(20, () => _meteoridiMaara = 3);
asteroidiLaskuri = new Label();
asteroidiLaskuri.X = Screen.Width - 650;
asteroidiLaskuri.Y = Screen.Top - 140;
asteroidiLaskuri.TextColor = Color.Black;
Add(asteroidiLaskuri);
Label aikaLaskuri = new Label();
aikaLaskuri.X = Screen.Width - 600;
aikaLaskuri.Y = Screen.Top - 200;
aikaLaskuri.TextColor = Color.Black;
Add(aikaLaskuri);
_aikalaskuri = new Timer();
_aikalaskuri.Interval = 1.0;
_aikalaskuri.Timeout += () =>
{
_pelinKesto += 1.0;
aikaLaskuri.Text = "Aika: " + _pelinKesto.ToString("F0") + " s";
};
_aikalaskuri.Start();
_sotilaanAse = new AssaultRifle(20, 10);
_sotilaanAse.FireRate = 5;
_sotilaanAse.ProjectileCollision = AmmusOsui;
_sotilaanAse.Size = new Vector(_sotilas.Width / 3, _sotilas.Height / 3); // Aseen koko
// Lisätään ase sotilaaseen ja asetetaan sen suhteellinen sijainti
_sotilas.Add(_sotilaanAse);
_sotilaanAse.RelativePosition = new Vector(0, _sotilas.Height / 2); // Ase sotilaan kohdalla
_sotilaanAse.Angle = Angle.FromDegrees(90); // Ase osoittaa aina ylöspäin
Timer.SingleShot(5, LuoMeteoridi); // kasvattaa syntyvien meteorieden määrää tietyn ajan kuluttua
Timer.SingleShot(15, () => _meteoridiMaara = 2);
Timer.SingleShot(30, () => _meteoridiMaara = 3);
Timer ajastin = new Timer();
ajastin.Interval = 8;
ajastin.Timeout += KasvataMeteoridienNopeutta;
......@@ -54,14 +88,27 @@ public class Asteroid_Blaster : PhysicsGame
PhysicsObject LuoSotilas(double x, double y)
{
// luodaan sotilas
var localSotilas = new PhysicsObject(170, 150);
localSotilas.Position = new Vector(x, y);
Image[] sotilasLiikkuu = LoadImages("sotilasliike", "sotilasjuoksee");
_sotilasPaikallaan = LoadImage("sotilasPaikallaan");
localSotilas.Image = _sotilasPaikallaan;
localSotilas.Shape = Shape.FromImage(_sotilasPaikallaan);
// Ladataan animaatiot, mutta ei käynnistetä niitä heti
Image[] sotilasLiikkuu = LoadImages("sotilasliike", "sotilasjuoksee");
_sotilasAnimaatio = new Animation(sotilasLiikkuu);
localSotilas.Image = _sotilasPaikallaan;
localSotilas.IgnoresGravity = true;
localSotilas.CanRotate = false;
// Asetetaan törmäysryhmä
localSotilas.CollisionIgnoreGroup = 1;
// Lisätään kitkaa vähentämään liukumista ja pyörimistä törmäyksen jälkeen
localSotilas.LinearDamping = 0.8;
localSotilas.AngularDamping = 0.8;
Add(localSotilas);
return localSotilas;
......@@ -73,18 +120,39 @@ public class Asteroid_Blaster : PhysicsGame
Keyboard.Listen(Key.Right, ButtonState.Down, AsetaNopeusJaAnimaatio, "Liiku oikealle", _sotilas, _nopeusOikea);
Keyboard.Listen(Key.Left, ButtonState.Released, PysaytaLiikeJaAnimaatio, "Pysäytä vasen liike", _sotilas);
Keyboard.Listen(Key.Right, ButtonState.Released, PysaytaLiikeJaAnimaatio, "Pysäytä oikea liike", _sotilas);
Keyboard.Listen(Key.Space, ButtonState.Down, AseenAmpuminen, "Ammu");
}
void AseenAmpuminen()
{
_sotilaanAse.Shoot();
}
void AsetaNopeusJaAnimaatio(PhysicsObject juoksevaSotilas, Vector nopeus)
{
juoksevaSotilas.Velocity = nopeus;
juoksevaSotilas.Animation = _sotilasAnimaatio;
// Ase osoittaa aina ylöspäin
_sotilaanAse.Angle = Angle.FromDegrees(90);
if (nopeus.X < 0)
{
juoksevaSotilas.Animation = Animation.Mirror(_sotilasAnimaatio);
}
juoksevaSotilas.Animation.Start();
else
{
juoksevaSotilas.Animation = _sotilasAnimaatio;
}
if (nopeus.Magnitude > 0)
{
juoksevaSotilas.Animation.Start();
}
else
{
juoksevaSotilas.Animation.Stop();
juoksevaSotilas.Image = _sotilasPaikallaan;
}
}
void PysaytaLiikeJaAnimaatio(PhysicsObject juoksevaSotilas)
......@@ -98,20 +166,94 @@ public class Asteroid_Blaster : PhysicsGame
{
for (int i = 0; i < _meteoridiMaara; i++)
{
// luodaan meteoridi jolle annetaan nopeus ja suunta mihin se lentää, meteroridien syntymänopeus randomoitu eli 1-5 sekunnin välein tulee tietty määrä meteorideja
PhysicsObject meteoridi = new PhysicsObject(150, 150);
meteoridi.Image = _meteoriditTippuu[RandomGen.NextInt(_meteoriditTippuu.Length)];
meteoridi.Shape = Shape.FromImage(meteoridi.Image);
meteoridi.Position = new Vector(RandomGen.NextDouble(Level.Left, Level.Right), Level.Top + meteoridi.Width);
meteoridi.Velocity = new Vector(RandomGen.NextDouble(-80, 80), _meteoridiPerusNopeus + RandomGen.NextDouble(0, -40));
meteoridi.IgnoresGravity = true;
meteoridi.Tag = "asteroidi"; // Lisätty tunniste asteroidille
meteoridi.IgnoresExplosions = true;
Add(meteoridi, 1);
}
double seuraavaAika = RandomGen.NextDouble(1.0, 5.0);
Timer.SingleShot(seuraavaAika, LuoMeteoridi);
}
void KasvataMeteoridienNopeutta()
{
_meteoridiPerusNopeus -= 15;
}
// Lisätty: ammuksen törmäyksen käsittely
private void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
{
if (kohde.Tag is string tag && tag == "asteroidi")
{
// Luodaan räjähdys
Explosion rajahdys = new Explosion(50);
rajahdys.Position = kohde.Position;
Add(rajahdys);
kohde.Destroy();
ammus.Destroy();
_tuhotutAsteroidit++;
asteroidiLaskuri.Text = "Tuhotut asteroidit: " + _tuhotutAsteroidit;
}
}
// Lisätty: sotilaan törmäyksen käsittely
private void SotilasTormasi(PhysicsObject sotilas, PhysicsObject asteroidi)
{
if (asteroidi.Tag is string tag && tag == "asteroidi")
{
PeliPaattyi(false); // Peli päättyy, kun asteroidi osuu sotilaaseen
}
}
private void AlareunaTormasi(PhysicsObject alareuna, PhysicsObject asteroidi)
{
if (asteroidi.Tag is string tag && tag == "asteroidi")
{
asteroidi.Destroy();
PeliPaattyi(false); // Peli päättyy, kun asteroidi osuu alareunaan
}
}
private void PeliPaattyi(bool voitto)
{
ClearGameObjects(); // Poista pelin objektit
// Laske pelin kesto sekunteina ja tuhotut asteroidit
double pelinKestoSekunteina = Math.Round(_pelinKesto, 2);
string tulokset = "Peli päättyi\n";
tulokset += "Aika: " + pelinKestoSekunteina + " s\n";
tulokset += "Tuhotut asteroidit: " + _tuhotutAsteroidit;
// Lisää tulokset tekstikenttänä
Label tuloksetLabel = new Label(tulokset);
tuloksetLabel.TextColor = Color.Black;
tuloksetLabel.Position = new Vector(0, 50);
Add(tuloksetLabel);
// Lisää nappi pelistä poistumiseen
if (!voitto)
{
PushButton exitButton = new PushButton(200, 100, "Poistu pelistä");
exitButton.Position = new Vector(0, -50);
exitButton.Clicked += ExitButton_Clicked;
Add(exitButton);
}
}
private void ExitButton_Clicked()
{
Exit();
}
}
}
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