Toegang krijgen tot de settermethode van een andere klasse

Ik heb een GameWorld-klasse die CCLayer erft en een CCScene retourneert. Mijn GameWorld heeft een gesynthetiseerde eigenschap, "score". De score wordt elke 2 seconden verhoogd - dus hoe langer je het spel speelt, hoe hoger het wordt.

Super goed!

Nu bel ik mijn GameObject, dat CCNode erft en een sprite retourneert, die als een kind aan de laag moet worden toegevoegd. Elk GameObject heeft een "kosten" -eigenschap.

Maar telkens wanneer u een nieuwe sprite toevoegt, daalt uw score naargelang de kosten.

Dus hoe kan ik mijn (int) score instellen in de GameWorld, FROM the GameObject, die de (int) kosten bevat die de score zullen verlagen?

Met andere woorden, het is eenvoudig om de GameWorld-score in de klas in te stellen/te krijgen, maar mijn GameObject-klasse kan GameWorld niet zien. Is er een manier om de methode setter voor de eigenschap van een klasse bloot te stellen aan een andere klasse?

Bedankt!

1

3 antwoord

Verander je GameWorld-klasse in een "tijdelijke" singleton (bij gebrek aan een betere naam voor dit patroon). Dit werkt goed voor scènes in Cocos2D en andere knooppunten (lagen) die gegarandeerd langer in de knoop blijven dan hun broers en zussen/kinderen.

static GameWorld* instance;

-(id) init
{
    if ((self = [super init]))
    {
        instance = self;
    }
    return self;
}

-(void) dealloc
{
    instance = nil;
    [super dealloc];
}

+(GameWorld*) sharedGameWorld
{
    return instance;
}

Je kunt dan op dezelfde manier toegang krijgen tot je game-wereldinstance vanuit elk object in die wereld:

[GameWorld sharedGameWorld].score += 10;

Persoonlijk denk ik dat dit klopt met het passeren van zwakke referenties, omdat de neiging om te behouden er is. En wanneer u de GameWorld wel in een van de objecten die de GameWorld bevat, behoudt, dan heeft u een cyclus behouden en dus de hele scène zal lekken.

0
toegevoegd
Tijdelijk omdat de singleton alleen bestaat terwijl uw GameWorld bestaat. Het is misschien niet beschikbaar in uw menuschermen. "Normale" singletons zijn beschikbaar gedurende de hele levensduur van uw app, hoewel dat strikt genomen niet het patroon is.
toegevoegd de auteur LearnCocos2D, de bron
Ik doe zoiets als dit. Hoewel ik niet te veel singletons wil maken, lijkt een object als GameWorld daar een goede kandidaat voor. Waarom noem je dit een 'tijdelijke' singleton? Het ziet er normaal uit.
toegevoegd de auteur Danyal Aytekin, de bron

Als de GameWorld exemplaren van GameObject s bevat, doe dit dan gewoon in GameWorld .

self.score -= anObject.cost;

Anders moet er een klasse zijn die een verwijzing naar GameWorld bijhoudt. Doe het daar.

aWorld.score -= anObject.cost
0
toegevoegd

Om de eigenschap van het andere klasseobject in te stellen, registreert u deze als de eigenschapwaarnemer van dat andere object of maakt u een zwakke referentie tussen deze twee objecten.

Overweeg bijvoorbeeld om een ​​ @property (nonatomic, assign) GameWorld * gameWorld; aan uw GameObject-klasse toe te voegen. Wanneer u vervolgens de game gameWorld van de twee set gameObject maakt.

GameWorld *gameWorld = //init;
GameObject *gameObject = //init;
gameObject.gameWorld = gameWorld;

Vervolgens hebt u toegang tot het object gameWorld en alle eigenschappen van uw GameObject-klasse.

0
toegevoegd