Hi cả nhà!
Lâu lâu lại lười viết bài, vì thật ra cũng càng ngày càng khó, và project cũng dài nữa nên.... Và mình cũng đang bí ở phần áp dụng Box2D body cho Animation SpriteSheet, và Box2D body cho CocoStudio, Spine. Tìm hiểu mãi mà chưa có cách làm. Bạn nào đã từng code với bản 2.x có đoạn code áp cho 1 trong 3 cái trên thì chia sẻ giúp nhé, cám ơn.
Hôm nay mình tìm được 1 game khá thú vị, đưa lên đây cho mọi người cùng tìm hiểu, code khá đơn giản, chủ yếu là ôn tập lại các kiến thức đã học thôi, không phức tạp lắm đâu. Đó là game Đập chuột ( Whack Hole ).
Trong này có 1 -3 chú chuột chũi nhô lên, thụt xuống ở 3 cái lỗ, nhiệm vụ của bạn là đập vào đầu nó để ghi điểm thôi. Trong Part 1 ngày, chúng ta nghiên cứu những vấn đề sau
+ Thay đổi tỉ lệ màn hình với từng loại thiết bị
+ Dựng Scene
+ Action của Chuột
Thế thôi nhỉ, ta bắt đầu!
B1 - Thay đổi tỉ lệ màn hình theo từng loại thiết bị
Bạn tạo mới Project dapchuot, mở file AppDelegate.cpp ra, thêm vào đoạn code sau, bên dưới lệnh director->setAnimationInterval(1.0 / 60);
// Màn hình thiết bị
Size frameSize = glview->getFrameSize();
auto designSize = Size(512, 384); // Khung hình thiết kế
// Độ phân giải thiết kế
glview->setDesignResolutionSize(designSize.width, designSize.height, ResolutionPolicy::NO_BORDER);
// Vector <string> lưu thông tin đường dẫn Resource
std::vector<std::string> searchPaths;
if (frameSize.height > 480) // Nếu màn hình > 480
{
searchPaths.push_back("hd"); // đường dẫn là ("hd");
Size resourceSize = Size(1024, 768); // Đặt kích thước = 1024,768
// Tăng kích thước content để phù hợp với màn hình
director->setContentScaleFactor(MIN(resourceSize.height/designSize.height,
resourceSize.width/designSize.width));
}
else // Chọn sd< 480px
{
searchPaths.push_back("sd");
}
// Chọn Resource
FileUtils::getInstance()->setSearchPaths(searchPaths);
B2 - Dựng màn chơi
Bạn mở file HelloWorldScene.h, thêm vào đoạn code sau
void HelloWorld::popMole(Sprite *mole)
{
// Lên
auto moveUp = MoveBy::create(0.2f, Point(0, mole->getContentSize().height)); // 1
auto easeMoveUp = EaseInOut::create(moveUp, 3.0f); // 2
auto easeMoveDown = easeMoveUp->reverse(); // 3
auto delay = DelayTime::create(0.5f); // 4
// Thực hiện chuỗi hành động, Lên, đứng đó, Xuống, ko làm gì cả
mole->runAction(Sequence::create(easeMoveUp, delay, easeMoveDown, NULL)); // 5
}
Xong rồi, Build chạy thử xem có ra gì không, ngon rồi!
Vậy là trong bài này chúng ta cùng nhau ôn lại 1 vài kiến thức sau:
+ SpriteSheet
+ Nạp Resource từ file Pvr, plist
+ Vector
+ Action
Đơn giản thế thôi, bài sau chúng ta sẽ thực hiện nốt công việc là, đập chuột, tính điểm.
Dowload Resoucrce, Class
Chào và hẹn gặp lại các bạn ở bài sau!
Bài 27: Học làm game thứ 4 - Game đập chuột ( Part 2)
hôm nay ra 2 tutorial luôn
ReplyDeleteCám ơn nhaaa !!!
ReplyDelete"Bạn dùng phần mềm TexturePacker 3.3.x trong Blog này mình có bài rồi để thực hiện pack nhé" thực hiện pack là sao bạn? mình chỉ thấy bạn có bài "Cách xài chùa phầm mềm TexturePacker 3.3.4 vĩnh viễn"
ReplyDeleteÝ mình là dùng soft đó để tạo ra các file resource như trên. Nén nhiều ảnh đơn thành 1 file, giảm code, giảm time, giảm memory...
DeleteMinh code tren X-code lam theo build ra no bi vay, bi loi gi vay ban oi :3
ReplyDeletehttps://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpa1/t31.0-8/10481933_627532977360641_3465118257947459065_o.jpg
https://scontent-b-mad.xx.fbcdn.net/hphotos-xpf1/t31.0-8/10373132_627532967360642_8821514443640908701_o.jpg
ac, không xài Mac, ko biết lỗi kiểu gì, thử nạp 1 ảnh đơn xem có được ko, không thì phải pack lại ảnh = TexturePacker ( có bản dùng cho Mac ) xem thế nào, có thể tọa độ của 2 loại máy nó khác nhau nên bị thế
DeleteAnh cho em hỏi, cách 1 game cocos2dx nó chạy là như nào vậy ạ? em chỉ biết cop code theo nhưng vẫn chưa hiểu được nó sẽ được bắt đầu chạy từ lớp nào và lần lượt gọi tới các lớp các hàm khác ra sao ạ? Ví dụ như game đập chuột này thì nó bắt đầu chạy từ đâu ạ?
ReplyDeleteFile AppDelegate.h chạy đầu tiên, rồi đến AppDelegate.cpp, Trong file .cpp này, bạn muốn gọi đến tệp nào tiếp theo thì gọi qua Phương thức của lớp. Và lớp đó lại gọi đến các lớp tiếp theo. Sau đó thì tùy bạn tổ chức sự liên kết giữa các lớp thôi. Kiểu của OPP ( LT hướng đối tượng ) nói chung là như vậy.
Deletemình xin phép chia sẻ đoạn code chọn độ phân giải mà mình đọc được trong sách của nhóm Sonar System
ReplyDelete//check which asset the device requires
if(2048==screenSize.width || 2048==screenSize.height)//retina ipad
{
//Pushing back the resolution directories allows the application to fall back to lower-resolution assets if a higher-resolution asset is missing.
resDirOrders.push_back("ipadhd");
resDirOrders.push_back("ipad");
resDirOrders.push_back("iphone5hd");
resDirOrders.push_back("iphonehd");
resDirOrders.push_back("iphone");
//sets the application's size.
//độ phân giải màn hình
glview->setDesignResolutionSize(1536, 2048, ResolutionPolicy::NO_BORDER);
//The resolution policy underlines how the application handles differences in the application's design size and the screen's physical size. We chose no border, which prevents black borders by zooming in. This might crop some of the background, but it provides the best effect. Games such as Candy Crush Saga use this technique.
}
else if(1024==screenSize.width || 1024==screenSize.height)//non retina ipad
{
resDirOrders.push_back("ipad");
resDirOrders.push_back("iphone5hd");
resDirOrders.push_back("iphonehd");
resDirOrders.push_back("iphone");
glview->setDesignResolutionSize(768, 1024, ResolutionPolicy::NO_BORDER);
} //retina iphone: 5, 5s
else if(1136==screenSize.width || 1136==screenSize.height)
{
resDirOrders.push_back("iphone5hd");
resDirOrders.push_back("iphonehd");
resDirOrders.push_back("iphone");
glview->setDesignResolutionSize(640, 1136, ResolutionPolicy::NO_BORDER);
} //retina iphone: 4, 4s
else if(960==screenSize.width || 960==screenSize.height)
{
resDirOrders.push_back("iphonehd");
resDirOrders.push_back("iphone");
glview->setDesignResolutionSize(640, 960, ResolutionPolicy::NO_BORDER);
}
else //non retina and android devices
{
//android devices hat have a hight resolution
if(screenSize.width>1080)
{
resDirOrders.push_back("iphonehd");
resDirOrders.push_back("iphone");
glview->setDesignResolutionSize(640, 960, ResolutionPolicy::NO_BORDER);
}
else//non retina iphone and android devices hat have a lower resolution
{
resDirOrders.push_back("iphone");
glview->setDesignResolutionSize(320, 480, ResolutionPolicy::NO_BORDER);
}
}
game này làm trong vb được không
ReplyDelete