Lumiukko komentoriviltä + Jypeli

Tämä tehtävä liittyy Demo 1 -viikkotehtävään.

Tässä tehtävässä oletetaan että olet asentanut kurssin työkaluista ainakin tekstieditorin ja Visual Studion tai Riderin.

Tässä syksyn 2022 harjoituksessa käyteään dotnet-komentoa. Jos haluat kääntää csc-komennolla (tai Mac/Linux mcs-komennolla), niin katso syksyn 2020 tehtäviä.

Tämä harjoitus toimii samalla tavalla kaikissa järjestelmissä Win/Mac/Linux.

1. Jypeli projektimallien asentaminen

Mikäli et ole vielä antanut seuraavaa komentoa komentoriviltä, niin anna se nyt, niin Jypelin projektimallit asentuvat:

dotnet new -i Jypeli.Templates

Tämä pitää tehdä, vaikka olisit asentanut ne Visual Studioon työkalusivun ohjeiden mukaisesti.

2. Projektin luominen

Siirry aluksi esimerkiksi hakemistoon /c/kurssit/ohj1/paate/paate1 (tehty HelloWorld -tehtävässä, mikroluokan kone tai Mac/Linux mene siihen hakemistoon, missä teit HelloWorld-tehtävän)

cd /c/kurssit/ohj1/paate/paate1

Luo uusi Lumiukko-projekti:

dotnet new fysiikkapeli -n Lumiukko

Siirry lumiukon hakemistoon

cd Lumiukko

Katso mitä tiedostoja syntyi

ls -la

3. Muokkaa tiedostoa

Muokkaa tiedostoa Lumiukko.cs tekstieditorilla.

Esimerkiksi

win:   npp Lumiukko.cs
Mac:   open -e Lumiukko.cs
Linux: gedit

Kopioi siihen mallin mukainen sisältö. Huomaa että korvaat pohjana olevan koodin kokonaan alla olevalla koodilla.

// Otetaan käyttöön Jyväskylän yliopiston Jypeli-kirjasto
using Jypeli;

namespace Lumiukko;

/// @author  Antti-Jussi Lakanen, Vesa Lappalainen
/// @version 12.1.2012
///
/// <summary>
/// Luokka, jossa harjoitellaan piirtämistä lisäämällä ympyröitä ruudulle
/// </summary>
public class Lumiukko : PhysicsGame
{
    /// <summary>
    /// Aliohjelmassa piirretään ja zoomataan kamera siten että 
    /// kenttä näkyy hyvin ruudulla.
    /// </summary>
    public override void Begin()
    {
        Camera.ZoomToLevel();
        Level.Background.Color = Color.Black;

        PhysicsObject p1 = new PhysicsObject(2 * 100.0, 2 * 100.0, Shape.Circle);
        p1.Y = Level.Bottom + 200.0;
        Add(p1);

        PhysicsObject p2 = new PhysicsObject(2 * 50.0, 2 * 50.0, Shape.Circle);
        p2.Y = p1.Y + 100 + 50;
        Add(p2);

        PhysicsObject p3 = new PhysicsObject(2 * 30.0, 2 * 30.0, Shape.Circle);
        p3.Y = p2.Y + 50 + 30;
        Add(p3);
    }
}

4. Käännä ja aja ohjelma

Ohjelman kääntämiseksi ja ajamiseksi anna komento

dotnet run

Katso mitä tiedostoja (ja kansioita) syntyi kääntämisen yhteydessä

ls -la
# color

5. Ukon värin ja ulkonäön muuttaminen

HUOM! Seuraavat koodinpätkät kirjoitetaan tekstieditorissa ohjelmakoodiin (eli tiedostoon Lumiukko.cs)! Kokeile palloille erilaisia värejä. Esimerkiksi

p2.Color = Color.HotPink;

Rivin voit lisätä mille tahansa uudelle riville sen jälkeen kun muuttuja p2 on esitelty. Kuitenkin ennen aliohjelman lopettavaa aaltosulkua }. Paras paikka on siellä, missä muutenkin käsitellään p2 muuttujaa (siis ennen kuin p3 on esitelty).

Käännä ja aja ohjelma edellisissä osuuksissa opetetulla tavalla, ja ihastele aikaansaamaasi muutosta.

Käytössä olevat valmiit värien nimet näet esimerkiksi Jypelin ohjeista.

Minkä tahansa värin voit itse tehdä kutsulla tyyliin:

  p3.Color = new Color(173, 255, 47, 50);

missä parametrit ovat järjestyksessä Red, Green, Blue, Alpha. Kukin arvo voi vaihdella välillä 0-255. Alpha tarkoittaa läpinäkyvyysarvoa, 0 täysin läpinäkyvä, 255 täysin läpinäkymätön.

Luonnollisesti voit vaihtaa myös taustan värin sellaiseksi kuin haluat -- kokeile.

Kokeile kirjaston ohjeiden mukaan vaihtaa alin pallo kaksi kertaa leveämmäksi. Älä muuta "pallon" korkeutta.

Piirrä ukolle silmät.

Jos yrität lisätä fysiikkakappaleita toisten fysiikkakappaleiden sisälle, huomaat että ne automaattisesti liikkuvat erilleen. Eli siksi alla ei voi käyttää muiden pallojen lisäämisen tapaan (voit toki kokeilla)

Add(silma1);

koska silloin silma1 lisääntyisi peliin ja se olisi p3-olion kanssa päällekkäin, koska alla niiden koordinaatit on laskettu niin, että osuvat toistensa sisälle.

Tarkkaan ottaen tuo edellä kirjoitettu olisi

this.Add(silma1)

eli lisäys tehdään nimenomaan this-olion, eli itse pelin sisälle.
Viite this viittaa peliin, jota ollaan tekemässä ja jos sitä ei kirjoiteta erikseen, se tulkitaan kuin se olisi kirjoitettu.

Pelin alueella fysiikkamoottori ei salli olioiden olevan sisäkkäin.

Saat kuitenkin liitettyä kappaleita (olioita) yhteen niin, että ne käyttäytyvät kuin yksi ja sama kappale asettamalla olion toisen olion lapsiolioksi (eli lisäämällä olion toisen olion, tässä tapauksessa p3, sisään) seuraavalla tavalla:

PhysicsObject silma1 = new PhysicsObject(2 * 10.0, 2 * 10.0, Shape.Circle);
silma1.Y = p3.Y + 0;
silma1.Color = Color.Black;
p3.Add(silma1);

Huomaa edellä p3.Add(silma1), eli silma1 lisätään p3-olion lapseksi (eli nimenomaan p3:n sisälle, ei pelin sisälle).

Nyt siis silma1 on liitetty kiinteästi kappaleeseen p3 sen keskipisteeseen (koska Y:hyn lisätään 0, on silma1:n y-koordinaattia sama kuin p3:n y-koordinaatti). Mieti itse miten muutetaan X-koordinaattia. Koska x-koordinaattia ei ole annettu, se on oletuksena 0.

Jos silmä on tasan keskellä p3:sta, ei näytä olevan eroa onko add(silma1) vaiko p3.add(silma1). Eron huomaat kuitenkin heti, jos silmä ei ole keskellä. Syynä on se, että keskellä "päätä" ollessaan fysiikan voimat vetävät silmää yhtä paljon kaikkiin suuntiin jos se on lisätty peliin eikä pallon p3 sisälle.

6. Lisätehtävä: Voimia peliin

Lisää Begin-aliohjelman loppuun rivi (muistathan, että Begin-metodi alkaa Begin-rivin jälkeisestä aaltosulusta, ja päättyy vastaavasti metodin sulkevaan aaltosulkuun, eli "aliohjelman loppuun" tarkoittaa ennen sen lopettavaa aaltosulkua):

Gravity = new Vector(0, -400);
  • käännä ja aja
  • kokeile muita lukuja -400:n paikalle

7. Ei-graafiset ohjelmat

Muista että käyttäen dotnet-komentoa voit tehdä myös ei-graafisia ohjelmia, esim HelloWorld-voisit tehdä:

  1. Mene hakemistoon jonka alle haluat ohjelman

  2. Anna komento

    dotnet new ConsoleMain -n HelloWorld
  3. Siirry ohjelman hakemistoon cd HelloWorld

  4. Muokkaa tiedostoa HelloWorld.cs

  5. Käännä ja aja:

    dotnet run

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