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 Riderin (tai Visual Studion).
Tässä syksyn 2024 harjoituksessa käyteään
dotnet
-komentoa. Jos haluat kääntääcsc
-komennolla (tai Mac/Linuxmcs
-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ä aikaisemmissa asennuksissa antanut seuraavaa komentoa komentoriviltä, niin anna se nyt, niin Jypelin projektimallit asentuvat:
dotnet new install Jypeli.Templates
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)
Windows:
cd /c/kurssit/ohj1/paate/paate1
Mac/Linux:
cd ~/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 jos Visual Studio Code on asennettu, niin
code Lumiukko.cs
tai jos ei ole mitään editoria asennettu, niin
win: notepad Lumiukko.cs
Mac: open -e Lumiukko.cs
Linux: gedit Lumiukko.cs &
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
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ä (tämähän teitkin jo todennäköisesti edellisessä kohdassa):
Mene hakemistoon jonka alle haluat ohjelman
Anna komento
dotnet new ConsoleMain -n HelloWorld
Siirry ohjelman hakemistoon cd HelloWorld
Muokkaa tiedostoa
HelloWorld.cs
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.