Плитка игровая диагонального движения - PullRequest
0 голосов
/ 01 августа 2011

Я играю в плитку. Следовал http://www.raywenderlich.com/1163/how-to-make-a-tile-based-game-with-cocos2d. Использование всего экрана в качестве джойстика для персонажа, который остается в середине. Движение идет только в четырех направлениях, хотя выглядит примерно так:

enter image description here

Там, где центр является плиткой персонажа, не двигайтесь, если к нему прикоснуться. Двигайтесь вправо, если коснуться правой стороны и т.д ...

Я хотел, чтобы это работало с 8 направлениями. Я попробовал несколько вещей, а затем нашел это: http://snipplr.com/view/39707/full-directional-movement-of-player-in-cocos2d-tilemap/

Что расширяет исходный код для обработки 8 направлений. Я изменил его и вызвал из ccTouchMoved и ccTouchEnded.

- (void)movePlayer:(CGPoint)to {
    CGSize winSize = [[CCDirector sharedDirector] winSize];
    CGPoint playerPos = _player.position;

    if (to.x < ((winSize.width/2)-((_tileMap.tileSize.width/2)*self.scale))) {
        playerPos.x -= _tileMap.tileSize.width;
    } else if (to.x > ((winSize.width/2)+((_tileMap.tileSize.width/2)*self.scale))) {
        playerPos.x += _tileMap.tileSize.width;
    }

    if (to.y < ((winSize.height/2)-((_tileMap.tileSize.height/2)*self.scale))) {
        playerPos.y += _tileMap.tileSize.height;
    } else  if (to.y > ((winSize.height/2)+((_tileMap.tileSize.height/2)*self.scale))) {
        playerPos.y -= _tileMap.tileSize.height;
    }

    if (CGPointEqualToPoint(self.player.position, playerPos) == NO) {
        if (playerPos.x <= (_tileMap.mapSize.width * _tileMap.tileSize.width) &&
            playerPos.y <= (_tileMap.mapSize.height * _tileMap.tileSize.height) &&
            playerPos.y >= 0 &&
            playerPos.x >= 0) {
            [self setPlayerPosition:playerPos];
            [self setViewpointCenter:self.player.position]; 
        }
    }
}

и это выглядит примерно так:

enter image description here

У этого есть проблема; с уменьшением масштаба становится все труднее идти по прямой линии, щелкая внутри сужающихся горизонтальных и вертикальных полос ...

Второй оригинальный автор разделил экран на три части, чтобы получить свои полосы движения. Я хотел масштабировать свою плитку персонажа, чтобы движение оставалось точным рядом с персонажем.

Так что я думаю, что мне нужно разделить область на 8 равных частей, чтобы она работала лучше? Примерно так:

enter image description here

Может кто-нибудь объяснить, как проверить наличие прикосновений в этих границах? Или если я поступлю правильно?

Спасибо!

1 Ответ

1 голос
/ 01 августа 2011

Отличное руководство по созданию объекта джойстика можно найти здесь: 71 квадрат Как сделать джойстик .

Что касается движения в одном из 8 упомянутых направленийвыше, все, что вам нужно сделать (после прочтения и реализации урока, конечно!), это выяснить угол тех 8 линий, которые вы нарисовали, и проверить, попадают ли вновь рассчитанные углы в любую из них.

Если вам нужен пример кода о том, как проверить 8 направлений, вы можете сделать это следующим образом: "

- (void)chooseDirectionForAngle:(float)aAngle; {

  if(aAngle >= 2 || aAngle <= -2){
    // choose right direction.
  }
  else if(aAngle > 1 && aAngle < 2){
    // choose up direction
  }
  else if(aAngle >= -1 && aAngle <= 1){
    // choose left direction
  }
  else if(aAngle > -2 && aAngle < -1){
    // choose down direction
  }
}

Очевидно, что в моем примере эти числа являются произвольными. Вам нужно только выяснить значение atan2(height, width) для тех 8 строк, которые вы нарисовали выше, что можно сделать даже через xcode с помощью NSLog(@"The angle is: %f", atan2(height, width));. Вам также нужно иметь 8 случаев вместо четырех и просто следовать логике сверху. Надеюсь, это поможет!

...