01/10/2018, 10:24

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á !!!

Dark.Hades viết 12:39 ngày 01/10/2018

PlayScene::createApple();

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

tran thanh phuc viết 12:35 ngày 01/10/2018

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

tran thanh phuc viết 12:28 ngày 01/10/2018

vẫn ko dk

Dark.Hades viết 12:36 ngày 01/10/2018

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

tran thanh phuc viết 12:26 ngày 01/10/2018

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

Dark.Hades viết 12:39 ngày 01/10/2018

kiểm tra vị trí của táo cũ vs táo mới khác nhau

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.

tran thanh phuc viết 12:32 ngày 01/10/2018

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

Dark.Hades viết 12:31 ngày 01/10/2018

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

auto a = Apple::create();
this->addChild(a);
tran thanh phuc viết 12:32 ngày 01/10/2018

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

Henry viết 12:39 ngày 01/10/2018

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ứ.

Dark.Hades viết 12:29 ngày 01/10/2018

pải dùng hạ sách là khi va chạm thì chỉ cần đổi chỗ táo đi là dc

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.

lx viết 12:34 ngày 01/10/2018

Đú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

tran thanh phuc viết 12:38 ngày 01/10/2018

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

Bài liên quan
0