Etusivu | Pong | Omenasoturi
Omenasoturi - vaihe 4
Pelissä pystyy jo silppuamaan omenoita, mutta puolikkaat jäävät lojumaan kentän pohjalle koko pelin ajaksi. Parannellaan peliä vielä niin, että omenan puolittamisesta saa pisteen, mutta jos omena ehtii tippua kentän alareunaan ennen kuin sen puolittaa, omena räjähtää ja pelaaja menettää yhden elämän. Puolitetut omenat häviävät osuessaan alareunaan.
Aloitetaan lisäämällä Begin
-aliohjelman loppuun seuraavat aliohjelmakutsut:
LuoPistelaskuri();
LuoElamalaskuri();
Muista samalla lisätä laskurioliot muuttujiksi koodin alkuun. Alla oleva rivi täytyy siis lisätä samaan paikkaan, missä esiteltiin kuvat ja muut ns. globaalit muuttujat.
IntMeter pisteLaskuri, elamaLaskuri;
Sitten toteutetaan LuoPistelaskuri
- ja LuoElamalaskuri
-aliohjelmat. Molemmissa luodaan IntMeter
-tyyppinen laskuriolio ja sidotaan laskurien arvot ruudulla näkyviin Label
-olioihin. Elämälaskurin tapauksessa lisätään myös aliohjelma jota kutsutaan, kun elämälaskurin arvo saavuttaa nollan.
void LuoPistelaskuri()
{
pisteLaskuri = new IntMeter(0);
Label pisteNaytto = new Label();
pisteNaytto.X = Level.Left + 80;
pisteNaytto.Y = Level.Top - 50;
pisteNaytto.Title = "Silputtu";
pisteNaytto.BindTo(pisteLaskuri);
Add(pisteNaytto);
}
void LuoElamalaskuri()
{
elamaLaskuri = new IntMeter(10);
elamaLaskuri.LowerLimit += PeliLoppui;
Label elamaNaytto = new Label();
elamaNaytto.X = Level.Right - 80;
elamaNaytto.Y = Level.Top - 50;
elamaNaytto.Title = "Elämiä";
elamaNaytto.BindTo(elamaLaskuri);
Add(elamaNaytto);
}
Kun elämät loppuvat, kutsutaan PeliLoppui
-nimistä aliohjelmaa. Kirjoitetaan siis sellainen. Tämä aliohjelma tyhjentää koko ruudun ClearAll
-metodilla ja tulostaa, kuinka monta omenaa pelaaja sai silputtua. Lisäksi luodaan nappula, jolla pelin voi halutessaan aloittaa alusta.
void PeliLoppui()
{
ClearAll();
Level.Background.Color = Color.Beige;
Label lopputeksti = new Label(
"Omenat voittivat :(! Silppusit " + pisteLaskuri.Value + " omenaa.");
Add(lopputeksti);
PushButton nappula = new PushButton("Aloita alusta");
nappula.Clicked += () => { ClearAll(); Begin(); };
nappula.Y = -100;
Add(nappula);
}
Nyt laskurien pitäisi näkyä ruudun oikeassa ja vasemmassa yläkulmassa, mutta niiden arvot eivät vielä muutu. Elämälaskurista haluttaisiin vähentää yksi elämä aina, kun omena tipahtaa ruudun alareunaan asti. Tehdään tämä lisäämällä Begin
-aliohjelman loppuun törmäyksenkäsittelijä:
AddCollisionHandler(alareuna, Tormaa);
Vielä pitää toteuttaa äskeisellä rivillä kutsuttu Tormaa
-aliohjelma, joka määrittelee mitä tapahtuu, kun mikä tahansa olio törmää alareunaan. Kaikki oliot häviävät osuessaan alareunaan, mutta kokonaisen omenan tapauksessa vähennetään myös elämälaskurin arvosta yksi. Lisätään samalla räjähdys tuhoutuneen omenan paikalle, niin saadaan peliin vähän pauketta.
void Tormaa(PhysicsObject tormaaja, PhysicsObject kohde)
{
if (kohde.Tag.Equals("omena"))
{
elamaLaskuri.AddValue(-1);
Explosion rajahdys = new Explosion(kohde.Width);
rajahdys.Position = kohde.Position;
Add(rajahdys);
}
kohde.Destroy();
}
Viimeisenä tehtävänä on saada pistelaskurin arvo kasvamaan aina, kun omena puolitetaan. Tämä onnistuu seuraavanlaisella koodirivillä:
pisteLaskuri.AddValue(1);
Mieti itse, mihin kohtaan koodia tämä rivi pitää lisätä, jotta pisteitä saa juuri silloin, kun omena puolitetaan! Jos et meinaa keksiä, voit kysyä apua ohjaajalta.
Kun molemmat laskurit toimivat, peli on tämän tutoriaalin osalta valmis. Jos haluat peliin erilaisia hedelmiä, lisää räjähdyksiä tai muita uusia ominaisuuksia, voit itse miettiä miten ne voisi toteuttaa. Myös ohjaajat voivat auttaa parantelemaan peliä.
Tästä voit palata takaisin kerhon kotisivulle.
Koko ohjelman pitäisi lopuksi näyttää suurinpiirtein tältä:
using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Effects;
using Jypeli.Widgets;
public class Omenasoturi : PhysicsGame
{
Image omena = LoadImage("omena_k");
Image puolikas1 = LoadImage("omena_p1");
Image puolikas2 = LoadImage("omena_p2");
Vector alku, loppu;
GameObject viiva;
PhysicsObject alareuna;
IntMeter pisteLaskuri, elamaLaskuri;
public override void Begin()
{
Level.Height = Level.Width = Window.Height = Window.Width = 800;
alareuna = Level.CreateBottomBorder();
Gravity = new Vector(0, -200);
Level.Background.Color = Color.Beige;
LuoHedelmia();
Add(viiva = new GameObject(2, 0));
LuoPistelaskuri();
LuoElamalaskuri();
AddCollisionHandler(alareuna, Tormaa);
Mouse.Listen(MouseButton.Left, ButtonState.Pressed,
() => alku = Mouse.PositionOnWorld, "Aloittaa viivan piirtämisen");
Mouse.Listen(MouseButton.Left, ButtonState.Down, PiirraViiva, "Piirtää viivan");
Mouse.Listen(MouseButton.Left, ButtonState.Released, Silppua, null);
Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}
void LuoHedelma()
{
double koko = RandomGen.NextDouble(20, 100);
PhysicsObject hedelma = new PhysicsObject(koko, koko, Shape.Circle);
hedelma.X = RandomGen.NextDouble(Level.Left, Level.Right);
hedelma.Y = RandomGen.NextDouble(Level.Bottom + 50, Level.Top);
hedelma.Image = omena;
hedelma.Tag = "omena";
hedelma.Hit(new Vector(RandomGen.NextDouble(-50, 50), RandomGen.NextDouble(100, 500)));
hedelma.AngularVelocity = RandomGen.NextDouble(-10, 10);
Add(hedelma);
}
void LuoHedelmia()
{
Timer t = new Timer();
t.Interval = 1;
t.Timeout += () => {
LuoHedelma();
if (t.Interval > 0.1) t.Interval -= 0.01;
Level.Background.FadeColorTo(RandomGen.NextLightColor(), 5);
};
t.Start();
}
void PiirraViiva()
{
viiva.Color = Color.Black;
loppu = Mouse.PositionOnWorld;
viiva.Height = Vector.Distance(alku, loppu);
viiva.Position = (alku + loppu) / 2;
viiva.Angle = (alku - loppu).Angle + Angle.FromDegrees(90);
}
void Silppua()
{
viiva.FadeColorTo(Color.Transparent, 0.25);
List<GameObject> omenat = GetObjectsBetween(alku, loppu);
foreach (GameObject omena in omenat)
{
if (omena == viiva || !omena.Tag.Equals("omena"))
continue;
LisaaPuolikkaat(omena);
omena.Destroy();
pisteLaskuri.AddValue(1);
}
}
void LisaaPuolikkaat(GameObject omena)
{
Vector siirros = Vector.FromLengthAndAngle(omena.Width / 2, viiva.Angle);
Angle kulma = viiva.Angle - Angle.FromDegrees(90);
LisaaPuolikas(omena, -siirros, -kulma, puolikas1);
LisaaPuolikas(omena, siirros, kulma, puolikas2);
}
void LisaaPuolikas(GameObject omena, Vector siirros, Angle kulma, Image kuva)
{
PhysicsObject puolikas = new PhysicsObject(omena.Width / 2, omena.Height);
puolikas.Position = omena.Position + siirros;
puolikas.Image = kuva; puolikas.Angle = viiva.Angle;
puolikas.Hit(Vector.FromLengthAndAngle(200, kulma));
Add(puolikas);
}
void LuoPistelaskuri()
{
pisteLaskuri = new IntMeter(0);
Label pisteNaytto = new Label();
pisteNaytto.X = Level.Left + 80;
pisteNaytto.Y = Level.Top - 50;
pisteNaytto.Title = "Silputtu";
pisteNaytto.BindTo(pisteLaskuri);
Add(pisteNaytto);
}
void LuoElamalaskuri()
{
elamaLaskuri = new IntMeter(10);
elamaLaskuri.LowerLimit += PeliLoppui;
Label elamaNaytto = new Label();
elamaNaytto.X = Level.Right - 80;
elamaNaytto.Y = Level.Top - 50;
elamaNaytto.Title = "Elämiä";
elamaNaytto.BindTo(elamaLaskuri);
Add(elamaNaytto);
}
void PeliLoppui()
{
ClearAll();
Level.Background.Color = Color.Beige;
Label lopputeksti = new Label(
"Omenat voittivat :(! Silppusit " + pisteLaskuri.Value + " omenaa.");
Add(lopputeksti);
PushButton nappula = new PushButton("Aloita alusta");
nappula.Clicked += () => { ClearAll(); Begin(); };
nappula.Y = -100;
Add(nappula);
}
void Tormaa(PhysicsObject tormaaja, PhysicsObject kohde)
{
if (kohde.Tag.Equals("omena"))
{
elamaLaskuri.AddValue(-1);
Explosion rajahdys = new Explosion(kohde.Width);
rajahdys.Position = kohde.Position;
Add(rajahdys);
}
kohde.Destroy();
}
}
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.