Omenasoturi - vaihe 2

Tässä vaiheessa luodaan aliohjelma yhden hedelmän lisäämiselle ja kutsutaan sitä ajamistimen avulla, jotta hedelmiä saadaan syntymään näytölle loputtomalla syötöllä. Toteutukseen käytetään aliohjelmia ja silmukoita. Jos nämä asiat kuulostavat vierailta, kannattaa klikata noita linkkejä ja kerrata hieman.

Yhden hedelmän luominen

Aloitetaan muokkaamalla Begin-aliohjelmaa. Varmistetaan aluksi, että hiiren kursori pysyy näkyvissä, jotta hedelmiä voi silputa hiirellä. Pienennetään samalla kentän kokoa, jotta se ei peitä koko ruutua ja laitetaan painovoima päälle. Lisätään kentälle alareuna ja tehdään siitä koko ohjelmassa näkyvä globaali muuttuja, jotta hedelmien ja alareunan törmäykseen voi myöhemmin liittää tapahtumia. Ladataan samalla omenan ja sen puolikkaiden kuvat omiin muuttujiinsa koodin alussa. Myös taustavärin voi halutessaan vaihtaa tässä vaiheessa sinisestä joksikin muuksi.

Image omena = LoadImage("omena_k");
Image puolikas1 = LoadImage("omena_p1");
Image puolikas2 = LoadImage("omena_p2");

PhysicsObject alareuna;

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;

    Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}


Seuraavaksi luodaan aliohjelma, jolla voi luoda yhden hedelmän. Hedelmälle voidaan arpoa satunnainen koko ja paikka kentän rajojen sisäpuolelta RandomGen-luokan aliohjelmien avulla. Samalla voidaan tönäistä hedelmä liikkeelle satunnaisesti luodun vektorin suuntaan, jolloin ruudulle saadaan milloin mistäkin lenteleviä hedelmiä. Jopa pyörimisnopeus voidaan asettaa satunnaisesti, jolloin eri hedelmät pyörivät eri vauhdilla. Asetetaan omenalle myös kuva ylempänä määritellystä kuvamuuttujasta.

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);
}


Seuraavaksi luodaan äsken kirjoitetun aliohjelman avulla toinen aliohjelma, joka luo kentälle hedelmiä loputtomalla syötöllä. Tässä voidaan hyödyntää ajastinta, joka kutsuu äskeistä aliohjelmaa aina tietyin väliajoin — esimerkiksi yhden sekunnin välein. Jotta peli saadaan vaikeutumaan loppua kohden, laitetaan ajastin nopeutumaan hieman aina kun uusi hedelmä luodaan. Jos peliin haluaa tyylikkäämmän ilmeen, myös kentän taustaväriä voi vaihtaa jatkuvasti FadeColorTo-aliohjelman avulla.

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();
}  


Sitten vain kutsutaan tätä aliohjelmaa Begin-aliohjelmassa ja kentällä alkaa lennellä hedelmiä.

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();
    
    Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
}


Testaa! Jos ohjelma toimii, voit siirtyä seuraavaan vaiheeseen.

ikkunan koon kuuttaminen on väärin tehty

13 Oct 23

Koko koodin pitäisi näyttää ensimmäisen vaiheen lopuksi 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");    

    PhysicsObject alareuna;    

    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();    

        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();
    }
}

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.