Как сделать набор коллайдеров плитки с движением игрока по акселерометру iOS, cocos2d - PullRequest
0 голосов
/ 10 марта 2012

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

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

Это метод движения сенсорного плеера, чтобы вы могли видеть, как он должен работать.

     -(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint touchLocation = [touch locationInView:[touch view]];
    touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];

    CGPoint playerPos = ball.position;
    CGPoint diff = ccpSub(touchLocation, playerPos);

    //move horizontal or vertical?
    if(abs(diff.x) > abs(diff.y)){
        if(diff.x > 0)
        {
            playerPos.x += theMap.tileSize.width;
        }else{
            playerPos.x -= theMap.tileSize.width;
        }
    }else{
        if(diff.y > 0){
            playerPos.y += theMap.tileSize.height;   
        }else{
             playerPos.y -= theMap.tileSize.height;  
        }


    }

    //make sure the player isnt off the map
    if(playerPos.x <= (theMap.mapSize.width * theMap.tileSize.width) &&
       playerPos.y <= (theMap.mapSize.height * theMap.tileSize.height) &&
       playerPos.x >=0 &&
       playerPos.y >=0)
    {
        [self setPlayerPostion:playerPos];
    }
    [self setCenterOfScreen:ball.position];
}

Ниже показано, как он получает положение мяча и перемещает его с помощью акселерометра

 -(void)updateBall:(ccTime)delta{

//ball.position = ccp(ball.position.x, ball.position.y + tiltVertical);
//ball.position = ccp(ball.position.x + tiltHorizontal, ball.position.y);


CGPoint playerPos = ball.position;

playerPos.x += tiltHorizontal;
playerPos.y += tiltVertical;

ball.position = playerPos;
//make sure the player isnt off the map
if(playerPos.x <= (theMap.mapSize.width * theMap.tileSize.width) &&
   playerPos.y <= (theMap.mapSize.height * theMap.tileSize.height) &&
   playerPos.x >=0 &&
   playerPos.y >=0)
{
    ball.position = playerPos;
    CCLOG(@"testing for off screen");
    [self setPlayerPostion:playerPos];
    ball.position = playerPos;
}

 ball.position = playerPos;
 [self setCenterOfScreen:ball.position];

 }

 -(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration      *)acceleration{

tiltHorizontal = (acceleration.y* (-20));
tiltVertical = (acceleration.x) * 20;


 }

Вот два метода, которые используются для получения положения плитки и определения, являются ли свойства плитки Collidable и true (это задано в плитке, когда я создавал свою карту).

-(void)setPlayerPostion:(CGPoint)position{
CGPoint tileCoord = [self tileCoordForPosition:position];

int tileGid = [stLayer tileGIDAt:tileCoord];

if(tileGid)
{
    NSDictionary *properties = [theMap propertiesForGID:tileGid];

    if(properties){
        NSString *collision = [properties valueForKey:@"Collidable"];
        if(collision && [collision compare:@"True"] ==NSOrderedSame){
            return;
        }
    }
 }
 ball.position = position;
 }

 -(CGPoint)tileCoordForPosition:(CGPoint)position{
     int x = position.x/theMap.tileSize.width;
     int y = ((theMap.mapSize.height * theMap.tileSize.height)-    position.y)/theMap.tileSize.height;
    return ccp(x,y); 
   }

Что-то не так с моей логикой? или любое предложение будет оценено.

Спасибо

1 Ответ

0 голосов
/ 11 марта 2012

Убедитесь, что в вашем методе init есть строка self.isAccelerometerEnabled = YES.

...