• Tästä dokumentista on myös versio tehtävän tekemiseksi Windowsissa ja XNA-kirjastolla jos joku sitä haluaa käyttää

Lumiukko komentoriviltä MonoGame + Jypeli

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

Luo tiedosto Lumiukko.cs ja avaa se tekstieditoriin. Kopioi siihen mallin mukainen sisältö.

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

/// @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>
    /// Pääohjelmassa laitetaan "peli" käyntiin Jypeli-kirjastolle 
    /// tyypilliseen tapaan
    /// </summary>
    public static void Main()
    {
        using (Lumiukko peli = new Lumiukko())
        {
            peli.Run();
        }
    }

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

jos tämän kopioi suoraan, kääntäminen ei onnistu vaan monodevelop antaa virhekoodin CS0017 ja komentorivi taas CS5001. monodevelop ehdottaa staticin tilalle virtual jonka vaihtamalla onnistuu?

VL: ettet olisi sortunut siihen, että sulla on kaksi Main-metodia.
Nimittäin jos teet niillä projektimalleilla, se pääohjelma tulee toiseen tiedostoon ja ja silloin tuossa Lumiukko-luokassa ei saa enää olla toista metodia.

OP: okei, se selittää. mitä mallia käyttämällä näin ei tapahdu?
vl: kaikki mallit on tehty niin, että tulee kaksi .cs tiedostoa. Toisessa itse peli ja toisessa pääohjelma. Tämä siksi että se pelikoodi jota Nuorten kurssilla kirjoitetaan, olisi selkeämpi kun siinä on vain se oleellinen.

Eli silloin siihen itse pelikoodin tiedostoon ei kirjoiteta sitä Main-aliohjelmaa. Suomeksi sanottuna jos kopioit tiistain koodin sinne mallin tekemään pohjaan, niin poista siitä se main.

Komentoriviltä taas on pikkuisen työläämpi, ei psljon, kääntää jos on kaksi tiedostoa, joten aloitin niin että kaikki on yhdessä tiedostossa.

10 Sep 19 (edited 10 Sep 19)

Mac/Linux-käyttäjät:

  1. tehkää joko TIMissä:
  2. tai ennemmin tai myöhemmin asenna työkalut ja tee Mac/Linux-ohjeilla

Windows käyttäjät:

Lataa jypeli.zip-tiedosto ja pura sen sisällöstä kaikki *.dll samaan kansioon Lumiukko.cs-tiedoston kanssa. Purkamisesta: Windowsin tiedostonäkymässä voit tuplaklikata tiedostoa, jolloin voit copy-pastettaa oikeat tiedostot Lumiukon kanssa samaan paikkaan.

Kirjoita PowerShellillä (voit copy-pasteta tuon pitkän rimpsun)

csc Lumiukko.cs /reference:Jypeli.dll';'Jypeli.Physics2d.dll';'MonoGame.Framework.dll /platform:x86

HUOM! Jos ylempi ei toimi, varmista että olet noudattanut ohjeita täältä.

Komentorivillä (cmd.exe) vastaava komento olisi

csc Lumiukko.cs /reference:Jypeli.dll;Jypeli.Physics2d.dll;MonoGame.Framework.dll /platform:x86

Käännetyn ohjelman voi ajaa kirjoittamalla komentoriville allaolevan tekstin. Syntynyt "peli-ikkuna" saadaan pois painamalla Alt-F4.

.\Lumiukko.exe

Mullakin tyssää samaan kohtaan. Lumiukko.cs(10,25): error CS0433: The type ‘PhysicsGame’ exists in both ‘Jypeli.Physics2d, Version=1.3.1.42582, Culture=neutral, PublicKeyToken=null’ and ‘Jypeli, Version=5.1.6467.37742, Culture=neutral, PublicKeyToken=null’ Lumiukko.cs(28,26): error CS0115: ‘Lumiukko.Begin()’: no suitable method found to override

14 Sep 19
# csm

csm.bat

Yllä esitelty kääntämiskomento on varsin pitkä ja asioiden helpottamiseksi voikin kirjoittaa kotona tiedoston csm.bat (kuvitellaan että nimessä on lyhennetty C-sharp ja Monogame), jonka kopioi jonnekin hakemistoon joka on polussa (esimerkin tiedostolla ei tarvitse edes csc polkujuttuja määritellä). Tarkista kuitenkin että polut MonoGameen ja Jypeliin vastaavat niitä, joihin asensit ne.

@echo off
SET ERRORLEVEL=
SET jypelidllpath=C:\devel\MonoJypeli\windows
SET monodllpath=C:\Program Files (x86)\MonoGame\v3.0\Assemblies\Windows
"c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csc.exe" %* /nologo /reference:Jypeli.dll;Jypeli.Physics2d.dll;MonoGame.Framework.dll /lib:"%monodllpath%";"%jypelidllpath%" /platform:x86  /define:WINDOWS
if ERRORLEVEL 1 goto loppu
xcopy "%monodllpath%\*.dll" /d /y >nul
xcopy "%jypelidllpath%\*.dll" /d /y >nul
%~n1
del *.dll
:loppu

Minulla oli ongelmana, että aina kun ajoin esim Lumiukko.cs:n csm komennolla. Ei komento Lumiukko.exe enää toiminut sen jälkeen koska tämä csm poistaa ihan kaikki dll:t ko kansiosta. Otin tuon del*.dll rivin pois ja ongelma poistui. Oliko tämä hölmösti tehty?

VL: ei sinällään hölmösti. Tuon dellin idea on että sitten noita isoja tiedostooja ei jää joka paikkaan. Ja ajatus olis etä kun se kääntää ja ajaa samalla, niin erilliselle ajamiselle ei ole tarvetta. Mutta jos haluaa ajaa erikseen, niin silloin tuo del on poistettava. Ja muistettava itse siivota levyään ettei noita jää joka paikkaan. Linuxissa voi tehdä symbolisia linkkejä jolloin nuo voivat olla joka paikassa, mutta eivät vie tilaa. Pitääkin katsoa joko voi tehdä winkussa…

13 Sep 19 (edited 13 Sep 19)

Huom! Kirjoita hakemiston kohdalle sama hakemisto joka sinulla toimi HelloWorldiä tehdessä.

Tämän jälkeen kääntäminen ja samalla ajaminen (jos käännös onnistuu) onnistuu komennolla

csm Lumiukko.cs 

Agoran mikroluokissa csm-komento on valmiina N:\bin hakemistossa ja pitäisi toimia jos sinulla on N-levy mountattuna.

# color

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

En Huomaa syytä miksen voi muuttaa lumiukkoni väriä. Kun yritin muuttaa keskimmäisen pallon värin pinkiksi, se ei muutu, eikä pallojen kokojen muuttaminenkaan onnistu. Jostain syystä kun yritän kääntää Lumiukko.cs tiedoston sen jälkeen kun olen tallentanut muutokset siihen, sen ajaminen tuottaa normaalin muuttumattoman lumiukon kuvan. Komento csm Lumiukko.cs toimii, mutta tulee muuttumaton kuva lumiukosta siis.

VL: tuleeko kääntämisestä virheilmoituksia? Jos se ajaa vanhan koodin, niin se tarkoittaa että se uusi ei kääntynyt. Vertta .exe ja .cs kellonaikoja.

Joo ei ollut kääntänyt jostain syystä. Aloin tekemään uuteen tyhjään kansioon niin toimi.

14 Sep 19 (edited 14 Sep 19)
p2.Color = Color.HotPink;

Rivin voit lisätä mihin tahansa 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äytössä olevat valmiit värien nimet näet esimerkiksi Jypelin dokumentaatiosta tai ohjeista.

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

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

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.

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
# osx

Lumiukon käätäminen ja ajaminen MacOS:ssa

  1. Oletetaan että VisualSudio, MonoGame ja Jypeli on asennettu ohjeiden mukaan

  2. Lataa oheinen .zip tiedosto ja pura se. Tarvittava .zip tiedosto

  3. Kirjoita tiedosto Lumiukko.cs ja tallenna se purettuun kansioon

  4. Lumiuko koodi käännetään komennolla:

    mcs -r:Jypeli.dll -r:Jypeli.Physics2d.dll -r:MonoGame.Framework.dll Lumiukko.cs
  5. .exe tiedoston ajaminen onnistuu komennolla:

    mono Lumiukko.exe
# linux

Lumiukon kääntäminen ja ajaminen Linuxissa

  1. Oletetaan että Monodevelop ja Jypeli on asennettu ohjeiden mukaan

  2. Luo ja siirry vaikkapa hakemistoon lumiukko omassa hakemistossasi (esimerkissä /home/vesal)

  3. Kirjoita tiedosto Lumiukko.cs jollakin editorilla ja tallenna se

  4. Mono on mulla asentanut kirjastot osoitteeseen (tarkista itseltäsi tarkka osoite)

    /home/vesal/.local/share/MonoDevelop-5.0/LocalInstall/Addins/MonoDevelop.Jypeli.6.5.9/assemblies/Linux/
  5. Tämä on aivan liian pitkä kirjoitettavaksi kääntämiskomentoihin ja siksi tehdään symbolinen linkki:

    ln -s ~/.local/share/MonoDevelop-5.0/LocalInstall/Addins/MonoDevelop.Jypeli.6.5.9/assemblies/Linux/ lib  
  6. Asetetaan vielä Monodevelopin polku:

     export MONO_PATH=lib
  7. Itse kääntäminen komenolla:

     mcs  /r:lib/Jypeli.dll /r:lib/Jypeli.Physics2d.dll /r:lib/MonoGame.Framework.dll /r:lib/OpenTK.dll /r:lib/Tao.Sdl.dll  /r:System.Numerics /r:System.Drawing  Lumiukko.cs 

    Lumiukon tapauksessa tosin riittää vähempikin kirjastoja

     mcs  /r:lib/Jypeli.dll /r:lib/Jypeli.Physics2d.dll /r:lib/MonoGame.Framework.dll   Lumiukko.cs
  8. Ajaminen komennolla:

     mono Lumiukko.exe
  1. Vastaavasti kuin Windowsissa voisi kirjoittaa tälle kaikelle komentojonon vaikkapa nimelle csm.sh jonka sisältö olisi:

    #/bin/bash
    rm -f Lumiukko.exe >/dev/null
    if [ ! -L $mda ]; then
      ln -s ~/.local/share/MonoDevelop-5.0/LocalInstall/Addins/MonoDevelop.Jypeli.6.5.9/assemblies/Linux/ lib
    fi
    
    export MONO_PATH=lib
    mcs  /r:lib/Jypeli.dll /r:lib/Jypeli.Physics2d.dll /r:lib/MonoGame.Framework.dll /r:lib/OpenTK.dll /r:lib/Tao.Sdl.dll  /r:System.Numerics /r:System.Drawing  Lumiukko.cs
    mono Lumiukko.exe
  1. Ja sitten tuolle pitäisi antaa suoritusoikeudet: chdmod 755 csm.sh
  2. Ja tällöin ajaminen: ./csm.sh

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