Столкновение между GameCharacter и ScrollingLayer - PullRequest
0 голосов
/ 20 ноября 2011

Я новичок в cocos2d и прошел через книгу «Изучение cocos2d».Как и в Книге, я реализовал слой прокрутки для прокрутки, когда мой игровой персонаж движется.Моя проблема заключается в следующем: я использую обычный Sprite для рендеринга прокручиваемого слоя. Кто я могу проверить, касается ли мой персонаж касательного слоя?

fyi: Это рыба, и ему нужно проплыть черездыра и есть стены над ней и под ней, и он не сможет попасть впереди или позади скал.

Я искал в интернете и на этом форуме, но не смог найти подходящих решений,Является ли 'Tiled' ключом к счастью, я читал о реализованных коллизиях, но не могу понять, как они реализованы с помощью tmx

Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 21 ноября 2011

Для более простого, но мощного обнаружения столкновений вам, скорее всего, понадобится физический движок. Я рекомендую расширение SpaceManager для двигателя Бурундука.

В Tiled вы можете добавить объектный слой в файл tmx, где вы можете выделить все препятствия. Вот как я анализирую эту информацию в моей игровой сцене:

в init:

self.tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"TileMap.tmx"];
...
smgr = [[SpaceManagerCocos2d alloc] init];
smgr.constantDt = 1/60.0;
smgr.gravity=ccp(0, 0);

[smgr addWindowContainmentWithFriction:0.0 elasticity:0.0 size:CGSizeMake(1000, 1000) inset:cpvzero radius:1.0f]; //borders of your world, can be set from tmx size

player = [smgr addCircleAt:ccp(x,y) mass:6 radius:15];

и где-то:

- (void) drawWalls {
//searching for object layer called "Collisions"
CCTMXObjectGroup *objects = [_tileMap objectGroupNamed:@"Walls"];
NSMutableDictionary * objPoint;
int x ;
int y ;
int w ;
int h ;

for (objPoint in [objects objects]) {
    x = [[objPoint valueForKey:@"x"] intValue];
    y = [[objPoint valueForKey:@"y"] intValue];
    w = [[objPoint valueForKey:@"width"] intValue];
    h = [[objPoint valueForKey:@"height"] intValue];
    GameController *controller = [GameController sharedController];
    if(controller.retina==1)
    {
        x=x/2;
        y=y/2;
        w=w/2;
        h=h/2;
    }

    cpShape *staticShape = [smgr addRectAt:ccp(x+w/2,y+h/2) mass:STATIC_MASS width:w height:h rotation:0];
}
}

Затем вы можете применить силу к объекту "игрок" и обновить свою позицию спрайта методом "update":

playerSprite.position=ccp(player->body->p.x, player->body->p.y);

Конечно, вы можете использовать какой-то другой алгоритм для обнаружения столкновения, но это всего лишь пример хранения и извлечения этой информации из tmx.

...