[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());
Đạ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:CCSprite is not using the same texture id
Hi vọng có thể giúp được.
: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 đỡ.
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).
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”
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
FrameCache cần được tạo trước khi tạo ra batchNode.