Cocos2d iphone I';我试着做一个游戏的复制品只是为了练习。但是我';我不能把正确的游戏循环

Cocos2d iphone I';我试着做一个游戏的复制品只是为了练习。但是我';我不能把正确的游戏循环,cocos2d-iphone,cocos2d-x,cocos2d-x-3.0,cocos2d-android,Cocos2d Iphone,Cocos2d X,Cocos2d X 3.0,Cocos2d Android,我是一个初学者,从cocos2d-x开始。我想复制这个游戏- 这看起来很简单,但事实证明我在“更新功能”(游戏循环)中使用的逻辑不起作用。 这是我的密码- #include "MainGameScene.h" #include "MainMenuScene.h" #include "GameOverScene.h" #include "Constants.h" USING_NS_CC; Scene* MainGameScene::createScene() { // 'scene'

我是一个初学者,从cocos2d-x开始。我想复制这个游戏-

这看起来很简单,但事实证明我在“更新功能”(游戏循环)中使用的逻辑不起作用。 这是我的密码-

#include "MainGameScene.h"
#include "MainMenuScene.h"
#include "GameOverScene.h"
#include "Constants.h"

USING_NS_CC;

Scene* MainGameScene::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();

    // 'layer' is an autorelease object
    auto layer  = MainGameScene::create();
    auto layer2 = MainGameScene::create();


    // add layer as a child to scene
    scene->addChild(layer);
    scene->addChild(layer2); 

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool MainGameScene::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }

    Size visibleSize  = Director::getInstance()->getVisibleSize();
    Vec2 origin        = Director::getInstance()->getVisibleOrigin();

     // this will now place the sprite in the middle of the viewport
sprite = Sprite::create("top.png");
sprite->setPosition(Point( visibleSize.width/2 + origin.x, visibleSize.height/3 + origin.y));
sprite->setAnchorPoint( Vec2( 0.5, 0 ));
this->addChild( sprite );

     //Accelerometer Setup here...
   Device::setAccelerometerEnabled(true);
   auto acclistener = EventListenerAcceleration::create(CC_CALLBACK_2(MainGameScene::onAcceleration, this));
   Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(acclistener, this);

   this->scheduleUpdate();

    return true;
}

void MainGameScene::onAcceleration(cocos2d::Acceleration *acc, cocos2d::Event *event) {

    //Position constraints
    Size winSize         = Director::getInstance()->getWinSize(); 

    float rotX        = sprite->getRotation();
    float w           = winSize.width ;
    float h           = winSize.height;
    float center      = winSize.width/2 ;
     currentPos  = sprite->getPositionX();
    float   y         = sprite->getPositionY();
    float spriteWidth = sprite->getContentSize().width;
    //Filters for acceleration
    float sensitivity       = 0.3;
    float kFilteringFactor  = 0.4;



     //Accelerometer To control natural movement (GAME_LOOP_CONTROL)
      float accelX = ( acc->x * kFilteringFactor ) + ( accelX * (1.0 - kFilteringFactor ));

      rotX         = accelX - acc->x ; 
      currentPos   +=  acc->x * w * sensitivity;



    sprite->setPosition(currentPos, y);
    //sprite->setRotationX(rotX);


}


void MainGameScene::update( float dt ){

Size winSize      = Director::getInstance()->getWinSize(); 
 float w           = winSize.width ;
if (currentPos > winSize.width/2){ // IF on right side from middle

currentPos +=  50 * w ;

} else if (currentPos < winSize.width/2 ){ // IF on left side from middle

currentPos -=  50 * w  ;    

}   



sprite->setPosition(currentPos, sprite->getPositionY());

}
#包括“MainGameScene.h”
#包括“MainMenuScene.h”
#包括“GameOverScene.h”
#包括“Constants.h”
使用\u NS\u CC;
场景*MainGameSecene::CreateSecene()
{
//“场景”是一个自动释放对象
自动场景=场景::创建();
//“层”是一个自动释放对象
自动图层=MainGameSecene::create();
自动图层2=MainGameSecene::create();
//将层作为子层添加到场景中
场景->添加子对象(层);
场景->添加子对象(第2层);
//返回现场
返回场景;
}
//在“init”中,您需要初始化实例
bool maingamesence::init()
{
//////////////////////////////
//1.超级初始化优先
如果(!Layer::init())
{
返回false;
}
Size visibleSize=Director::getInstance()->getVisibleSize();
Vec2 origin=Director::getInstance()->getVisibleOrigin();
//现在将精灵放在视口的中间。
sprite=sprite::create(“top.png”);
sprite->setPosition(点(visibleSize.width/2+origin.x,visibleSize.height/3+origin.y));
sprite->setancorpoint(Vec2(0.5,0));
此->添加子对象(精灵);
//加速度计设置在这里。。。
设备::setAccelerometerEnabled(真);
auto-acclistener=EventListenerAcceleration::create(CC_CALLBACK_2(MainGameSecene::onAcceleration,this));
Director::getInstance()->getEventDispatcher()->AddEventListenerWithCeneGraphPriority(acclistener,this);
此->scheduleUpdate();
返回true;
}
void main游戏场景::onAcceleration(cocos2d::加速*acc,cocos2d::事件*Event){
//位置约束
Size-winSize=Director::getInstance()->getWinSize();
float rotX=sprite->getRotation();
float w=winSize.width;
浮动h=winSize.height;
浮动中心=winSize.width/2;
currentPos=sprite->getPositionX();
float y=sprite->getPositionY();
float spriteWidth=sprite->getContentSize().width;
//加速过滤器
浮动灵敏度=0.3;
浮动kFilteringFactor=0.4;
//加速计控制自然运动(游戏循环控制)
浮点加速度=(acc->x*kFilteringFactor)+(加速度*(1.0-kFilteringFactor));
rotX=加速度-acc->x;
currentPos+=acc->x*w*灵敏度;
精灵->设置位置(当前位置,y);
//精灵->设置旋转X(旋转X);
}
void MainGameScene::更新(float dt){
Size-winSize=Director::getInstance()->getWinSize();
float w=winSize.width;
if(currentPos>winSize.width/2){//if位于中间右侧
电流Pos+=50*w;
}else if(currentPossetPosition(currentPos,sprite->getPositionY());
}
通过加速计的播放器移动正常。
我敢肯定,游戏循环中出现了一些问题。任何形式的帮助都将不胜感激。提前谢谢


另外,我正在考虑从cocos2d-x切换到unity。这个决定有希望吗?

问题是您正在突然更新每个帧中精灵的位置,因此精灵在任何位置都不可见。您必须使精灵在某个点停留一段时间或平滑地更新其位置(如使用MoveTo)。这是一个样本。你不应该问解决方案,而应该问如何解决问题

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

    Size visibleSize  = Director::getInstance()->getVisibleSize();
    Vec2 origin        = Director::getInstance()->getVisibleOrigin();

     // this will now place the sprite in the middle of the viewport
sprite = Sprite::create("top.png");
sprite->setPosition(Point( visibleSize.width/2 + origin.x, visibleSize.height/3 + origin.y));
sprite->setAnchorPoint( Vec2( 0.5, 0 ));
this->addChild( sprite );

     //Accelerometer Setup here...
   Device::setAccelerometerEnabled(true);
   auto acclistener = EventListenerAcceleration::create(CC_CALLBACK_2(MainGameScene::onAcceleration, this));
   Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(acclistener, this);

   //this->scheduleUpdate();
schedule(schedule_selector(MainGameScene::gameUpdate),2);
    return true;
}
void MainGameScene::gameUpdate( float dt ){

Size winSize      = Director::getInstance()->getWinSize(); 
 float w           = winSize.width ;
if (currentPos > winSize.width/2){ // IF on right side from middle

currentPos +=  50 * w ;

} else if (currentPos < winSize.width/2 ){ // IF on left side from middle

currentPos -=  50 * w  ;    
float moveDuration=2;//Change this according to difficulty
        sprite->runAction(MoveTo::create(moveDuration, Vec2(currentPos, sprite->getPositionY())));

}  
boolmaingamescene::init()
{
//////////////////////////////
//1.超级初始化优先
如果(!Layer::init())
{
返回false;
}
Size visibleSize=Director::getInstance()->getVisibleSize();
Vec2 origin=Director::getInstance()->getVisibleOrigin();
//现在将精灵放在视口的中间。
sprite=sprite::create(“top.png”);
sprite->setPosition(点(visibleSize.width/2+origin.x,visibleSize.height/3+origin.y));
sprite->setancorpoint(Vec2(0.5,0));
此->添加子对象(精灵);
//加速度计设置在这里。。。
设备::setAccelerometerEnabled(真);
auto-acclistener=EventListenerAcceleration::create(CC_CALLBACK_2(MainGameSecene::onAcceleration,this));
Director::getInstance()->getEventDispatcher()->AddEventListenerWithCeneGraphPriority(acclistener,this);
//此->scheduleUpdate();
时间表(时间表选择器(MainGameSecene::gameUpdate),2);
返回true;
}
void main游戏场景::游戏更新(float dt){
Size-winSize=Director::getInstance()->getWinSize();
float w=winSize.width;
if(currentPos>winSize.width/2){//if位于中间右侧
电流Pos+=50*w;
}else if(currentPosrunAction(MoveTo::create(moveDuration,Vec2(currentPos,sprite->getPositionY()));
}  

你能更准确地说问题出在哪里吗?播放器在X轴(左/右)上移动非常平稳。但通过使用“按更新”方法,我想使其(精灵)不稳定。不稳定的移动必须通过用户输入(加速计)来克服。我在更新方法中遇到了一个问题。我不确定我是否使用了正确的逻辑。但是,当你执行时,你会看到什么问题?或者以何种方式不做你想做的事情?我看到的是,每次更新你都会改变屏幕宽度的x 50倍,所以我认为每次更新时,角色肯定会离开屏幕;)sprite不会自动移动。只在玩家的控制下移动。gameloop不会运行。@Vineet Dude首先,在这里提出问题之前,你应该试着自己调试代码。其次,如果你想JU