AS2.0 > extended movieclip classes > geen instance op stage

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een ernstige ruzie met actionscript 2.. ik weet dat ik beter 3 kan gaan gebruiken maar ik ben genoodzaakt 2 te gebruiken omdat op onze school/werk er 2.0 gebruikt wordt.. |:(

anyway.. ik heb hier een situatie die misschien voor de doorgewinterde AS-scripter / OOP specialist is bedoeld.. als je me kan helpen dan supergraag.. _/-\o_

hypothetische minimum case:

men neme een class die er ongeveer zo uitziet.. een class die een movieclip extend:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Creature extends MovieClip{
var health:Number;
var size:String;
function Creature(var creatureName:String){ //constructor
_root.createEmptyMovieClip(creatureName,0);
_root[creatureName].attachMovie(creatureName+"_idle","mc_idle",1);
health = 100;
size = "whatever";
walkYouDumbCow();

return _root.[creatureName]; // *** zie opmerking onder! 

}
public function attack(){
// blabla
}
public function runAway(){
// yadaya
}
private function walkYouDumbCow(){
// random walking around blabla
}
}


deze klasse, wanneer aangeroepen met een string voor naamgeving, moet dus een movieclip aanmaken op de mainstage.. en daar wil ik dan direct controle over hebben doormiddel van de klasse..

*** ik return nu in de klasse de aangemaakte movieclip omdat ik weet dat je met new MovieClip() geen movieclips kunt aanmaken in as2.. daar was ik al achter.. met deze return hoopte ik dus dat ik op zijn minst een declaratie kan doen of iets zodat ik tenminste een movieclip waar ik mijn eigenschappen, methods etc aan kan hangen.. ik leg het misschien wat vreemd uit maar hieronder een situatie zoals ik het graag zou willen en wat denk ik ook logische OOP manier is:

code:
1
2
3
4
5
6
7
8
9
10
var beestjeStout:Creature = new Creature("angryCreature");
var beestjeLief:Creature = new Creature("evasiveCreative");

if(beestjeStout.hitTest(beestjeLief._x,beestjeLief._y,true)){
    beestjeStout.attack();
    beestjeLief.runAway();
}
trace("zelfs dit werkt niet en geeft undefined: "+beestjeStout._x);
trace("zelfs dit werkt niet en geeft undefined: "+beestjeLief._y);
trace("zelfs dit werkt niet !!!: "+beestjeStout.health);


Wie kan helpen hier iets zinnigs van te maken en as2 compatible?? :)

edit: ik heb uiteraard ook geprobeerd:
code:
1
this = _root.[creatureName];

ipv de return die ik nu doe.. maar dat werkt niet.. dat was ideaal geweest.. iemand een workaround?

[ Voor 4% gewijzigd door Verwijderd op 30-01-2010 14:19 ]


Acties:
  • 0 Henk 'm!

  • LB Back
  • Registratie: November 2004
  • Laatst online: 03-06 11:07
trace(beestjeStout.health); geeft je denk ik wel een waarde van 100 maar de _x en _y blijven undefined.

beestjeStout is een instance van de creature class. Je wilt eigenlijk de _x en _y van de movieClip die de instance genereert, niet van de instance zelf, want die heeft die eigenschappen niet.

_root.createEmptyMovieClip(creatureName,0); creeert steeds mcs op een depth van 0, beter zeg je:
_root.createEmptyMovieClip(creatureName,this.getNextHighestDepth());

Als je namelijk de eigenschappen _x en _y van angryCreature opvraagt is die op een depth van 0 al overschreven door evasiveCreative.

this = _root.[creatureName]; scoping geknoei moet je proberen te vermijden, bovendien schrijf je
_root[creatureName]; en kun je this niet stellen.

Verder neem ik aan dat je wel de class import?
import Creature;

Deze traces zouden wel moeten werken dan:
trace("zelfs dit werkt: "+evasiveCreative._x);
trace("zelfs dit werkt: "+evasiveCreative._y);
trace("zelfs dit werkt!!!: "+beestjeStout.health);

edit:
toch even uitgeprobeerd, hier is een werkende basis:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Creature.as:
class Creature extends MovieClip {
    var health:Number;
    var size:String;

    function Creature(creatureName) {//constructor
        _root.createEmptyMovieClip(creatureName,this.getNextHighestDepth());
        _root[creatureName].attachMovie(creatureName+"_idle","mc_idle",1);
        health = 100;
        size = "whatever";
        walkYouDumbCow();
    }
    public function attack() {
        // blabla
    }
    public function runAway() {
        // yadaya
    }
    private function walkYouDumbCow() {
        // random walking around blabla
    }

}

code:
1
2
3
4
5
6
7
8
// Creature.fla:
import Creature;
var beestjeStout:Creature = new Creature("angryCreature");
var beestjeLief:Creature = new Creature("evasiveCreative");

trace("zelfs dit werkt: "+evasiveCreative._x);
trace("zelfs dit werkt: "+evasiveCreative._y);
trace("zelfs dit werkt!!!: "+beestjeStout.health);

if (beestjeStout.hitTest(beestjeLief._x, beestjeLief._y, true)) {
beestjeStout.attack();
beestjeLief.runAway();
}
gaat dan natuurlijk ook niet werken. Onderstaande code helpt je op weg:
code:
1
2
3
4
if (angryCreature.hitTest(evasiveCreative._x, evasiveCreative._y, true)) {
    beestjeStout.attack();
    beestjeLief.runAway();
}

[ Voor 43% gewijzigd door LB Back op 31-01-2010 13:07 . Reden: code toegevoegd ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dank je voor je antwoord.. je bent de enige die reageert tot nu toe.. de code was idd wat slordig omdat het out-of-the-blue rather then out-of-the-box was geschreven.. ik verzon een voorbeeld hier op het forum.. hier en daar idd wat slordig.. echter waar het mij even om ging is dat de hele kracht van deze OOP-oplossing teloor gaat.. als ik bij wijze van spreken voor een game iets maak dan geef ik voorkeur voor (wellicht geen werkend voorbeeld(?)):
code:
1
2
3
4
5
6
7
8
9
10
11
import game.*;
MegaMan = new Player('megamanSprites');
Rush = new Player('cyberDoggySprites');

MegaMan._x = Stage.width / 2;
MegaMan._y = 0;
MegaMan.enterScene(1);

Rush._x = MegaMan._x - 50;
Rush._y = 500;
Rush.waiting();

en niet:
code:
1
2
3
4
5
6
7
megamanSprites._x = Stage.width / 2;
megamanSprites._y = 0;
MegaMan.enterScene(1);

Rush._x = MegaMan._x - 50;
Rush._y = 500;
cyberDoggySprites.waiting();


enig idee of dat kan :? ..??

Acties:
  • 0 Henk 'm!

  • LB Back
  • Registratie: November 2004
  • Laatst online: 03-06 11:07
MegaMan._x = Stage.width / 2;
MegaMan._y = 0;

...duidt er toch nog steeds op dat je eigenschappen wilt hangen aan een instance van een class, ipv een movieClip of een sprite. Zie de class van elke figuur uit je swf als een dossier, een map met info over die bepaalde instance. Met een mc of sprite vang je interactie/events op of laat je die gebeuren.

Acties:
  • 0 Henk 'm!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

Een AS2 bug waar jij volgens mij last van hebt, is dat niet alle properties direct beschikbaar zijn na het aanmaken. Wacht 1 frame en je kunt wel bij properties als x, y, enz.
...duidt er toch nog steeds op dat je eigenschappen wilt hangen aan een instance van een class, ipv een movieClip of een sprite. Zie de class van elke figuur uit je swf als een dossier, een map met info over die bepaalde instance. Met een mc of sprite vang je interactie/events op of laat je die gebeuren.
Als die class toch een movieclip extend, dan kan dat toch gewoon?

[ Voor 51% gewijzigd door Tsjilp op 02-02-2010 18:11 ]

Raar... Is zo gek nog niet