0

我需要让 Cocos2d 相机跟随用户在屏幕上触摸的精灵(附加到 Box2D 主体)。当用户拖动播放器时,我需要它能够去世界其他地方。这必须通过触摸,而不是自动滚动。

我尝试了几种基于教程的方法,但似乎没有解决这个问题。例如,此处提供的解决方案使用 ccTouchesMoved 方法移动 CCCamera?(cocos2d,iphone) @Michael Fredrickson 的整个图层都移动了,但是当它移动时,屏幕上的精灵/身体具有无与伦比的协调性,当我测试它们是否被触摸时,if(fixture->TestPoint(locationWorld))失败了。

我还查看了这里的教程http://www.learn-cocos2d.com/2012/12/ways-scrolling-cocos2d-explained/但这也不是我想要的。

任何帮助将不胜感激。

编辑:

我在下面接受 Liolik 的回答,因为它让我走上了正确的轨道。然而,难题的最后一部分是使从 getPoint 方法接收到的值成为实例变量,并从中推断出locationWorld我正在做的事情TestPoint。像这样:

UITouch *myTouch = [touches anyObject];
CGPoint location = [myTouch locationInView:[myTouch view]];    
location = [[CCDirector sharedDirector] convertToGL:location];
b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);
b2Vec2 diff = b2Vec2(difference.x, difference.y);

for (b2Body* b = _world->GetBodyList(); b; b = b->GetNext()) {
    b2Fixture* f = b->GetFixtureList();
    while(f != NULL) {
        if(f->TestPoint(locationWorld-diff)) {
            b2MouseJointDef def;
            def.bodyA = _groundBody;
            def.bodyB = b;
            def.target = locationWorld-diff;
            def.maxForce = 9999999.0f * b->GetMass(); 
            _mouseJoint = (b2MouseJoint*)_world->CreateJoint(&def);
            b->SetAwake(true);
        }
     f = f->GetNext();
    }
}
4

2 回答 2

1

在更新功能中:

CGPoint direction = [self getPoint:myBody->GetPosition()];
[self setPosition:direction];


- (CGPoint)getPoint:(b2Vec2)vec
{
    CGSize screen = [[CCDirector sharedDirector] winSize];

    float x = vec.x * PTM_RATIO;
    float y = vec.y * PTM_RATIO;

    x = MAX(x, screen.width/2);
    y = MAX(y, screen.height/2);

    float _x = area.width  -  (screen.width/2);
    float _y = area.height - (screen.height/2);

    x = MIN(x, _x);
    y = MIN(y, _y);

    CGPoint goodPoint = ccp(x,y);

    CGPoint centerOfScreen = ccp(screen.width/2, screen.height/2);
    CGPoint difference = ccpSub(centerOfScreen, goodPoint);

    return difference;
}
于 2013-05-30T12:04:05.123 回答
1

所以如果我理解正确,当精灵在屏幕中间时,背景是静止的,精灵跟随你的手指,但是当你向边缘滚动时,相机开始平移?

我在我的游戏 Star Digger 中遇到了大致相似的情况,屏幕中间有一艘船在它自己的层上必须绕着世界飞行,当船向主世界层发射子弹时也遇到了同样的问题。

这是我所做的:

float thresholdMinX = winSize*1/3;
float thresholdMaxX = winSize*2/3;

if(touch.x > thresholdMaxX) //scrolling right
{
  self.x += touch.x - thresholdMaxX;
}
else if(touchX < thresholdMinX)
{
  self.x += thresholdMinX - touchX;
}
else
{
  sprite.position = touch;
}
CGPoint spritePointInWorld = ccp(sprite.x - self.x, sprite.y - self.y);

那么每次计算碰撞时,都需要重新计算精灵在世界中的“实际”位置,即它的屏幕位置减去世界偏移量,而不是精灵的屏幕位置。

于 2013-05-31T02:38:40.903 回答