PDA

Volledige versie bekijken : [As 2.0] prototype en class


Joram[Q]
%Europe/Berlin %891 %2007, 21:23
Ik ben een paar dagen met een tiled based spelletje, ik had een hele goede tutorial gevonden op internet en deze gevolgd. Dit was alleen een vrij oude code voor as 1.0. Ik wou zelf, ook om alles te leren, dit omzetten in classes zodat ik dingen ook makkelijk opnieuw kan gebruiken.
Om vanaf het begin te beginnen wou ik de tiles in beeld krijgen, dit lukt. Maar of een tile loopbaar is of dat het een muur is wordt zo in de tutorial gedaan:

// walkable tile
game.Tile0 = function () { };
game.Tile0.prototype.walkable = true;
game.Tile0.prototype.frame = 1;
// wall tile
game.Tile1 = function () { };
game.Tile1.prototype.walkable = false;
game.Tile1.prototype.frame = 2;
// door object prototype
game.Doors = function (newmap, newcharx, newchary) { this.newMap = newmap;this.newcharx = newcharx;this.newchary = newchary;};
game.Doors.prototype.walkable = true;
game.Doors.prototype.frame = 3;
game.Doors.prototype.door = true;
// door tiles
// make those tiles from the door object passing newmap, newcharx and newchary
game.Tile2 = function () { };
game.Tile2.prototype = new game.Doors(2, 1, 4);
game.Tile3 = function () { };
game.Tile3.prototype = new game.Doors(1, 6, 4);

en:

// make new tile object in the game
game[name] = new game["Tile"+map[i][j]]();

Als ik dit in m'n class wil bouwen geeft hij fouten omdat je een prototype niet in een class kan gebruiken. Maar hoe moet ik het maken zonder prototype maken?

Dauntless
%Europe/Berlin %900 %2007, 21:36
Classe:
class Tile
{
private var _walkable:Boolean;
private var _wall:Boolean;

public function setWalkable(p_walkable:Boolean):Void
{
this._walkable = p_walkable;
}

public function setWall(p_wall:Boolean):Void
{
this._wall = p_wall;
}

public function getWall():Boolean
{
return _wall;
}

public function getWalkable():Boolean
{
return _walkable;
}

}

var myTile:Tile = new Tile();
myTile.setWall(true); //nu is het een muur

Met wat heb je nog hulp nodig ?

(Kijk eventueel naar de link in m'n signature)

Joram[Q]
%Europe/Berlin %912 %2007, 21:54
ja, ik had je tutorial over classes al gelezen. Maar mijn vraag is nog hoe je die class van die tile kan gebruiken binnen m'n class van m'n map. dus waar ik de import moet zetten als ik doe moet gebruiken.

Dauntless
%Europe/Berlin %946 %2007, 22:43
Dat gaat niet.

Je hebt Classes en prototypes. Classes zijn de nieuwe (en goede!) manier van Object Oriented Programming. Prototypes zijn verouderd en verschrikkelijk achterhaald, nu je gewone classes kan schrijven. (Ok, achter de schermen worden gewone classes ook omgezet naar prototypes, maar dat is nu even niet belangrijk).

Joram[Q]
%Europe/Berlin %389 %2007, 09:21
Maar het probleem is dat de map op het scherm laten zien in een class staat, maar de afzonderlijke tiles ook in een class zijn. Voor elk vakje wordt er dus weer een class aangemaakt.
Dit moet dus op een andere manier waardoor elk vakje niet meer een class is maar ergens ene array maken met daar de info in voor elk vakje ofzo...

DoDo
%Europe/Berlin %475 %2007, 11:25
Dan kan je toch gewoon een nieuwe class aanmaken met new Tile()?

Joram[Q]
%Europe/Berlin %546 %2007, 13:07
wat dauntless zei is dat je niet een class binnen een class kan gebruiken. Maar dit is eigenlijk wel wat ik nodig heb. Is het dan wel mogenlijk volgens jouw en hoe moet ik dat doen dan behalve gewoon new Tile() want ik moet ook ergens m'n class includen enz...

DoDo
%Europe/Berlin %564 %2007, 13:33
Het schrijven van een class in een class kan niet, maar je kan wel twee classes maken en de tweede in de eerste aanroepen via een instance. Dat zal dan zo gaan

// foo.as
class foo {
private var bar;

public function foo() {
this.bar = new bar();
trace(this.bar.test); // Output: Aangeroepen
}
}

// bar.as
class bar {
public var test;

public function bar() {
this.test = 'Aangeroepen' // Output: Aangeroepen

trace(this.test);
}
}

Zo kan je wel twee classes gebruiken, maar echt in een class nog een nieuwe class schrijven kan niet.

Joram[Q]
%Europe/Berlin %578 %2007, 13:53
ok ik heb hem door, maar nu is nog 1 probleem:
Dauntless gaf een mooi stukje code hoe ik het moest doen, maar die klopt niet helemaal omdat ik voor elke soort tile een eigen class moet maken. En met het maken van een tile moet hij dus de goede pakken, dus bij this[name] = new Tile(); wat ik nu heb moet hij Tile1(); nemen voor vakje 1. In die class staan namelijk de eigenschappen en functies die alleen gelden voor tile met als eigenschap 1.
dus is zoiets als dit wel mogenlijk?

this[name] = new Tile map[i][j] ();

DoDo
%Europe/Berlin %584 %2007, 14:01
Wat voor eigenschappen staan daar dan? En wat voor eigenschappen staan er dan bij Tile2?

Joram[Q]
%Europe/Berlin %588 %2007, 14:07
Tile1 heeft bijvoorbeeld:

walkable = true;
frame = 1;

Tile2:

walkable = false;
frame = 2;

maar het zit hem vooral in de speciale tiles zoals deuren, die heeft ook een functie hebben die de andere niet hebben

JayBro
%Europe/Berlin %614 %2007, 14:45
dan moet je het wat breder zien

iedere "type" tile is een classe met specifieke properties, deze hebben 1 overkoepelende classe ("tile") die de juiste aanroept.

De map classe roept iedere keer de tile-classe aan, met daarbij aangevend wat voor soort tile het is.
De tile classe bepaald dan welke classe wordt gestart.
(een soort if-elseif-elseif verhaal, of liever case..of)

denk ik dan :D

Joram[Q]
%Europe/Berlin %618 %2007, 14:50
ja, dan moet je gewoon een if verhaal gaan inbouwen:

if(Tile map[i][j] == 1){
this[name] = new Tile1();
}elseif enz... enz...

of met die case enzo maar ik vroeg me dus af of er niet een makkelijkere manier bestaat

DoDo
%Europe/Berlin %658 %2007, 15:48
Je kan het toch zo doen:

// Tile.as
class Tile {
private var walkable:Boolean;
private var frame:Number;

public function Tile(walkable:Boolean, frame:Number) {
this.walkable = walkable;
this.frame = frame;
}

}

// Tile.fla
var tile1:Tile = new Tile(true, 1);
var tile2:Tile = new Tile(false, 2);

Dauntless
%Europe/Berlin %679 %2007, 16:18
Daar denk je dus eigenlijk helemaal fout over: Je hoeft echt geen aparte classe per tile aan te maken! De classe kan perfect zo geschreven worden dat de 1ne classe voor alle type tegels gebruikt kan worden.

Zoals Dodo hierboven laat zien: Er is 1 classe (Tile) die zowel Tiles voorstelt waarover je kan lopen (de eerste, tile1) en waarover je niet kan lopen (de tweede, tile2)

Joram[Q]
%Europe/Berlin %890 %2007, 21:21
ok, ik heb het nu door. Ik heb de basis nu en kan hierop verder bouwen. Waarschijnlijk komen er nog wel meer vragen maar dan horen jullie het wel. En anders kan je hem in de testcase misschien wel tegenkomen.