Eine klasse in den speicher einer anderen schreiben. Spiel mit Cocos2d

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Eine klasse in den speicher einer anderen schreiben. Spiel mit Cocos2d

    Guten Tag,

    ich bin grade dabei ein tower defense spile mit cocos2d zu schreiben. Es gibt eine klasse namens Tower, diese besteht wiederum aus anderen klassen, wie z.b drehturm. Die Tower klasse sieht so aus:
    Tower.h

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. #import "cocos2d.h"
    3. #import "Drehturm.h"
    4. #import "Radarsystem.h"
    5. #import "Geschuetzturm.h"
    6. @interface Tower : NSObject
    7. {
    8. CGPoint position;
    9. Drehturm* drehturm;
    10. Radarsystem* radarsystem;
    11. Geschuetzturm* geschuetz;
    12. NSMutableArray* objects;
    13. }
    14. @property (nonatomic, assign) CGPoint position;
    15. @property (nonatomic, retain) Drehturm* drehturm;
    16. @property (nonatomic, retain) Radarsystem* radarsystem;
    17. @property (nonatomic, retain) Geschuetzturm* geschuetz;
    18. @property (nonatomic, retain) NSMutableArray* objects;
    19. +(id)createTower;
    20. @end
    Alles anzeigen



    Tower.m

    Quellcode

    1. #import "Tower.h"
    2. @implementation Tower
    3. @synthesize drehturm;
    4. @synthesize radarsystem;
    5. @synthesize geschuetz;
    6. @synthesize position;
    7. @synthesize objects;
    8. +(id)createTower
    9. {
    10. Tower* newTower;
    11. if((newTower = [[[super alloc]init]autorelease]))
    12. {
    13. newTower.objects = [[NSMutableArray alloc]init];
    14. [newTower.objects addObject:[DrehturmOne Drehturm]];
    15. [newTower.objects addObject:[RadarsystemOne Radarsystem]];
    16. [newTower.objects addObject:[GeschuetzturmOne Geschuetzturm]];
    17. }
    18. return newTower;
    19. }
    20. -(void)setDrehturm:(Drehturm *)thedrehturm
    21. {
    22. drehturm = thedrehturm;
    23. drehturm.position = position;
    24. [objects replaceObjectAtIndex:0 withObject:drehturm];
    25. }
    26. -(void)setRadarsystem:(Radarsystem *)theradarsystem
    27. {
    28. radarsystem = theradarsystem;
    29. radarsystem.position = position;
    30. [objects replaceObjectAtIndex:1 withObject:radarsystem];
    31. }
    32. -(void)setGeschuetz:(Geschuetzturm *)thegeschuetz
    33. {
    34. geschuetz = thegeschuetz;
    35. geschuetz.position = position;
    36. [self.objects replaceObjectAtIndex:2 withObject:self.geschuetz];
    37. }
    38. @end
    Alles anzeigen



    Die Tower klasse setzte ich so:

    Quellcode

    1. Tower* newTower = [Tower createTower];
    2. newTower.position = ccp(100,300);
    3. [newTower setDrehturm:[DrehturmOne Drehturm]];
    4. [newTower setRadarsystem:[RadarsystemOne Radarsystem]];
    5. [newTower setGeschuetz:[GeschuetzturmOne Geschuetzturm]];
    6. [self addToScene:newTower.objects];



    addToScene sieht so aus:

    Quellcode

    1. -(void)addToScene:(NSMutableArray*)sprites
    2. {
    3. for (int i = 0; i < 3; i++)
    4. {
    5. [self addChild:[sprites objectAtIndex:i]];
    6. }
    7. }



    Nun ist mein problem folgendes, wenn ich z.b den drehturm ändern möchte nachdem ich die sprites zur scene hinzugefügt habe mache ich das so z.b so:

    Quellcode

    1. [newTower setDrehturm:[DrehturmFour Drehturm]];



    Nun ändert sich das bild des drehturms jedoch nicht, obwohl die klasse von newTower.drehtum der von DrehturmFour entspricht(nach geschaut mit NSLog).
    Ich denke das problem ist, dass ich eine komplett neue klasse erstelle und sie auch dem newTower richtig zugewiesen wird. Jedoch ist die klasse die die zur scene hinzugefügt wurde immer noch die alte. Eine idee wäre ja nun die neue klasse drehturm direkt in den speicher vom alten drehturm zu schreiben, somit sollte sich auch das bild, welches angezeigt wird, ändern. Die frage ist nun wie mache ich dies am einfachsten, sollte ich das mit c/c++ pointern machen, oder hat objective-c dafür bessere funktionen??

    Joni8a
  • Bitte ließ nochmal was einführendes über Objective-c und Cocoa. Du brichst gängige Namenskonventionen (Methodennamen klein!) und dein Code ist auch sehr undynamisch. Schau dir am besten auch nochmal etwas zum Thema Pointer und Accessormethoden (bzw property) an. Dann wirst du deinen Fehler auch schnell selber finden:

    In -setDrehturm: wird der DrehtumFour (vermutlich abgeleitet von CCSprite??) nicht dem CCLayer hinzugefügt. Wenn du Accessormethoden hast, dann nutz sie doch auch (wegen Memoryleak und co!) (z.B. Z.34). Vlt kannst du dir dann auch das MutableArray sparen.