Цель-C: «GameLayer» может не отвечать на «-addChild: z» - PullRequest
0 голосов
/ 22 декабря 2009

Я новичок в разработке Objective-C и iPhone в целом. Я использую библиотеку Cocos2d-iphone для игрового движка в попытке разработать очень простую игру.

Я следил за несколькими уроками, чтобы освоить вещи, и пытаюсь собрать очень простой «уровень», где некоторые шары отскакивают по экрану, используя физический движок Бурундука. Ниже приведено определение и реализация файла, вызывающего проблемы. Предупреждение, сгенерированное во время компиляции:

GameScene.m: 69: предупреждение: «GameLayer» может не отвечать на «-addChild: z:» * ​​1007 *

GDB также обеспечивает следующее:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '*** - [GameLayer addChild: z:]: нераспознанный селектор, отправленный экземпляру 0xf6ff90'

Если я закомментирую эту строку, программа больше не будет аварийно завершать работу при вызове GameLayer. (Прокомментировал эту строку со словами «<< Видимо ... ошибка?». Это около нижней части GameScene.m - Второй бит кода в моем посте.) </p>

// GameScene.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "chipmunk.h"

@interface GameScene : Scene
{
}
@end

@interface GameLayer : Layer
{
    cpSpace *space;
}

-(void) makeBall: (float) x y:(float)y;
-(void) setupGame;

@end

А потом реализация:

// GameScene.m
#import "MenuScene.h"
#import "GameScene.h"

void updateShape(void* ptr, void* unused){
    cpShape* shape = (cpShape*)ptr;
    Sprite* sprite = shape->data;
    if(sprite){
        cpBody* body = shape->body;
        [sprite setPosition:cpv(body->p.x, body->p.y)];
    }
}

@implementation GameScene
- (id) init {
    self = [super init];
    if (self != nil) {
        Sprite * bg = [Sprite spriteWithFile:@"background.png"];
        [bg setPosition:cpv(240, 160)];
        [self add:bg z:0];
        [self add:[GameLayer node] z:1];
    }
    return self;
}
@end

@implementation GameLayer
- (id) init {
    self = [super init];

    if(self != nil) {
        isTouchEnabled = YES;
    }

    //Make it shoot:
    isTouchEnabled = YES;

    //Initialize Chipmunk:
    cpInitChipmunk();

    // Create the chipmunk space
    space = cpSpaceNew();
    cpSpaceResizeStaticHash(space, 400.0f, 40);
    cpSpaceResizeActiveHash(space, 100, 600);

    space->gravity = cpv(0, -400);
    space->elasticIterations = space->iterations;

    // Update Chipmunk
    // Calls the "tick" function below. This function subsequently
    // makes a call to the update function which updates all of the 
    // sprites on the screen.
    [self schedule: @selector(tick:) interval: 1.0f/60.0f];

    // Setup the game (place the player and balls on the screen)
    [self makeBall:100 y:100];

    return self;
}

// Sets up the game, placing the balls on the stage. Also creates the
// flor boundries and player
-(void) setupGame {
}

// Creates a ball and adds it to the desired location on the screen
-(void) makeBall: (float) x y:(float)y {
    Sprite *ball = [[Sprite spriteWithFile:@"start_ball.png"] retain];
    ball.position = cpv(x,y);
    [self addChild:ball z:2]; << Apparently this line is causing the error?
}

-(void)tick: (ccTime)dt {
    cpSpaceStep(space, 1.0f/60.0f);
    //cpSpaceHashEach(space->activeShapes, &updateShape, nil);
}

@end

Я прокомментировал строку в приведенном выше коде, которая, по моему мнению, вызывает ошибку. (<< Видимо, эта строка ...). </p>

Я уверен, что это что-то идиотское, но любая помощь будет признательна!

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 23 декабря 2009

У меня была эта проблема с Cocos2D 0.8 и я разработал обходной путь, который должен был объявить массив в классе слоя, который бы содержал дочерние объекты, которые вы хотите отслеживать.

@interface GameLayer : Layer
{
    cpSpace *space;
    NSMutableArray* children;
}

Затем вы можете добавить детей, используя ...

[[self children] addObject:myObject];

Достаточно просто манипулировать содержимым этого массива с тем, что вы захотите сделать.

0 голосов
/ 22 декабря 2009

Предупреждение во время компиляции связано с тем, что в части @interface нет ничего, что называется - addChild:z:.

Ошибка времени выполнения из-за того, что в детали @implementation нет - addChild:z:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...