Почему setPosition работает в некоторых условиях, но не работает в других? - PullRequest
0 голосов
/ 12 февраля 2019

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

Я запускаю эту игру для Android, я запускаю этот код в VS'17, используя cocos2d-x-3.17.Я пытался сменить импульс на силу.Я пытался сделать остановку мяча (установите setVelocity на ноль перед setPosition).Я попытался изменить 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));
}

Я хочу вернуть объект (Ball) в исходное положение при столкновении с Target и повторить.извините, если формат беспорядок, я новичок здесь, и это не мой полный код, на самом деле он работает хорошо, я могу запустить его, но только setPosition не будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...