求助, 关于cocos2dx的深度检测

时间:2023-02-08 16:19:14
我开启了cocos2dx的深度检测,然后加载了一个地图和两个sprite,同时给两个sprite计算和设置了深度值,地图和sprite之间的遮盖没有问题,但是两个sprite之间出现了问题,我不知道为什么 求助, 关于cocos2dx的深度检测
求助, 关于cocos2dx的深度检测
求助, 关于cocos2dx的深度检测
有没有也遇到这个问题的, 或者有大神能帮帮我 求助, 关于cocos2dx的深度检测

4 个解决方案

#1


还真是奇特的现象 哪个版本的sdk?

#2


lz问题能描述清楚一点吗

#3


今天我又测试了下,还是那样
版本是2.2.1
首先在AppDelegate.cpp里面我开启了深度缓冲
CCDirector::sharedDirector()->setDepthTest(true);
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);

然后在HelloWorldScene.cpp里面加入了一个层
TestLayer *testLayer = TestLayer::create();
this->addChild(testLayer);

在这个层的init函数里面我创建了一个地图和两个精灵并且把它们加入到这个层里面
CCTMXTiledMap *map = CCTMXTiledMap::create("orthogonal-test-vertexz.tmx");
    addChild(map, 0);

sprite1 = CCSprite::create("player.png");
sprite1->setAnchorPoint(ccp(0, 0));
sprite1->setPosition(ccp(0, 81));
sprite1->retain();
addChild(sprite1);

sprite = CCSprite::create("enemy.png");
sprite->setAnchorPoint(ccp(0, 0));
sprite->setPosition(ccp(0, -50));
    sprite->retain();
addChild(sprite);

    CCActionInterval* move = CCMoveBy::create(1, ccp(0,200));
    CCActionInterval* back = move->reverse();
    CCSequence* seq = CCSequence::create(move, back,NULL);
    sprite->runAction( CCRepeatForever::create(seq));


然后我开启了这个层的update并在update里面更新这两个精灵的深度想看下效果
schedule( schedule_selector(TestLayer::update));


void TestLayer::update(float dt)
{

CCPoint p = sprite->getPosition();
    p = CC_POINT_POINTS_TO_PIXELS(p);
    sprite->setVertexZ( -(p.y + 81) / 81 );

p = sprite1->getPosition();
    p = CC_POINT_POINTS_TO_PIXELS(p);
sprite1->setVertexZ(-(p.y + 81) / 81);

CCLayer::update(dt);
}

求助, 关于cocos2dx的深度检测

#4


问题已解决, 应该是深度缓冲和z-order冲突的问题, 在更改深度的时候相应的还要改z-order的值。 要确保深度计算正确的情况下,覆盖者的z-order值要大于被覆盖者的z-order值。这样就不会出现那种透明部分奇怪的情况。

#1


还真是奇特的现象 哪个版本的sdk?

#2


lz问题能描述清楚一点吗

#3


今天我又测试了下,还是那样
版本是2.2.1
首先在AppDelegate.cpp里面我开启了深度缓冲
CCDirector::sharedDirector()->setDepthTest(true);
CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);

然后在HelloWorldScene.cpp里面加入了一个层
TestLayer *testLayer = TestLayer::create();
this->addChild(testLayer);

在这个层的init函数里面我创建了一个地图和两个精灵并且把它们加入到这个层里面
CCTMXTiledMap *map = CCTMXTiledMap::create("orthogonal-test-vertexz.tmx");
    addChild(map, 0);

sprite1 = CCSprite::create("player.png");
sprite1->setAnchorPoint(ccp(0, 0));
sprite1->setPosition(ccp(0, 81));
sprite1->retain();
addChild(sprite1);

sprite = CCSprite::create("enemy.png");
sprite->setAnchorPoint(ccp(0, 0));
sprite->setPosition(ccp(0, -50));
    sprite->retain();
addChild(sprite);

    CCActionInterval* move = CCMoveBy::create(1, ccp(0,200));
    CCActionInterval* back = move->reverse();
    CCSequence* seq = CCSequence::create(move, back,NULL);
    sprite->runAction( CCRepeatForever::create(seq));


然后我开启了这个层的update并在update里面更新这两个精灵的深度想看下效果
schedule( schedule_selector(TestLayer::update));


void TestLayer::update(float dt)
{

CCPoint p = sprite->getPosition();
    p = CC_POINT_POINTS_TO_PIXELS(p);
    sprite->setVertexZ( -(p.y + 81) / 81 );

p = sprite1->getPosition();
    p = CC_POINT_POINTS_TO_PIXELS(p);
sprite1->setVertexZ(-(p.y + 81) / 81);

CCLayer::update(dt);
}

求助, 关于cocos2dx的深度检测

#4


问题已解决, 应该是深度缓冲和z-order冲突的问题, 在更改深度的时候相应的还要改z-order的值。 要确保深度计算正确的情况下,覆盖者的z-order值要大于被覆盖者的z-order值。这样就不会出现那种透明部分奇怪的情况。