Cocos2d匹配目标速度滚动背景

时间:2014-04-30 08:25:03

标签: java android cocos2d-android ccaction

我正在使用Cocos2d Android。

我在Cocos2d中有一个滚动背景,我使用这种方法使它工作:

public void moveBackground(float dt) {
    bg1.setPosition(CGPoint.ccp(bg1.getPosition().x, bg1.getPosition().y
            - speed));
    bg2.setPosition(CGPoint.ccp(bg2.getPosition().x, bg2.getPosition().y
            - speed));
    if (bg1.getPosition().y < -(bg1.getBoundingBox().size.height)) {
        bg1.setPosition(CGPoint.ccp(bg1.getPosition().x,
                bg2.getPosition().y + bg2.getBoundingBox().size.height - 1));
    }
    if (bg2.getPosition().y < -(bg2.getBoundingBox().size.height)) {
        bg2.setPosition(CGPoint.ccp(bg2.getPosition().x,
                bg1.getPosition().y + bg1.getBoundingBox().size.height - 1));
    }
}

速度= 5或10或其他什么。这要归功于时间表,每一帧。

我想以与我的背景滚动相同的速度放下目标,添加目标我使用此方法:

public void addTargetFibre(float dt) {
    Random rand = new Random();
    CCSprite target = CCSprite.sprite(RessourcesManager.Players.blue_ball);
    target.setScale(0.3f);
    CGSize winSize = CCDirector.sharedDirector().displaySize();
    int actualX = (int) a;
    int n = rand.nextInt(4);
    switch (n) {
    case 0:
        actualX = (int) a;
        break;
    case 1:
        actualX = (int) b;
        break;
    case 2:
        actualX = (int) c;
        break;
    case 3:
        actualX = (int) d;
        break;
    }
    target.setPosition(actualX, winSize.height
            + (target.getContentSize().height / 2.0f));
    addChild(target, 1);
    float d = ((win_size.height+target.getContentSize().height/2)/(60*speed));
    d = d+(d*(float)1/60);
    CCMoveTo actionMove = CCMoveTo.action(d,
            CGPoint.ccp(actualX, -target.getContentSize().height / 2.0f));
    CCCallFuncN actionMoveDone = CCCallFuncN.action(this,
            "removeSprite");

    CCSequence actions = CCSequence.actions(actionMove, actionMoveDone);
    target.runAction(actions);

}

我想要的是我需要在CCMoveTo动作中加入的持续时间。

1 个答案:

答案 0 :(得分:0)

有两种可能性:

背景移动速度是恒定的,就像你现在所拥有的那样。不要在addTargetFibre中使用dt,因为你不想每帧都调用它。如果您知道initialPosition,finalPosition和speed,只需编写一个程序来计算2点之间的距离(在iOS版本的Cocod2D中存在ccpDistance,我确信它是Android的共同对象)

int d = ccpDistance(intialPosition, finalPosition)/speed;
CCMoveTo actionMove = CCMoveTo.action(d, finalPosition);

背景移动速度是可变的(例如:玩家控制操纵杆的背景移动)。如果是这种情况,您将不得不每帧移动精灵,并且您必须有一个方法来从您的更新中调用以修复位置。

public void updateTargetFibres(float dt) 

每帧更新位置的公式是

sprite.position = CGPointMake(sprite.position.x, sprite.position.y - speed*dt)

在此方法中,您还可以通过检查位置的y来检查您的精灵是否已离开屏幕,如果已经离开,则将其从父项中删除。