Với những ai mới bắt đầu lập trình games 2D sẽ có câu hỏi: "Làm thế nào để lưu lại điểm số cao nhất". Điều này tương đối khó khăn vì khi khởi động lại game, tất cả giá trị sẽ được đặt về giá trị ban đầu.
Userdefault
UserDefault
được Cocos2d-x xây dựng, giúp cho người lập trình có thể lưu 1 giá trị dữ liệu với 1 key
tương ứng trong .xml, các giá trị đi với key
đó vẫn tồn tại ngay cả khi game khởi động lại sau khi thoát ra.
Hiện thực
Khởi tạo dự án Cocos2d-x, trong HelloWorldScene.cpp thêm đoạn mã sau ở phần đầu của file
const char *HIGH_SCORE = "key";
Trong phương thức HelloWorldScene::init()
thêm đoạn mã sau:
auto def = UserDefault::sharedUserDefault(); def->setIntegerForKey(HIGH_SCORE, 2000); def->flush();
Giải thích
- Dòng 1: khởi tạo
def
là 1 con trỏ kiểuUserDefault
và nó sẽ giúp truy cập vào tất cả các phương pháp trong lớp đó,setIntegerForKey(...)
là phương pháp đặt giá trị số nguyên tương ứng vớichar*
, các key luôn luôn là kiểuchar*
. - Dòng 3:
def->flush()
có chức năng xóa các nội dung file xml, về cơ bản lưu dữ liệu vào các file xml.
Để lấy giá trị, dùng phương thức getIntegerForKey(...)
int iHighScore = def->getIntegerForKey(HIGH_SCORE);
Chuyển 1 số nguyên thành 1 chuỗi.
CCString *highScore = CCString::createWithFormat("%i", iHighScore);
Thêm highScore
vào label
.
auto highScoreLabel = Label::createWithTTF(hightScore->getCString(), "fonts/Marker Felt.ttf", 60); highScoreLabel->setColor(Color3B::RED); highScoreLabel->setPosition(Point(200, 200)); this->addChild(highScoreLable, zUI_HUD);
Ngay bây giờ khi chạy project game sẽ thấy giá trị 2000
trên màn hình.
Bây giờ ngưng chạy và comment các dòng như sau:
//def->setIntegerForKey(HIGH_SCORE, 2000); //def->flush();
1 lần nữa khi chạy dự án vẫn còn giá trị 2000 trên màn hình, có nghĩa là HIGH_SCORE
được lưu trữ trong các file xml và giá trị lấy từ nó.
Do đó những thay đổi vẫn tồn tại ngay cả khi những ứng dụng được đóng lại.
- Ngoài dữ liệu với kiểu
int
, có thể lưu trữ dữ liệu với các kiểufloat
,double
,bool
,string
với các phương thức tương ứng:setFloatForKey
,setDoubleForKey
,setBoolForKey
,setStringForKey
. - Với đoạn mã đơn giản bên trên, có thể thêm 1 tiện ích nhỏ trong game, nhờ đó người chơi sẽ có động lực chơi game. Ngoài ra có thể dùng nhiều key để lưu level game, hay là tên người chơi kèm số điểm của họ,có thể lưu số điểm của 3 người chơi cao nhất, ...