Cần giúp đỡ về game Snake trên cocos2dx c++

em mới học về cocos2dx bằng c++ và đang thử làm game snake đơn giản nh mà lỗi tùm lum :v ,trong PlayScene chính của game e đặt sự kiện oncontactBegin() để khi rắn va chạm với apple thì sẽ gọi hàm createApple(), nhưng vấn đề là va chạm xảy ra bthg nhưng lại ko tạo dc táo, e đã đặt breakpoint và ktra thấy work rất fine còn thử đặt lời gọi hàm lên update thì kq ra 1 đống táo như bthg
đây là Apple.cpp, class này em kế thừa từ cocos2d::Sprite

 #include "Apple.h"
#include "Definitions.h"
#include <random>
#include <time.h>
USING_NS_CC;
// on "init" you need to initialize your instance
bool Apple::init()
{
	if (!this->initWithFile("apple.png"))
	{
		return false;
	}
	visibleSize = Director::getInstance()->getVisibleSize();
	origin = Director::getInstance()->getVisibleOrigin();
	srand(time(NULL));
	float randomX = random() % (int)visibleSize.width  + origin.x;
	float randomY = random() % (int)visibleSize.height  + origin.y;
	this->setPosition(randomX, randomY);
	_body = PhysicsBody::createBox(this->getContentSize(), PhysicsMaterial(0, 0, 0));
	_body->setDynamic(false);
	_body->setCategoryBitmask(eObjectsBitmask::APPLE);
	//_body->setCollisionBitmask(eObjectsBitmask::HEAD);
	_body->setContactTestBitmask(eObjectsBitmask::HEAD);
	this->setPhysicsBody(_body);
	return true;
}

hàm PlayScene::createApple() :
> void PlayScene::createApple()

    {
    	auto a = Apple::create();
    	this->addChild(a);
    }

còn đây là onContactBegin() :

>   bool PlayScene::onContactBegin(PhysicsContact &contact)
> {
> 	auto a = contact.getShapeA()->getBody();
> 	auto b = contact.getShapeB()->getBody();
> 	if (a->getCategoryBitmask() == eObjectsBitmask::HEAD&&b->getCategoryBitmask() == eObjectsBitmask::APPLE ||
> 		b->getCategoryBitmask() == eObjectsBitmask::HEAD&&a->getCategoryBitmask() == eObjectsBitmask::APPLE)
> 	{
> 		
> 		if (b->getCategoryBitmask() == eObjectsBitmask::APPLE)
> 		{
> 			b->getNode()->removeFromParent();
> 		}
> 		if (a->getCategoryBitmask() == eObjectsBitmask::APPLE)
> 		{
> 			a->getNode()->removeFromParent();
> 		}
> 		score++;
> 		label->setString(String::createWithFormat("%i", score)->getCString());
> 		PlayScene::createApple();
> 	}
> 	return true;
> }

do lần đầu đăng bài nên có thể còn sai sót và trình bày xấu, mong các a sớm giúp bế tắc quá !!!

chỗ này cho thành this->createApple(); xem
Các hàm như Apple::Create() bạn cho static hay sao?

hàm Apple::create mik chỉ kế thừa từ lớp Sprite của cocos2dx thôi

vẫn ko dk :confounded:

bạn cho zIndex (hàm đặt chồng lớp)
bật debug xem lúc sprite táo được tạo thì có thay đổi thông số GL không( thử không xoá táo hiện tại)
duyệt toàn bộ táo trên màn hình xem, có thể nó bị thụt bên dưới scene

cái thông số GL mik ko bk xem nhưng mik đặt breakpoint kiểm tra vị trí của táo cũ vs táo mới khác nhau , với chỗ this->addChild(a) mình sửa thành this->addChild(a,1000) đặt index 1000 rồi mà vẫn ko ra

Hàm nó được gọi thì chắc chắn là có vị trí x,y rồi, nhưng bạn phải xem nó đã được gắn vào Scene chưa, dùng hàm for quét toàn bộ scene xem có thấy kiểu dữ liệu Apple không.

mik ktra rồi scene đúng là có apple mới thật mà khs ko hiện :cry:

Thử cho đoạn này vào ngay dưới code track collision xem sao:

auto a = Apple::create();
this->addChild(a);

tks bn mik fix xong r, pải dùng hạ sách là khi va chạm thì chỉ cần đổi chỗ táo đi là dc :v hơi buồn tí vì ko tìm dc nguyên do lỗi :frowning:

Mình không rành cái này. Nhưng mình thấy bạn phải dùng hạ sách để fix lỗi thì hơi buồn. Bạn làm game chẳng qua là để lấy kinh nghiệm chứ đâu phải bán lấy tiền đâu, và lại deadline cũng không có. Cớ gì bạn phải cố gắng hoàn thành. Phải tìm cho ra để rút kinh nghiệm lần sau chứ.

1 Like

Thực ra đây không hẳn là hạ sách, với game dạng đơn giản này thì đây có khi là thượng sách, nó giúp máy tính không cần tính toán thêm bớt.

Mình không biết bạn sắp xếp các layouts như thế nào và chia lớp ra sao nên không giải quyết triệt để được.

Đúng rồi, việc làm game có rất nhiều thứ chúng ta không thực hiện chính xác, mà chúng ta chỉ cần thực hiện ở mức độ tương đối thôi (vd: mô phỏng mặt nước chưa chắc là chuyển động mặt nước thật sự; hay như LoL có rất nhiều bug do các mẹo code vật thể là minion gây ra).

Miễn game chạy tốt đã là ngon lành rồi. Optimize lại sau

dù sao cx tks mn đã góp ý :smiley:

A post was split to a new topic: Game rắn: cho con rắn đi xuyên tường và xuất hiện ở phía bên kia

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?