wiki:RuutuKentänTekeminen
Last modified 8 years ago Last modified on 2011-05-31 16:09:40

Ruutukentän luominen (ennen Jypeli-versiota 2.1.4)

(Jos käytät Jypelin uudempaa versiota, pääset oikeaan ohjeeseen tästä linkistä.)

Pelissä kentän (Level) voi luoda tekstitiedostoon tai merkkitaulukkoon "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ä.

Taulukossa on lueteltu ruudukon oliot siten, että tietty merkki vastaa tiettyä oliota.

Ruutukentän tekemistä varten tarvitaan siis kaksiulotteinen, kirjoitusmerkeistä (char-tyyppi) koostuva taulukko.

Tällaisen taulukon voi kirjoittaa suoraan koodissa tai ladata tiedostosta. Voit itse päättää, minkälaista merkkiä mikäkin olio vastaa. Esimerkiksi '=' voisi olla seinä tai muu kiinteä kappale ja '*' vaikkapa tähti.

1. Kentän tekeminen kirjoitusmerkeistä

Tee joko tavalla 1 tai 2.

Tapa 1: Ruudukon lataaminen tiedostosta

Helpoin tapa on tehdä ruudukko erilliseen tekstitiedostoon, josta se sitten luetaan.

Ruudukon lataamiseksi tiedostosta lisätään ensin kenttätiedosto projektiin, jonka jälkeen kenttä voidaan ladata koodissa. Tiedostoa muokkaamalla voidaan sitten helposti määrittää miltä kenttä näyttää.

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, ja sitä kaksoisklikkaamalla se aukeaa koodi-ikkunan tilalle. Tiedostoikkunoiden yläreunasta voi valita välilehden avulla mitä tiedostoa muokataan.

Tekstitiedostoon voi nyt piirtää kirjoitusmerkeillä haluamansa kentän. Ruudukon leveydeksi tulee tiedoston pisimmän rivin pituus ja korkeudeksi tiedoston rivien määrä.

HUOM! Kenttien tekstitiedostot eivät kopioidu automaattisesti käännöskansioon (debug), jolloin syntyy ajonaikainen poikkeus. Ratkaisu: Solution Explorerissa klikkaa kenttä-tekstitiedoston päältä hiiren oikealla --> Properties --> Copy to Output Directory --> Copy if newer

Tapa 2: Ruudukon määrittäminen koodissa

Ruudukon voi määrittää koodissa tekemällä esimerkiksi seuraavanlaisen, kirjoitusmerkeistä koostuvan, taulukon:

char[,] ruudut =
{
    {'=', '=', '=', '=', '=', '=', '=', '=', '=', '=', '='},
    {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '=', ' '},
    {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
    {' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'},
    {'=', '=', ' ', '=', '=', ' ', ' ', ' ', ' ', ' ', '='},
    {'=', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '='},
    {'=', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', ' ', ' '},
    {'=', '=', '=', '=', '=', '=', '=', '=', '=', '=', '='},
};

Ruudukon leveydeksi tulee taulukon pisimmän rivin pituus ja korkeudeksi taulukon rivien määrä.

2. Merkit vastaamaan olioita

Tarkoitus on, että jokaista erilaista kirjoitusmerkkiä vastaa joku tietynlainen olio.

Seuraavaksi kerrotaan eri merkkien merkitys, mutta sitä ennen lisää koodin alkuun seuraava using-lause , jos se sieltä puuttuu, että saamme käyttöömme Dictionary-tietorakenteen.

using System.Collections.Generic;

Nyt jokainen käyttämäsi merkki liitetään sitä vastaavan olion luovaan aliohjelmaan seuraavalla tavalla:

var merkit = new Dictionary<char, ObjectCreator>();
merkit['='] = LuoPalikka;
merkit['*'] = LuoTahti;

Esimerkissä luodaan ensin merkit-niminen Dictionary. Se on tietorakenne, jonka avulla pystymme tässä tapauksessa liittämään tiettyyn merkkiin jonkin tietyn aliohjelman. Dictionaryn luonnin jälkeen sille on kerrottu, mikä merkki liittyy mihinkin aliohjelmaan.

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

3. Kentän luominen

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;

Jos kenttä on erillisessä tekstitiedostossa , se täytyy lukea kirjoitusmerkkitaulukkoon näin:

char[,] ruudut = Tiles.ReadFromFile("kentta.txt");

Kenttä luketaan kirjoitusmerkeistä koostuvaan taulukkoon ruudut. Tiles.ReadFromFile ottaa parametrina tekstitiedoston nimen merkkinojona. Huomaa, että tiedostopääte tulee mukaan.

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

Tiles.Insert(this, ruudut, merkit, ruudunLeveys, ruudunKorkeus);

4. Lopuksi

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

using System;
using Jypeli;
using Jypeli.ScreenObjects;
using Jypeli.Assets;
using System.Collections.Generic;

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

    protected override void Begin()
    {
        LuoKentta();
    }

    void LuoKentta()
    {
        var merkit = new Dictionary<char, ObjectCreator>();
        merkit['='] = LuoPalikka;
        merkit['*'] = LuoTahti;

        char[,] ruudut = Tiles.ReadFromFile("kentta.txt");
        Tiles.Insert(this, ruudut, merkit, 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;
    }
}