推箱子游戏是一个经典的益智游戏,使用Cocos2d-x引擎和C++语言来实现是一个很好的选择。下面是一个简单的推箱子游戏的示例代码,你可以在Visual Studio中使用Cocos2d-x创建一个新项目,并将以下代码添加到项目中。
```cpp
#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
// 添加推箱子游戏的相关函数声明
void initMap();
bool isBox(Vec2 pos);
bool isTarget(Vec2 pos);
bool canMove(Vec2 pos);
void moveBox(Vec2 from, Vec2 to);
bool checkWin();
void restartGame();
TMXTiledMap* _tileMap;
TMXLayer* _background;
TMXLayer* _meta;
TMXLayer* _boxLayer;
TMXLayer* _targetLayer;
Sprite* _player;
Vector<Sprite*> _boxes;
};
Scene* HelloWorld::createScene()
{
auto scene = Scene::create();
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}
bool HelloWorld::init()
{
if (!Layer::init())
{
return false;
}
_tileMap = TMXTiledMap::create("map.tmx");
_background = _tileMap->getLayer("Background");
_meta = _tileMap->getLayer("Meta");
_boxLayer = _tileMap->getLayer("Box");
_targetLayer = _tileMap->getLayer("Target");
_player = Sprite::create("player.png");
_player->setPosition(Vec2(64, 64));
addChild(_tileMap, 0);
addChild(_player, 1);
initMap();
auto listener = EventListenerKeyboard::create();
listener->onKeyPressed = [=](EventKeyboard::KeyCode keyCode, Event* event) {
Vec2 moveDir;
switch (keyCode) {
case EventKeyboard::KeyCode::KEY_UP_ARROW:
moveDir = Vec2(0, 1);
break;
case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
moveDir = Vec2(0, -1);
break;
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
moveDir = Vec2(-1, 0);
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
moveDir = Vec2(1, 0);
break;
default:
break;
}
Vec2 nextPos = _player->getPosition() + moveDir * _tileMap->getTileSize();
if (canMove(nextPos)) {
_player->setPosition(nextPos);
for (auto box : _boxes) {
if (box->getPosition() == nextPos) {
moveBox(box->getPosition(), box->getPosition() + moveDir * _tileMap->getTileSize());
}
}
if (checkWin()) {
// You win
restartGame();
}
}
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
return true;
}
void HelloWorld::initMap()
{
for (int i = 0; i < _boxLayer->getLayerSize().width; i++) {
for (int j = 0; j < _boxLayer->getLayerSize().height; j++) {
Vec2 pos(i * _tileMap->getTileSize().width, j * _tileMap->getTileSize().height);
if (isBox(pos)) {
Sprite* box = Sprite::create("box.png");
box->setPosition(pos);
addChild(box, 1);
_boxes.pushBack(box);
}
}
}
}
bool HelloWorld::isBox(Vec2 pos)
{
int tileGid = _boxLayer->getTileGIDAt(pos / _tileMap->getTileSize());
if (tileGid) {
return true;
}
return false;
}
bool HelloWorld::isTarget(Vec2 pos)
{
int tileGid = _targetLayer->getTileGIDAt(pos / _tileMap->getTileSize());
if (tileGid) {
return true;
}
return false;
}
bool HelloWorld::canMove(Vec2 pos)
{
if (pos.x < 0 || pos.x >= _tileMap->getMapSize().width * _tileMap->getTileSize().width ||
pos.y < 0 || pos.y >= _tileMap->getMapSize().height * _tileMap->getTileSize().height) {
return false;
}
int tileGid = _meta->getTileGIDAt(pos / _tileMap->getTileSize());
if (tileGid) {
return false;
}
for (auto box : _boxes) {
if (box->getPosition() == pos) {
Vec2 nextBoxPos = box->getPosition() + (pos - _player->getPosition());
if (canMove(nextBoxPos) && !isBox(nextBoxPos)) {
return true;
}
return false;
}
}
return true;
}
void HelloWorld::moveBox(Vec2 from, Vec2 to)
{
for (auto box : _boxes) {
if (box->getPosition() == from) {
box->setPosition(to);
break;
}
}
}
bool HelloWorld::checkWin()
{
for (auto box : _boxes) {
if (!isTarget(box->getPosition())) {
return false;
}
}
return true;
}
void HelloWorld::restartGame()
{
// Reset player position
_player->setPosition(Vec2(64, 64));
// Reset box positions
for (auto box : _boxes) {
box->removeFromParent();
}
_boxes.clear();
initMap();
}
void HelloWorld::menuCloseCallback(Ref* pSender)
{
Director::getInstance()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
int main()
{
// create the application instance
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if (!glview) {
glview = GLViewImpl::create("My Game");
director->setOpenGLView(glview);
}
// Set the design resolution
glview->setDesignResolutionSize(480, 320, ResolutionPolicy::NO_BORDER);
// turn on display FPS
director->setDisplayStats(true);
// create a scene. it's an autorelease object
auto scene = HelloWorld::createScene();
// run
director->runWithScene(scene);
return 0;
}
```
这个代码创建了一个简单的推箱子游戏,使用了TMXTiledMap来加载地图,精灵来表示玩家和箱
基于Cocos2d-x引擎在VS上写推箱子的游戏
最新推荐文章于 2024-06-13 11:24:43 发布