Játék pályaeltárolás probléma

Játék pályaeltárolás probléma
2012-07-20T10:24:08+02:00
2012-07-20T16:35:24+02:00
2022-11-26T09:15:40+01:00
tivi
Sziasztok!

Gyakorlásképpen egy Minecraft klónt írok. A pálya kockákból állna. Egy kocka számként lenne deklarálva(ushort), ha 0 akkor levegő, azaz semmi, ha 1 akkor föld. Majd később még szeretném bővíteni ezt. Aztán lennének Chunk-ok, amik 8x8x8 kockát tartalmaznak, ezt azért használnám, mert nem akarom az egész pályát betölteni egyszerre, hanem csak néhány chunkot. Majd lenne a World class ami összefogja a chunkokat. Eddig ilyen a forráskód:

struct Chunk { public bool isAir; // ha az egész chunk levegő, akkor nem rajzol ki semmit public ushort[, ,] chunk; public Chunk(ushort[, ,] x) { isAir = true; chunk = new ushort[8, 8, 8]; chunk = x; } } class World { public Chunk[] world; public World() { world = new Chunk[4]; } }

A World-ot úgy szeretném, hogy Chunkok száma dinamikus legyen és esetleg az is lehetne 3d-s.

World myWorld = new World(); myWorld.world[0].chunk[0, 0, 0] = 1; //értékadás

Értékadásnál null referencia kivételt dob. Miért?
Mutasd a teljes hozzászólást!
Értékadásnál null referencia kivételt dob. Miért?


Az ilyet a leggyorsabban egy rövid debugolással lehet kideríteni.

Szépen raksz egy breakpointot az adott sorra, és ott megnézed, hogy a kifejezésben használt értékek közül melyik null. Ebben a konkrét esetben a myWorld.world[0].chunk értéke lesz null, mivel a Chunk típus nem ad neki kezdőértéket.

A feladatot nehezíti, hogy struct-nak nem lehet default konstruktora, vagyis a Chunk tömb létrehozásakor minden benne levő Chunk a default értékekkel lesz inicializálva (isAir=false, chunk=null); Ezt legfeljebb utólag tudja módosítani a World konstruktora.
Mutasd a teljes hozzászólást!

  • Chunk-nál lefut egyáltalán ez a konstruktor?
    Mutasd a teljes hozzászólást!
  • Bizony, bizony az értékadással vannak problémák. Mégpedig ahogy így ránézek a chunk lesz neked null. Azt mi hozza létre?

    Valahogy így kellene szerintem kinéznie:

    myWorld.world[0] = new Chunk(new ushort[8,8,8]); //értékadás

    vagy a World konstruktorán belül:

    world[0].chunk = new ushort[8, 8, 8];
    , ami jobb megoldásnak tűnik

    Lenne egy észrevételem: Igaz, hogy írtad, hogy szeretnéd bővíteni később, de, hogy miként deklarálod a kockát, azt ne számokkal tárold el hanem szerintem enum-ként.
    Lenne egy kocka osztályod, abban lenne egy Típus meződ, ami tartalmazná, hogy éppen az milyen kocka(levegő, föld). Sokkal beszédesebb, mint egy szám. Ránézel, hogy "1", na az micsoda. Ehelyett inkább ránézel és látod, hogy "air".

    class Cube()
    {
    public enum Type { Air, Earth, Grass, Glass };
    private Type type;

    public Cube(Type Type)
    {
    this.type = Type;
    }
    }
    Mutasd a teljes hozzászólást!
  • Csaboka2 köszi a megoldást! Szerdzso köszi az enumos ötletet.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd