2012-05-28 4 views
1

Мое судно появляется на слое. При нажатии кнопки запуска судно должно перейти в расчетное местоположение. Прикосновение обнаружено, координаты правильно рассчитаны, но корабль не будет двигаться. Я прочитал 500+ Q и A на этом форуме относительно runAction, и ничего там не помогло. Я также перезапустил Xcode и очистил цели.runAction не перемещает мой корабль

Вот интерфейс для ShipManager:

#import <Foundation/Foundation.h> 
#import "Common.h"//imports cocos2d.h 

@interface ShipManager : NSObject { 
    GameLayer *layer; 
    CCSprite *ship; 
    ... 
    NSArray *shipTargetArray; 
    CCArray *shipArray; 
    int podValue; 
    int podKey; 
    int topPod; 
    int botPod; 
    float x; 
    float y;  
} 

@property (nonatomic, retain) CCSprite *ship; 
@property (nonatomic, retain) CCSprite *pod; 
... 

-(id)initWith:(GameLayer *)gameLayer; 
-(void)updateShip; 
-(void)resetShip; 
-(void)touchedExtinguishButton;  
@end 

Части файла реализации:

#import "ShipManager.h" 
#import "PodGroupManager.h" 
#import "GameLayer.h" 

@implementation ShipManager 

@synthesize ship; 
... 

int loadState; 

//LAUNCH SHIP 
-(void)launchShip { 
    NSNumber *theTarget; 
    CGPoint targetPosition; 
    int shipTarget = absInt(topPod * botPod); 

    theTarget = [NSNumber numberWithInt:shipTarget]; 
    NSInteger targetIndex = [shipTargetArray indexOfObject:theTarget]; 
    NSLog(@"target = %i; index = %i",shipTarget,targetIndex);//LOG:target = 20; index = 12 

    self.ship = [shipArray objectAtIndex:0];//NEW CODE. 
    NSLog(@"ship tag = %i",ship.tag);//LOG:ship tag = 100 
    NSLog(@"%@",shipArray);//LOG" <CCArray = 055209A0> = (<CCSprite = 05520A40 | Rect = (2.00,2.00,148.00,200.00) | tag = 100 | atlasIndex = 10>,) 

    x = ship.position.x; 
    y = ship.position.y + 10 +34 * targetIndex; 

    targetPosition = ccp(x,y); 
    NSLog(@"target x = %f; y = %f",x, y);//LOG: target x = 384.000000; y = 754.000000 

    //WHAT I WANT THE SHIP TO DO 
    id action = [CCSequence actions: 
       [CCMoveTo actionWithDuration:1.0f position:targetPosition], 
       [CCDelayTime actionWithDuration:1.0f], 
       [CCMoveTo actionWithDuration:.05f position:SHIP_START_POS], 
       nil]; 
    [ship runAction:action];//SHIP DOES NOT MOVE*/ 
    //ALSO TRIED: [self.ship runAction:action]; NO MOVEMENT 

    //ABOVE NOT WORKING -- TRYING SIMPLER MOVE 
    //CCMoveTo* move = [CCMoveTo actionWithDuration:1.0f position:targetPosition]; 
    //[ship runAction:move]; //TRYING SIMPLER ACTION - STILL NO MOVEMENT 


    //JUST TRYING TO GET THE SHIP THERE 
    //ship.position = targetPosition; //NO MOVEMENT EITHER 

    if (missionState == SHIP_EXT) { 
     NSLog(@"extinguish fuse");//logs button press correctly 
    }  
} 
... 
//RESET SHIP TO LAUNCHING PAD 
-(void)resetShip { 
    ship.position = SHIP_START_POS; 
    [self setShipState:SHIP_EMPTY]; 
    [self setMissionState:SHIP_IDLE]; 
    ship.visible = YES; 
} 

//SETUP SHIP 
-(void) setupShip { 
    shipArray = [[CCArray alloc]initWithCapacity:1];//just added - latest attempt 
    ship = [CCSprite spriteWithSpriteFrameName:@"ship.png"]; 

    [layer.batchNode addChild:ship z:SHIP_Z tag:SHIP_TAG]; 
    [shipArray addObject:ship];//just added - latest attempt 
    [self resetShip];  
} 
... 
//INITIALIZE SHIPMANAGER 
-(id)initWith:(GameLayer *)gameLayer { 
    if ((self = [super init])) { 
     layer = gameLayer; 
     [self setupShip]; 
     ...   
     [self setTopPod:0]; 
     [self setBotPod:0]; 

     //MAKE SHIPTARGET ARRAY 
     shipTargetArray = [[NSArray alloc] initWithObjects: 
          [NSNumber numberWithInt:1], 
          ... 
          [NSNumber numberWithInt:25], 
          nil]; 
    }  
    return self; 
} 

-(void) dealloc { 

    [shipTargetArray release]; 
    [shipArray release]; 
    self.ship = nil; 

    [super dealloc]; 
}  
@end 

Я знаю, что метод launchShip это выполняется, так как все NSLogs печати, как ожидается, и результаты верны. У меня есть 3 разных варианта, которые я пытаюсь запустить launchhip, и я комментирую/раскомментирую их в свою очередь, чтобы посмотреть, не работает ли какая-либо работа.
Я новичок в Objective-c и cocos2d, и я подозреваю, что проблема заключается в том, как я пытаюсь сказать runAction, для чего нужно запустить действие. Я уверен, что есть способ отправить сообщение должным образом, и любая помощь с тем, что это правильный способ, будет так оценена.
Заранее благодарим за любую помощь.

Перед запуском корабля на судно загружаются 2 топливных контейнера. Топливные стручки имеют числовые значения. Эти значения определяют цель назначения кораблей. Все это работает. Топливные стручки загружаются и рассчитывается правильный пункт назначения.

ответ

0
ship = [shipArray objectAtIndex:0]; 

Это задание не будет сохранено. Измените его на

self.ship = [shipArray objectAtIndex:0]; 

Позже в методе dealloc сделать

self.ship = nil; 

, чтобы освободить его. Относитесь к другим переменным (shipTargetArrayshipArray).

+0

Благодарим за отзыв. Пробовал - все равно не работает. Любые другие идеи? –

+0

@JoAnnC Можете ли вы обновить свой код до текущего состояния? И показать некоторые из вывода NSLog? –

+0

Отредактированный код с изменениями. –

Смежные вопросы