Skip to content
Snippets Groups Projects
Commit cb0ccbf2 authored by salmiene's avatar salmiene
Browse files

Edit NukkuMatti -peli

parent c5e0f02e
No related branches found
No related tags found
No related merge requests found
using System;
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.
public class Tasohyppely : PhysicsGame
{
// Muutama vakio arvo määritelty pelin mekaniikalle, jotta ne on helpommin hallittavissa samassa paikassa
private const double GravityStrength = -800;
private const double HyppyVoima = 1100;
private const double TasoLeveys = 100;
private const double TasoKorkeus = 10;
private const double PelaajaWidth = 100;
private const double PelaajaHeight = 100;
private const double AlkuperainenHyppyNopeus = 1000;
private const double TasoPoistoMarginaali = 200;
private const double StartingHeight = -20;
private PhysicsObject pelaaja;
private bool peliKaynnissa = true;
private GameObject taustakuva;
private Label gameOverTeksti;
private int score = 0;
private List<PhysicsObject> tasot = new List<PhysicsObject>();
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.Timeout += LuoTaso;
tasoAjastin.Start();
// Hyppynopeus
pelaaja.Velocity = new Vector(0, AlkuperainenHyppyNopeus);
}
private void LuoKentta()
{
LuoTausta();
LuoPelaaja();
// Asetetaan pelaajan ominaisuudet ja lisätään kentälle
pelaaja.Position = new Vector(0, StartingHeight);
pelaaja.CanRotate = false;
pelaaja.Restitution = 0;
Add(pelaaja);
// Luodaan aloitustaso
PhysicsObject aloitusTaso = PhysicsObject.CreateStaticObject(200, TasoKorkeus);
aloitusTaso.Position = new Vector(0, -70);
aloitusTaso.Color = Color.White;
aloitusTaso.Tag = "taso";
Add(aloitusTaso);
// Laitetaan kamera seuraamaan pelaajaa
Camera.Follow(pelaaja);
// Lisätään törmäysominaisuus
AddCollisionHandler(pelaaja, "taso", OsuiTasoon);
// Luodaan muutama aloitustaso
for (int i = 0; i < 4; i++)
LuoTaso();
}
private void LuoTausta()
{
// Lisätään taustakuva ja sijoitetaan se taustalle
taustakuva = new GameObject(Level.Width * 2, Level.Height * 2);
taustakuva.Image = LoadImage("taivas.jpeg");
taustakuva.Position = Camera.Position;
Add(taustakuva, -1);
}
private void LuoGameOverTeksti()
{
// Asetetaan pelin päättymis teksti
gameOverTeksti = new Label("HÄVISIT PELIN");
gameOverTeksti.TextColor = Color.Red;
gameOverTeksti.Font = Font.DefaultBold;
gameOverTeksti.Position = new Vector(0, 100);
gameOverTeksti.IsVisible = false;
Add(gameOverTeksti);
}
private void LuoPelaaja()
{
//Luodaan hahmo
pelaaja = new PhysicsObject(PelaajaWidth, PelaajaHeight);
pelaaja.Image = LoadImage("nukkumatti.png");
pelaaja.Restitution = 0;
}
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);
}
private void LisaaOhjaimet()
{
// Asetetaan komennot näppäimistöltä
Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta, null, -400.0);
Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta, null, 400.0);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu pelistä");
}
private void Liikuta(double nopeus)
{
if (peliKaynnissa)
pelaaja.Velocity = new Vector(nopeus, pelaaja.Velocity.Y);
}
private void OsuiTasoon(PhysicsObject pelaaja, PhysicsObject taso)
{
// Törmäys pelaajan ja tason välillä
if (pelaaja.Velocity.Y > 0 && pelaaja.Position.Y < taso.Top)
{
pelaaja.IgnoresCollisionResponse = true;
return;
}
if (pelaaja.Velocity.Y <= 0 && Math.Abs(pelaaja.Bottom - taso.Top) < 5)
{
pelaaja.Y = taso.Top + pelaaja.Height / 2;
pelaaja.Velocity = new Vector(pelaaja.Velocity.X, HyppyVoima);
}
pelaaja.IgnoresCollisionResponse = false;
}
private void PoistaPoistuvatTasot()
{
// Turhat tasot poistetaan
for (int i = tasot.Count - 1; i >= 0; i--)
{
if (tasot[i].Y < Camera.ScreenToWorld(new Vector(0, -Screen.Height / 2)).Y - TasoPoistoMarginaali)
{
tasot[i].Destroy();
tasot.RemoveAt(i);
}
}
}
private void LopetaPeli()
{
// Pelin lopettamiskomento
if (peliKaynnissa)
{
peliKaynnissa = false;
gameOverTeksti.IsVisible = true;
Timer.SingleShot(3.0, Exit);
}
}
protected override void Update(Time time)
{
base.Update(time);
// Taustakuva päivittyy kameran liikkeen mukaisesti
taustakuva.Position = taustakuva.Position + (Camera.Position - taustakuva.Position) * 0.1;
PoistaPoistuvatTasot();
if (pelaaja.Y < Level.Bottom - 100)
LopetaPeli();
}
}
public class Program
{
public static void Main()
{
using (var peli = new Tasohyppely())
peli.Run();
}
}
\ No newline at end of file
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