Toon posts:

[as2]class van instantie achterhalen

Pagina: 1
Acties:

Verwijderd

Topicstarter
in een flash-applicatie wil ik graag per instantie dynamisch kunnen achterhalen van welke class het een instantie is (oa voor debugging).
ik heb een aantal dingen geprobeerd:
Flash ActionScript:
1
2
3
4
5
6
7
8
import testfolder.*;

var myInstance:TestClass = new TestClass();

var className:String = "TestClass";
trace(myInstance instanceof eval("testfolder."+className));
trace(myInstance instanceof _global.testfolder[className]);
trace(typeof(myInstance));

De beide methodes met instanceof werken wel, maar daarme kan ik alleen maar checken of het een instantie van een door mij opgegeven class is. Wat ik eigenlijk zoek is een functionaliteit als typeof, maar die lijkt alleen met native flashobjecten te werken. in bovenstaande code levert typeof als resultaat object, en daar heb ik natuurlijk niet zo veel aan. Iemand een idee?

  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 16-01 10:51
Kan je niet in elke class gewoon een className variabele opnemen die je dan kan opvragen? Of voldoet dat niet aan wat je wilt? (Wat wil je er eigenlijk mee?)

Verwijderd

Topicstarter
De vraag wat wil je er eigenlijk mee? is altijd weer een reden om kritisch naar mijn code te kijken ;). Ik wil het eigenlijk alleen voor debugging gebruiken. Voor besturing heb ik een class die reageert op het toetsenbord. Hierbij zet ik alle af te vangen keys in een array, samen met de method die moet worden uitgevoerd als hij is ingedrukt, en het targetObject waarop die method moet worden uitgevoerd. Ik gebruik deze manier om dynamisch toetsen toe te kunnen voegen of te verwijderen, of om uit te voeren acties bij een toetsaanslag te kunnen wijzigen. Bij het aanroepen van de method check ik of die wel beschikbaar is op het targetObject, en zo niet dan wil ik een foutmelding krijgen met daarin het type object waar de method ontbreekt.
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private function checkKeys():Void {
    //checks if a registered key is down
    for (var i:Number=0; i<keyBehaviors.length; i++) {
        var keycode:Number = keyBehaviors[i][0];
        if (Key.isDown(keycode)) {
            respondToKey(i);
        }
    }
}

public function respondToKey(i:Number):Void {
    if (keyBehaviors[i][4]) {
        //dan enabled
        var targetObj:Object = keyBehaviors[i][1];
        var methodname:String = keyBehaviors[i][2];
        var param:String = keyBehaviors[i][3];
        executeMethod(targetObj, methodname, param);
    }
}

public function executeMethod(targetObj:Object, methodname:String, param:String):Void {
    //executes method with name [methodname] on object [targetObject] with [param] as param
    if (targetObj[methodname] != null) {
        targetObj[methodname](param);
    } else {
        trace("WARNING: targetObject has no method called "+methodname+" (generated by KeyController.respondToKey)");
    }
}

Ik had inderdaad al aan de mogelijkheid gedacht om elke class een variabele className mee te geven, en dat zou ook prima voldoen. Het leek me alleen niet de netste manier om het op te lossen (en een potentiele plek voor fouten wanneer je code van classes gaat kopieren), en ik kon me niet voorstellen dat een classname niet op te vragen zou zijn.

[ Voor 4% gewijzigd door Verwijderd op 23-08-2006 13:50 ]


  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 16-01 10:51
Waarom laat je elke class die methodes heeft niet gewoon zelf luisteren naar het Key object? Is dat omdat je het makkelijker en overzichtelijker vind omdat op 1 centrale plek te doen?

Verwijderd

Topicstarter
Ik heb een game waarin ik aan elk bewegend object (Movable) een Controller-class toeken, die de besturing regelt. Dat kan bijvoorbeeld een RandomController zijn, die de bijbehorende Movable steeds eem random richting opstuurt, of (voor de player) een KeyController, die op het keyboard reageert. Uit die class is de code hierboven afkomstig. Voor elke Movable kun je de Controller runtime wijzigen, zodat je bijvoorbeeld als de player op een transportband komt, de KeyController disabled en een TransportController aan de player koppelt. Een andere mogelijkheid is dat je bijvoorbeeld drie karakters hebt waar je als speler tijdens de game tussen kan switchen, en dan kan je de KeyController dus steeds aan een andere Movable toekennen. Wanneer ik alle objecten die methods hebben zou laten luisteren naar het Key object, zou ik bij dergelijke switches steeds de verwijzing naar de actieve Movable in alle objecten moeten wijzigen.