0

我做了一个游戏,比如说 ThrowBall,玩家可以捡起产生的球并将其扔到目标中,得到分数,然后球返回它的位置并重复。问题是当玩家将球(我将球作为玩家的孩子)拖入目标时,球会正确地将其位置返回到所需位置,但是当我通过施加冲动将球送入目标后它发生碰撞时会发生奇怪的事情它赢了'没有将球返回到所需的位置,为什么会发生这种情况?

我正在为 android 运行此游戏,我正在使用 cocos2d-x-3.17 在 VS'17 中运行此代码。我试着把冲动变成力量,moveby。我尝试让球停止(在 setPosition 之前 setVelocity 为零)。我尝试将Point更改为Vect,vec2。我试图断点调试,代码确实读取了 setPosition 但什么也不做。

GameScene.cpp
bool GameScene::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

auto pickupListener = EventListenerPhysicsContact::create();
pickupListener->onContactBegin = CC_CALLBACK_1(GameScene::onContactBegin, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(pickupListener, this);
return true;
}

bool GameScene::onContactBegin(cocos2d::PhysicsContact &contact)
{
PhysicsBody *a = contact.getShapeA()->getBody();
PhysicsBody *b = contact.getShapeB()->getBody();

if (
    (BALL_COLLISION_BITMASK == a->getCollisionBitmask() && PLAYER_COLLISION_BITMASK == b->getCollisionBitmask()) ||
    (BALL_COLLISION_BITMASK == b->getCollisionBitmask() && PLAYER_COLLISION_BITMASK == a->getCollisionBitmask())
    )
{
    // make the ball follow Player
    isfollow = true;
}
else if (
    (BALL_COLLISION_BITMASK == a->getCollisionBitmask() && TARGET_COLLISION_BITMASK == b->getCollisionBitmask()) ||
    (BALL_COLLISION_BITMASK == b->getCollisionBitmask() && TARGET_COLLISION_BITMASK == a->getCollisionBitmask())
    )
{
    isfollow = false;
    // add score
    score++;
    __String *tempScore = __String::createWithFormat("%i", score);

    scoreLabel->setString(tempScore->getCString());

    // return spawn ball
    ball->returnPos();
    return false;
}
void GameScene::throwBall() {
if (isfollow == true) {
    isfollow = false;
    ball->getSprite()->getPhysicsBody()->applyImpulse(Vec2(100000, 100000));
}                                                                                                                                                                                                                                                                                                         
}

Ball.h
class Ball
{
public:
Ball(cocos2d::Layer *layer);
cocos2d::Sprite *getSprite() { return randomSpawn; };
void returnPos();

private:
cocos2d::Size visibleSize;
cocos2d::Vec2 origin;
cocos2d::Sprite *randomSpawn;
};

Ball.cpp
Ball::Ball(cocos2d::Layer *layer)
{
visibleSize = Director::getInstance()->getVisibleSize();
origin = Director::getInstance()->getVisibleOrigin();
randomSpawn = Sprite::create("res/ball.png");
randomSpawn->setPosition(Vec2(400, 80));

auto randomBallBody = PhysicsBody::createCircle(randomSpawn->getContentSize().width / 2);
randomBallBody->setCollisionBitmask(BALL_COLLISION_BITMASK);
randomBallBody->setContactTestBitmask(true);
randomBallBody->setGravityEnable(false);
randomSpawn->setPhysicsBody(randomBallBody);

layer->addChild(randomSpawn);
}

void Ball::returnPos()
{
randomSpawn->setPosition(Vec2(400, 80));
}

我想让物体(球)在撞到目标时返回位置并重复。如果格式一团糟,我很抱歉,我是新来的,也不是我的完整代码,它实际上工作正常我可以运行它,但只有 setPosition 不起作用

4

0 回答 0