Cocos2d-x 3.2 大富翁游戏项目开发-第二十八部分 游戏保存和载入存档游戏

1、游戏保存

如图,在右下角增加保存图标,点击后进行游戏的保存。



游戏保存采用json格式,具体如下:
{
	"map_level":2,// 游戏关卡
	"gameRoundCount":66,// 游戏回合数
	"players":[  //角色信息
		{
		"playerTag":1,//角色1
		"playerPosition_x":320,//角色所处的x坐标
		"playerPosition_y":192,//角色所处的y坐标
		"restTimes":3,//角色休息回合数
		"stop_x":0,//角色停留的x坐标
		"stop_y":0,//角色停留的y坐标
		"money":509000,//角色资金
		"strength":100,//角色体力
		"comeFromeRow":4,//角色从上一个位置的行
		"comeFromCol":10,//角色从上一个位置的列
		"isMyTurn":false,//角色是否该行走
		"skill":"1-2-2",//角色技能等级
		"lottery":"",//角色购买的彩票号码
		"stocks":[				//角色持有的股票信息
			{"stockCode":800100,"makedealprice":10,"storeNumber":100},{"stockCode":800200,"makedealprice":0,"storeNumber":0},{"stockCode":800300,{"stockCode":800400,"storeNumber":400},{"stockCode":800500,"storeNumber":0}
			]
		},{
		"playerTag":2,//角色2的保存信息,同上
		"playerPosition_x":423.635,"playerPosition_y":96,"restTimes":0,"stop_x":10,"stop_y":13,"money":410300,"strength":80,"comeFromeRow":2,"comeFromCol":15,"isMyTurn":false,"skill":"3-2-1","lottery":"","stocks":[
			{"stockCode":800100,"makedealprice":20,"storeNumber":200},"storeNumber":0}
			]
		}
	],"landlayer":[ //地块的信息,在x行,y列 地块的gid值
		{"x":5,"y":7,"gid":12},{"x":5,"y":12,{"x":6,"y":9,"y":10,"gid":11},{"x":7,"gid":1},"y":13,{"x":8,"y":11,{"x":9,"y":8,{"x":10,"y":6,{"x":11,"gid":13},"gid":15},{"x":12,"gid":14},{"x":13,{"x":14,"gid":10},{"x":15,{"x":16,{"x":17,"gid":10}
		]
}

//在添加go按钮的方法中同时添加保存按钮
void  GameBaseScene::addGoButton()
{
......
    saveMenuItemButton = MenuItemImage::create("map/save_normal.png","map/save_pressed.png",this,menu_selector(GameBaseScene::goButtonCallback));
 
	saveMenuItemButton->setPosition(ccp(winSize.width,0));
	saveMenuItemButton->setAnchorPoint(ccp(1,0));
	saveMenuItemButton->setTag(saveButtonTag);
	menu->addChild(saveMenuItemButton);
}

void GameBaseScene::goButtonCallback(cocos2d::CCObject *pSender)
{
	.........
	//当点击后调用saveGame()方法保存游戏
	if(tag == saveButtonTag)
	{
		if(saveGame())
		{
			CocosToast::createToast(this,LanguageString::getInstance()->getLanguageString(SAVE_SUCESS)->getCString(),TOAST_SHOW_TIME,winSize/2);
		}else
		{
			CocosToast::createToast(this,LanguageString::getInstance()->getLanguageString(SAVE_FAIL)->getCString(),winSize/2);
		}

	}
}


saveGame()进行具体的游戏保存
cocos2dx使用了rapidjson库来替换原来的jsoncpp,我们就用这个cocos2dx自带的json库
//*** 生成 json 文件,存储在 getWritablePath 文件夹下 *** ,当前在proj.win32\Debug.win32目录下

bool GameBaseScene::saveGame()
{
	rapidjson::Document writedoc; //创建Document
	writedoc.SetObject();
	rapidjson::Document::AllocatorType& allocator = writedoc.GetAllocator();
	rapidjson::Value players(rapidjson::kArrayType);//创建players数组
	writedoc.AddMember("map_level",map_level,allocator); //添加map_level属性值
	writedoc.AddMember("gameRoundCount",gameRoundCount,allocator); //添加gameRoundCount回合数

	int playerNumber=1;
	
	rapidjson::Value player1_json(rapidjson::kObjectType); //创建player1的json对象
	rapidjson::Value player2_json(rapidjson::kObjectType); //创建player2的json对象
	rapidjson::Value player3_json(rapidjson::kObjectType); //创建player3的json对象

	//保存各个角色的信息
	for(auto it=players_vector.begin();it!=players_vector.end();it++)
	{
		RicherPlayer* richerPlayer = dynamic_cast<RicherPlayer*>(*it);
		switch(playerNumber)
		{
		case 1:
			{
				//在player1_json对象中添加角色各个属性值,json object 格式 “名称/值” 
				player1_json.AddMember("playerTag",richerPlayer->getTag(),allocator); 
				player1_json.AddMember("playerPosition_x",richerPlayer->getPosition().x,allocator);
				player1_json.AddMember("playerPosition_y",richerPlayer->getPosition().y,allocator);
				 player1_json.AddMember("restTimes",richerPlayer->restTimes,allocator);
				 player1_json.AddMember("stop_x",richerPlayer->stop_x,allocator);
				 player1_json.AddMember("stop_y",richerPlayer->stop_y,allocator);

				 player1_json.AddMember("money",richerPlayer->getMoney(),allocator);
				 player1_json.AddMember("strength",richerPlayer->getStrength(),allocator);

				 player1_json.AddMember("comeFromeRow",richerPlayer->getComeFromeRow(),allocator);
				 player1_json.AddMember("comeFromCol",richerPlayer->getComeFromCol(),allocator);
				 player1_json.AddMember("isMyTurn",richerPlayer->getIsMyTurn(),allocator);

				 player1_json.AddMember("skill",String::createWithFormat("%d-%d-%d",richerPlayer->skill_vector.at(0),richerPlayer->skill_vector.at(1),richerPlayer->skill_vector.at(2))->getCString(),allocator);
		
				 std::string tempstr;
				 tempstr = "";
				 for(auto i=0;i<richerPlayer->lottery_vector.size();i++)
				 {
					 tempstr.append(String::createWithFormat("%02d",richerPlayer->lottery_vector.at(i))->getCString()).append("_");
				  }
				 player1_json.AddMember("lottery",String::createWithFormat("%s",tempstr.c_str())->getCString(),allocator);

				 rapidjson::Value stocks(rapidjson::kArrayType);
				 for(auto i=0;i<richerPlayer->stockMap.size();i++)
				{
					 rapidjson::Value stock(rapidjson::kObjectType);
					 stock.AddMember("stockCode",richerPlayer->stockMap.at(i)->getCode(),allocator);
					 stock.AddMember("makedealprice",richerPlayer->stockMap.at(i)->getMakedealprice(),allocator);
					 stock.AddMember("storeNumber",richerPlayer->stockMap.at(i)->getStoreNumber(),allocator);
					 stocks.PushBack(stock,allocator);
				 }

				 player1_json.AddMember("stocks",stocks,allocator);
				// 将player1_json加入到players数组
				 players.PushBack(player1_json,allocator);
				 break;
			}
		case 2:
			{
				//添加角色2属性值
				 player2_json.AddMember("playerTag",allocator);
				 player2_json.AddMember("playerPosition_x",allocator);
				 player2_json.AddMember("playerPosition_y",allocator);
				 player2_json.AddMember("restTimes",allocator);
				 player2_json.AddMember("stop_x",allocator);
				 player2_json.AddMember("stop_y",allocator);

				 player2_json.AddMember("money",allocator);
				 player2_json.AddMember("strength",allocator);

				 player2_json.AddMember("comeFromeRow",allocator);
				 player2_json.AddMember("comeFromCol",allocator);
				 player2_json.AddMember("isMyTurn",allocator);

				 player2_json.AddMember("skill",allocator);
				
				 std::string tempstr;
				 tempstr = "";
				 for(auto i=0;i<richerPlayer->lottery_vector.size();i++)
				 {
					 tempstr.append(String::createWithFormat("%02d",richerPlayer->lottery_vector.at(i))->getCString()).append("_");
				  }
				 player2_json.AddMember("lottery",allocator);
				 }

				 player2_json.AddMember("stocks",allocator);
				 players.PushBack(player2_json,allocator);
				 break;
			}
		case 3:
			{
			//添加角色3属性值
				 player3_json.AddMember("playerTag",allocator);
				 player3_json.AddMember("playerPosition_x",allocator);
				 player3_json.AddMember("playerPosition_y",allocator);
				 player3_json.AddMember("restTimes",allocator);
				 player3_json.AddMember("stop_x",allocator);
				 player3_json.AddMember("stop_y",allocator);

				 player3_json.AddMember("money",allocator);
				 player3_json.AddMember("strength",allocator);

				 player3_json.AddMember("comeFromeRow",allocator);
				 player3_json.AddMember("comeFromCol",allocator);
				 player3_json.AddMember("isMyTurn",allocator);

				 player3_json.AddMember("skill",richerPlayer->lottery_vector.at(i))->getCString()).append("_");
				  }
				 player3_json.AddMember("lottery",allocator);
				 }

				 player3_json.AddMember("stocks",allocator);
				 players.PushBack(player3_json,allocator);
				 break;
			}


		}


		playerNumber++;
	}
	//将players数组写入到writedoc
	 writedoc.AddMember("players",players,allocator);

	// 保存地块json
	 rapidjson::Value landlayerJson(rapidjson::kArrayType);
	Size _landLayerSize = landLayer->getLayerSize(); 
	for (int j = 0;  j < _landLayerSize.width; j++) {  
		for (int i = 0;  i < _landLayerSize.height; i++) {  
			Sprite* _sp = landLayer->tileAt(Point(j,i));  
			if (_sp) 
			{  
				rapidjson::Value landJson(rapidjson::kObjectType);
				int gid = landLayer->getTileGIDAt(Point(j,i));
				landJson.AddMember("x",j,allocator);
				landJson.AddMember("y",i,allocator);
				landJson.AddMember("gid",gid,allocator);
				landlayerJson.PushBack(landJson,allocator);
			}  

		}  
	}

	writedoc.AddMember("landlayer",landlayerJson,allocator);


	//把json数据保存到path路径文件下,文件名称为saveJsonName ,saveJsonName在SeaScene.cpp中赋值
   StringBuffer buffer;
	  rapidjson::Writer<StringBuffer> writer(buffer);
	  writedoc.Accept(writer);

	  auto path = FileUtils::getInstance()->getWritablePath();
	  path.append(saveJsonName);
	  FILE* file = fopen(path.c_str(),"wb");
	  if(file)
	  {
		fputs(buffer.GetString(),file);
		fclose(file);
	  }
	CCLOG("%s",buffer.GetString());
  return true;

}

2、载入存档

效果如图


//在addMenuSprites()增加载入游戏按钮
void MenuScene:: addMenuSprites()
{
.............
	LabelTTF* loadGameTTF = LabelTTF::create(LanguageString::getInstance()->getLanguageString(LOAD_GAME)->getCString(),FONT_MENU,Btn_FontSize);
	ControlButton* loadGameBtn = ControlButton::create(loadGameTTF,btnNormal4);
	loadGameBtn->setBackgroundSpriteForState(btnPress4,Control::State::SELECTED);

	loadGameBtn->setPosition(ccp(visibleSize.width/2,visibleSize.height-360));
	loadGameBtn->setPreferredSize(Size(Btn_Width,Btn_Height));
	loadGameBtn->addTargetWithActionForControlEvents(this,cccontrol_selector(MenuScene::menuTouchDown),Control::EventType::TOUCH_DOWN);
	loadGameBtn->setTag(Btn_Load_Game_TAG);
	addChild(loadGameBtn);
........
}

//点击后进入到popupLoadGameLayer(),弹出游戏存档的界面
void MenuScene::popupLoadGameLayer()
{
  
    PopupLayer* popDialog = PopupLayer::create(DIALOG_BG);
   
	popDialog->setContentSize(CCSizeMake(Quit_Dialog_Size_Width,winSize.height)); 
    popDialog->setTitle(LanguageString::getInstance()->getLanguageString(LOAD_GAME)->getCString());
    popDialog->setContentText(LanguageString::getInstance()->getLanguageString(DIALOG_CONTENT)->getCString(),20,60,250);
	popDialog->setPopType(LOADGAME);
    popDialog->setCallbackFunc(this,callfuncN_selector(MenuScene::quitButtonCallback));
   
    popDialog->addButton(BUTTON_BG2,BUTTON_BG3,LanguageString::getInstance()->getLanguageString(CANCEL)->getCString(),Btn_Quit_Cancel_TAG);
  
    this->addChild(popDialog);
}

PopupLayer会根据pop类型,调用setLoadGameContext(),创建载入游戏的对话框界面
void PopupLayer::onEnter()
{
......
	case LOADGAME:
		{

			setLoadGameContext(contentSize);
			break;
		}
......
}

//该方法主要是判断path路径下是否有存档文件。如果没有存档,显示无存档,有则显示关卡图片
void PopupLayer::setLoadGameContext(Size size)
{
	Menu* menu = Menu::create();
	menu->setPosition(CCPointZero);  
	//判断是否有夏日海滩的存档文件
	  auto beach_path = FileUtils::getInstance()->getWritablePath();
	  beach_path.append("beach_save.json");
	  FILE* beach_file = fopen(beach_path.c_str(),"r");
	  //有则显示海滩图片,否则显示无存档
	  if(beach_file)
	  {
		beachLoadGameMenuItem = MenuItemImage::create("map/beach_load_normal.png","map/beach_load_pressed.png",menu_selector(PopupLayer::loadGameButtonCallback)); 
		beachLoadGameMenuItem->setPosition(winSize/2+Size(0,120));
		beachLoadGameMenuItem->setTag(save_beach_tag);
		menu->addChild(beachLoadGameMenuItem);
		fclose(beach_file);
	  }else
	  {
		beachLoadGameMenuItem = MenuItemImage::create("map/blank.png","map/blank.png",menu_selector(PopupLayer::loadGameButtonCallback));
		beachLoadGameMenuItem->setPosition(winSize/2+Size(0,120));
		menu->addChild(beachLoadGameMenuItem);
	  }

	//判断是否有海底世界的存档文件
	  auto sea_path = FileUtils::getInstance()->getWritablePath();
	  sea_path.append("sea_save.json");
	  FILE* sea_file = fopen(sea_path.c_str(),"r");
	  if(sea_file)
	  {
		seaLoadGameMenuItem = MenuItemImage::create("map/sea_load_normal.png","map/sea_load_pressed.png",menu_selector(PopupLayer::loadGameButtonCallback)); 
		seaLoadGameMenuItem->setPosition(winSize/2+Size(0,20));
		seaLoadGameMenuItem->setTag(save_sea_tag);
		menu->addChild(seaLoadGameMenuItem);
		fclose(sea_file);
	  }else
	  {
		seaLoadGameMenuItem = MenuItemImage::create("map/blank.png",menu_selector(PopupLayer::loadGameButtonCallback));
		seaLoadGameMenuItem->setPosition(winSize/2+Size(0,20));
		menu->addChild(seaLoadGameMenuItem);
	  }
	//判断是否有空中花园的存档文件
	  auto garden_path = FileUtils::getInstance()->getWritablePath();
	  garden_path.append("garden_save.json");
	  FILE* garden_file = fopen(garden_path.c_str(),"r");
	  if(garden_file)
	  {
		gardenLoadGameMenuItem = MenuItemImage::create("map/garden_load_normal.png","map/garden_load_pressed.png",menu_selector(PopupLayer::loadGameButtonCallback)); 
		gardenLoadGameMenuItem->setPosition(winSize/2+Size(0,-80));
		gardenLoadGameMenuItem->setTag(save_garden_tag);
		menu->addChild(gardenLoadGameMenuItem);
		fclose(garden_file);
	  }else
	  {
		gardenLoadGameMenuItem = MenuItemImage::create("map/blank.png",menu_selector(PopupLayer::loadGameButtonCallback));
		gardenLoadGameMenuItem->setPosition(winSize/2+Size(0,-80));
		menu->addChild(gardenLoadGameMenuItem);
	  }

	addChild(menu);

}

//当点击各个存档文件图片后,载入相应的游戏存档,恢复游戏
void PopupLayer::loadGameButtonCallback(cocos2d::CCObject *pSender)
{
	
	int tag = ((Node*)pSender)->getTag();
	if(tag == save_beach_tag)
	{
		log("beach load");
	}
	if(tag == save_sea_tag)
	{
		//点击海底世界图片,首先进入海底世界关卡
		TransitionFadeBL* scene = 	TransitionFadeBL::create(1,SeaScene::createScene());
		Director::getInstance()->pushScene(scene);
		//然后发送载入游戏的消息
		String * str = String::createWithFormat("%d-%d",MSG_LOAD_GAME_TAG,tag);
		NotificationCenter::getInstance()->postNotification(MSG_LOAD_GAME,str);	

		log("sea load");
	}
	if(tag == save_garden_tag)
	{
		log("garden load");
	}
}

//GameBaseScene收到载入的消息后,调用reloadGame()方法,载入游戏存档
void GameBaseScene::receivedNotificationOMsg(Object* data)
{
........
	case MSG_LOAD_GAME_TAG:
		{
			int map_level = messageVector.at(1)->intValue();
			reloadGame(map_level);			
			break;
		}
.......
}

//开始具体游戏的载入恢复
bool GameBaseScene::reloadGame(int map_level)
{
	//根据关卡,载入相应的存档文件
	auto path = FileUtils::getInstance()->getWritablePath();
	switch(map_level)
	{
	case 1:
		{
			path.append("beach_save.json");
			break;
		}
	case 2:
		{
			path.append("sea_save.json");
			break;
		}
	case 3:
		{
			path.append("garden_save.json");
			break;
		}

	}
	//*** 读取 json 文件 ***
	rapidjson::Document readdoc;
	bool bRet = false;
	ssize_t size = 0;
	std::string load_str;

	// getFileData 如果不指定,读取根目录是 Resource 文件夹
	unsigned char* titlech = FileUtils::getInstance()->getFileData(path,"r",&size);
	load_str = std::string((const char*)titlech,size);


	readdoc.Parse<0>(load_str.c_str());	
	if(readdoc.HasParseError())
	{
		CCLOG("GetParseError%s\n",readdoc.GetParseError());
	}

	if(!readdoc.IsObject())
		return 0;

	//回合数载入
	rapidjson::Value& _gameRoundCount = readdoc["gameRoundCount"];
	gameRoundCount = _gameRoundCount.GetInt();
	refreshRoundDisplay();

	//土地等级载人
	rapidjson::Value& _landlayer = readdoc["landlayer"];
	if(_landlayer.IsArray())
	{
		for(int i=0; i<_landlayer.Capacity(); i++)
		{
			rapidjson::Value& arraydoc = _landlayer[i];

			int x = arraydoc["x"].GetInt();
			CCLOG("x:%d",x);
			int y = arraydoc["y"].GetInt();
			CCLOG("y:%d",y);
			int gid = arraydoc["gid"].GetInt();
			CCLOG("gid:%d",gid);

			landLayer->setTileGID(gid,ccp(x,y));

		}
	}

	//人物信息载人
	rapidjson::Value& _players = readdoc["players"];
	if(_players.IsArray())
	{
		for(int i=0; i<_players.Capacity(); i++)
		{
			rapidjson::Value& arraydoc = _players[i];

			RicherPlayer* _richerPY = players_vector.at(i);

			int _restTimes = arraydoc["restTimes"].GetInt();	
			float _playerPositionX = arraydoc["playerPosition_x"].GetDouble();	
			float _playerPositionY = arraydoc["playerPosition_y"].GetDouble();
			int _stop_x = arraydoc["stop_x"].GetInt();			
			int _stop_y = arraydoc["stop_y"].GetInt();			
			int _money = arraydoc["money"].GetInt();
			int _strength = arraydoc["strength"].GetInt();
			int _comeFromeRow = arraydoc["comeFromeRow"].GetInt();
			int _comeFromCol = arraydoc["comeFromCol"].GetInt();
			bool _isMyTurn = arraydoc["isMyTurn"].GetBool();
			const char* _skill = arraydoc["skill"].GetString();
			const char* _lottery = arraydoc["lottery"].GetString();

			Vector<String*> lotteryVector = Util::splitString(_lottery,"_");
			for(int i=0;i<lotteryVector.size();i++ )
			{
				_richerPY->lottery_vector.push_back(lotteryVector.at(i)->intValue());
			}

			_richerPY->restTimes = _restTimes;
			_richerPY->setPosition(ccp(_playerPositionX,_playerPositionY));
			_richerPY->setComeFromeRow(_comeFromeRow);
			_richerPY->setComeFromCol(_comeFromCol);
			_richerPY->setIsMyTurn(_isMyTurn);
			_richerPY->stop_x = _stop_x;
			_richerPY->stop_y = _stop_y;
			_richerPY->setMoney(_money);
			_richerPY->setStrength(_strength);

			Vector<String*> skillVs = Util::splitString(_skill,"-");
			_richerPY->skill_vector.at(0) = skillVs.at(0)->intValue();
			_richerPY->skill_vector.at(1) = skillVs.at(1)->intValue();
			_richerPY->skill_vector.at(2) = skillVs.at(2)->intValue();
			refreshMoneyLabel(_richerPY,0);
			refreshStrengthLabel(_richerPY,0);

		}
	}

	//股票载入

	for(int i=0; i<players_vector.size(); i++)
	{
		RicherPlayer* _richerPY = players_vector.at(i);

		rapidjson::Value& _stocks = _players[i]["stocks"];
		if(_stocks.IsArray())
		{
			for(int i=0; i<_stocks.Capacity(); i++)
			{
				rapidjson::Value& arraydoc = _stocks[i];
				int _stockCode = arraydoc["stockCode"].GetInt();	
				int _makedealprice = arraydoc["makedealprice"].GetInt();			
				int _storeNumber = arraydoc["storeNumber"].GetInt();	
				_richerPY->stockMap.at(i)->setMakedealprice(_makedealprice);
				_richerPY->stockMap.at(i)->setStoreNumber(_storeNumber);
			}
		}

	}

    return 0;
}


至此,游戏从保存文档中恢复完毕。

点击下载代码 未完待续................

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是