wiki:TileMapOhje
Last modified 7 years ago Last modified on 2012-06-13 21:15:12

Jypelin käyttöohjeet » Ruutukentän luominen

Pelissä kentän (Level) voi luoda tekstitiedostoon "piirretyn" mallin mukaisesti. Tällöin puhutaan, että tehdään ns. ruutukenttä, sillä tekstitiedostossa jokainen merkki tai välilyönti vastaa tietyn kokoista ruutua pelikentässä.

Voit itse päättää, minkälaista merkkiä mikäkin olio vastaa. Esimerkiksi '=' voisi olla seinä tai muu kiinteä kappale ja '*' vaikkapa tähti.

1. Kenttätiedoston pohjan lisääminen Visual Studioon

Helpoin tapa on tehdä ruudukko erilliseen tekstitiedostoon, josta se sitten luetaan. Vaihtoehtoinen tapa on määrittää ruudut suoraan koodissa.

HUOM! Jos teet peliä puhelimelle aloita täältä: kentän luonti content-projektin tekstitiedostosta

Ruudukon lataamiseksi tiedostosta lisätään ensin kenttätiedosto projektiin, jonka jälkeen kenttä voidaan ladata koodissa. Muokataan tiedostoa vähän myöhemmin.

Lisää projektiin uusi tekstitiedosto klikkaamalla projekti hiiren kakkospainikkeella, ja sen jälkeen valitsemalla Add ja New Item...

Valitaan tiedostoksi tekstitiedosto Text File ja annetaan sille sopiva nimi, esimerkiksi kentta.txt. Lisätään tiedosto projektiin valitsemalla Add

Tekstitiedosto tulee näkyviin Solution Explorer -ikkunaan.

2. Kentän muokkaaminen ConTextilla

Nyt voit alkaa muokkaamaan tekstitiedostoa. Mikroluokissa muokkaaminen onnistuu helpoiten ConText-ohjelmalla. Avaa ConText käynnistä-valikosta, tai klikkaamalla Win + R ja kirjoittamalla context ja paina Enter.

Avaa kentta.txt-tiedosto ConTextiin. Tekstitiedostoon voi nyt "piirtää" kirjoitusmerkeillä haluamansa kentän. Ruudukon leveydeksi tulee tiedoston pisimmän rivin pituus ja korkeudeksi tiedoston rivien määrä. Käytä tyhjien ruutujen merkitsemiseen välilyöntiä, älä käytä Tab-näppäintä.

Vinkki: Laita päälle sarake- ja rivinumeroiden näyttö, sekä tyhjien merkkien näyttö:

  • Sarakkeet: View » Ruler
  • Rivit: Options » Environment options » Editor » Line Numbers
  • Tyhjät merkit: View » Show Special Characters

Vinkki: Kentän muokkaaminen voi olla helpompaa, kun painat Insert-näppäintä (tekstin korvaustila). Paina Insert-näppäintä uudelleen päästäksesi takaisiin normaaliin kirjoitustilaan.

Kun olet piirtänyt kentän, klikkaa tallennuskuvaketta, tai mene File » Save (Ctrl + S).

Kun kenttä on valmis, palaa Visual Studioon. HUOM! Kenttien tekstitiedostot eivät kopioidu automaattisesti käännöskansioon (debug), jolloin peli kaatuu. Ratkaisu: Solution Explorerissa klikkaa kenttä-tekstitiedoston päältä hiiren oikealla » Properties » Copy to Output Directory » Copy if newer

3. Ruutukartan luominen

Ruutukentän luomista varten tarvitsee koodissa luoda ruutukartta-olio (TileMap). Sopiva paikka ruutukartan luomiseksi on aliohjelma, joka luo kentän (esim. LuoKentta()).

Normaalitilanne

Ruutukartta-olio luodaan seuraavasti (vaihda nimen kentta.txt tilalle tiedosto, jonka liitit projektiin):

TileMap ruudut = TileMap.FromFile("kentta.txt");

Puhelin & Content Importer

Jos haluat luoda ruutukartta-olion Content-projektin tekstitiedostosta, se tapahtuu seuraavasti (korvaa nimi 'kentta' oman kenttätiedostosi nimellä, .txt-loppua ei tarvitse kirjoittaa)

TileMap ruudut = TileMap.FromLevelAsset("kentta");

4. Merkit vastaamaan olioita

Tarkoitus on, että jokaista erilaista kirjoitusmerkkiä vastaa joku tietynlainen olio. Jokainen käyttämäsi merkki liitetään sitä vastaavan olion luovaan aliohjelmaan seuraavalla tavalla:

Jos haluat määritellä olioille esimerkiksi aivot (tekoäly) tai laittaa ne eri kerroksiin, pitää tämä kohta tehdä hieman eri tavalla, ks. kohta 8.

ruudut['='] = LuoPalikka;
ruudut['*'] = LuoTahti;

LuoPalikka sekä LuoTahti ovat sellaisia aliohjelmia, jotka eivät ota parametreja, mutta palauttavat GameObject-tyyppisen olion. Myös aliohjelma, joka palauttaa PhysicsObject-tyyppisen olion, kelpaa.

Nyt täytyy vielä kirjoittaa oliot luovat aliohjelmat. Esimerkiksi LuoPalikka voisi olla seuraavanlainen:

PhysicsObject LuoPalikka()
{
    PhysicsObject palikka = PhysicsObject.CreateStaticObject(50.0, 50.0);
    palikka.Shape = Shape.Rectangle;
    palikka.Color = Color.Gray;
    return palikka;
}

5. Kentän lisääminen peliin

Olioiden luomista varten kannattaa luoda luokkaan seuraavanlaiset attribuutit, joihin määritellään yhden ruudun koko eli se tila, mikä jokaiselle oliolle on kentässä varattu:

const int ruudunLeveys = 50;
const int ruudunKorkeus = 50;

Kun ruudut ovat taulukossa ja merkkien merkitys kerrottu, kentän voi vihdoin luoda peliin seuraavanlaisella komennolla:

ruudut.Insert(ruudunLeveys, ruudunKorkeus);

HUOM! Tämä komento muuttaa kentän kokoa! Jos siis lisäät kenttään reunoja tai zoomaat kameran näyttämään koko kentän, tee se vasta tämän jälkeen.

Toinen vaihtoehto on antaa kirjaston laskea edellämainitut attribuutit jolloin kentän koko ei muutu. Tällöin käytä komentoa:

ruudut.Insert();

6. Valmis esimerkki

Tässä eräs ratkaisu ruutukentän tekemiseen, kun kenttä on tehty erilliseen tekstitiedostoon nimeltä "kentta.txt":

using System;
using Jypeli;

public class Peli : PhysicsGame
{
    const int ruudunLeveys = 50;
    const int ruudunKorkeus = 50;

    public override void Begin()
    {
        LuoKentta();
        Camera.ZoomToLevel();
    }

    void LuoKentta()
    {
        TileMap ruudut = TileMap.FromFile("kentta.txt");
        ruudut['='] = LuoPalikka;
        ruudut['*'] = LuoTahti;
        ruudut.Insert(ruudunLeveys, ruudunKorkeus);
    }

    PhysicsObject LuoPalikka()
    {
        PhysicsObject palikka = PhysicsObject.CreateStaticObject(50.0, 50.0);
        return palikka;
    }

    PhysicsObject LuoTahti()
    {
        PhysicsObject tahti = PhysicsObject.CreateStaticObject(25.0, 25.0);
        return tahti;
    }
}

7. Tekstuurin lisääminen

Ruutukentän luomille olioille halutaan usein asettaa jokin kuva eli tekstuuri. Koska samaa kuvaa käytetään monta kertaa, se kannattaa ladata muuttujaan pelin alussa. Sitten samaa kuvaa voi helposti käyttää samanlaisia olioita luovassa aliohjelmassa.

Piirrä tekstuuri kuvankäsittelyohjelmalla ja katso sitten ohjeet sisällön tuomisesta projektiin.

Kun kuva on olemassa ja tuotu projektiin sitä voidaan käyttää seuraavasti:

Ladataan kuva muuttujaan luokan alussa:

using System;
using Jypeli;

public class Peli : PhysicsGame
{
    const int ruudunLeveys = 50;
    const int ruudunKorkeus = 50;

    Image palikanKuva = LoadImage( "palikka" );

    protected override void Begin()
    {
        //...

Asetetaan ladattu kuva olioille:

    PhysicsObject LuoPalikka()
    {
        PhysicsObject palikka = PhysicsObject.CreateStaticObject(50.0, 50.0);
        palikka.Image = palikanKuva;
        return palikka;
    }

8. Kun elementeille halutaan esim. kerros tai aivot

Joskus ruutukentän pelielementeille halutaan määritellä jotain erikoisominaisuuksia, kuten esimerkiksi kerros (ks. Kerrokset) tai tekoälyä (ks. Aivot). Tällöin ruutukentän määrittely koodiin pitää tehdä hieman eri tavalla. Tässä esimerkki:

void LataaKentta(string levelFile) {
  TileMap ruudut = TileMap.FromFile(levelFile);
  ruudut.SetTileMethod('P', LuoPelaaja);
  ruudut.SetTileMethod('#', LuoPalikka);
  ruudut.SetTileMethod('*', LuoTahti);
  ruudut.Execute(20, 20);
}

void LuoPelaaja(Vector paikka, double leveys, double korkeus)
{
  pelaaja = new Elephant(10, 10);
  pelaaja.Position = paikka;
  pelaaja.Mass = 10;
  
  AddCollisionHandler(pelaaja, OsuiMaaliin);
  Add(pelaaja);
}

void LuoPalikka(Vector paikka, double leveys, double korkeus)
{
  PhysicsObject taso = PhysicsObject.CreateStaticObject(
    leveys, korkeus, Shape.Rectangle);
  taso.Position = paikka;
  taso.Image = groundImage;
  Add(taso);
}

void LuoTahti(Vector paikka, double leveys, double korkeus)
{
  PhysicsObject tahti = new PhysicsObject(5, 5);
  tahti.Position = paikka;
  tahti.Mass = 0.005;
  tahti.Shape = Shape.Circle;
  tahti.Restitution = 1.0;
  tahti.Image = tahdenKuva;
  AddCollisionHandler(tahti, Keraa);
  Add(tahti, 1);
}