30/09/2018, 17:41

[Cocos2dx] - Hỏi về vấn đề "CCSprite is not using the same texture id"

Chào các anh chị, mình đang làm 1 Game SpaceShip bằng cocos2dx và đang gặp phải 1 vấn đề khó hiểu ở phần Sprite và SpriteBatchNote.

Mình có 1 class MissionScene, trên này mình sẽ tạo 1 phi thuyền (Ship) bằng hàm CCSprite và kết hợp CCSpriteBatchNode, chạy ngon lành. Nhưng sau đó mình tạo 1 class Ship base từ class CCSprite, sau đó trở lại class MissionScene, thay vì tạo Ship từ CCSprite mình tạo Ship từ class Ship, và xảy ra lỗi khi chạy "CCSprite is not using the same texture id"

Đây là đoạn code đầu tiên mình tạo Ship trên MissionScene bằng class CCSprite

void MissionScene::createPlayerShip(){
    
    auto shipBatch = SpriteBatchNode::create("PlayerShip.png", 40);
    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("PlayerShip.plist");
    
    auto ship = Sprite::createWithSpriteFrameName("PlayerShip0.png");

    this->addChild(shipBatch);
    
    shipBatch->addChild(ship);
    
}

Và đây là sau khi mình tách ra 1 class Ship base từ class CCSprite

#include "Ship.h"

using namespace cocos2d::ui;

static bool shipToFrameCache = false;

Ship* Ship::createShip(float startX, float startY){

    if (!shipToFrameCache){
        SpriteFrameCache::getInstance()->addSpriteFramesWithFile("PlayerShip.plist");
        shipToFrameCache = true;
    }

    auto ship = Ship::create();

    ship->setPosition(startX, startY);

    return ship;
}


bool Ship::init(){

    if (!Sprite::init()){
        return false;
    }

    this->createWithSpriteFrameName("PlayerShip0.png");

    return true;
}

Và đây là code mình tạo ship từ class Ship trên:

void MissionScene::createPlayerShip(){

    auto shipBatch = SpriteBatchNode::create("PlayerShip.png", 40);
    auto ship = Ship::createShip(320,-50);

    this->addChild(shipBatch);
    shipBatch->addChild(ship);

}

Sau đó chạy thì xảy ra lỗi ***“CCSprite is not using the same texture id”***. Cách tạo không có gì khác chỉ là mình tách ra 1 class Ship riêng thôi, mà chạy không được. Còn nếu tạo ngay trên class MissionScene thì chạy được…Tại sao nhỉ ?

[SOLVED]
Thêm 1 dòng code trước khi add đối tượng thuộc class Ship vào SpriteBatchNode nhằm buộc nó dùng chung texture với thằng SpriteBatchNode

ship ->setTexture(shipBatch->getTexture());
Mai Anh Dũng viết 19:56 ngày 30/09/2018

Đạt không làm cocos2d-x nhưng cũng thử Google thì thấy câu hỏi này có liên quan:

stackoverflow.com
user1297301

CCSprite is not using the same texture id

cocos2d-iphone, textures, ccsprite
asked by user1297301 on 03:26AM - 15 Jul 12

Hi vọng có thể giúp được.

KuKulKan viết 19:48 ngày 30/09/2018

:D, cám ơn Đạt, mặc dù mình chưa tìm ra được cách giải quyết nhưng cám ơn vì cũng đã nhiệt tình giúp đỡ.

... viết 19:44 ngày 30/09/2018

Có vẻ như câu trả lời của mình không liên quan lắm.

Mình có học sơ sơ về OpenGL/glut, tạo 1 texture sẽ đi kèm với việc tạo 1 ID cho texture đó, buffer trong openGL sẽ lưu giữ texture và mình sẽ thao tác với ID. Dùng cùng texture ở nhiều nơi thì cũng dùng 1 ID đó thôi. Vì thế khi tạo 1 texture thì class nào tạo trước với ID đó rồi thì class khác không thể khởi tạo cùng ID đc (Có thể dùng chung file ảnh nhưng phải khác ID).

KuKulKan viết 19:50 ngày 30/09/2018

Thanks mọi người, mình cũng đã thử với hướng dẫn của @nguyenchiemminhvu bằng cách khời tạo SpriteBatchNode ngay trong class Ship nhưng khi qua class MissionScene tạo 1 ship và add vào Batch của chính nó thì vẫn hiện tượng không dùng chung ID texture.

Mình đã có cách giải quyết tạm thời bằng cách “bắt nó trỏ tới lại texture của thằng batch để buộc nó có cùng 1 texture”

ship ->setTexture(shipBatch->getTexture());

Thực tế thì mình vẫn chưa hiểu tại sao lại có sự nhảy ID texture này.

P/s: Đã edit lại bài viết kèm cách giải quyết hiện tượng này

viết 19:54 ngày 30/09/2018

FrameCache cần được tạo trước khi tạo ra batchNode.

Bài liên quan
0