Cocos2d-x 3.2 大富翁遊戲項目開發-第七部分 獲取角色路徑_2

在編寫獲取路徑方法前,我們先把角色需要的動畫文件加載進來,角色的文件爲png 和 plist格式。

player1_anim.png.plist             player1_anim.png  

player2_anim.png.plist             player2_anim.png

plist分別記錄了每張圖在整張png圖中的位置 大小,我們只要知道每張小圖名稱即可從整張png圖中截取出想要的小圖。

player1_anim.png圖片爲


 

player2_anim.png圖片爲



圖片表示方法相同,每四張表示一個方向


我們在GameBaseScene中添加角色:

1、 首先定義addPlayerAnimation()方法,這個方法主要是加載動畫文件到內存 並創建角色需要的上下左右四個方向的動畫

void GameBaseScene::addPlayerAnimation()
{
        //創建player1的幀緩存,並加載player1的動畫圖片到緩存
	player1_spriteFrameCache = SpriteFrameCache::getInstance();
	player1_spriteFrameCache->addSpriteFramesWithFile("map/player1_anim.plist","map/player1_anim.png");

       //創建player2的幀緩存,並加載player2的動畫圖片到緩存
	player2_spriteFrameCache = SpriteFrameCache::getInstance();
	player2_spriteFrameCache->addSpriteFramesWithFile("map/player2_anim.plist","map/player2_anim.png");

	//創建player1的上下左右四個方向的Vector 
	Vector<SpriteFrame*> player1_anim_left_vector ;
	Vector<SpriteFrame*> player1_anim_right_vector;
	Vector<SpriteFrame*> player1_anim_down_vector;
	Vector<SpriteFrame*> player1_anim_up_vector;

	//創建player2的上下左右四個方向的Vector
	Vector<SpriteFrame*> player2_anim_left_vector;
	Vector<SpriteFrame*> player2_anim_right_vector;
	Vector<SpriteFrame*> player2_anim_down_vector;
	Vector<SpriteFrame*> player2_anim_up_vector;}
        //定義name數組
	char name[20];
	memset(name, 0, 20);

	//第1-4張圖片是表示向左的動畫,把這四張圖片從緩存中取出,分別保存到相應角色的vector中
	for (int i=1; i<=4; i++) 
	{
		sprintf(name, "player1_anim_%02d.png",i);
		player1_anim_left_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));

		sprintf(name, "player2_anim_%02d.png",i);
		player2_anim_left_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
	}
	//第5-8張圖片是表示向右的動畫
	for (int i=5; i<=8; i++) 
	{
		sprintf(name, "player1_anim_%02d.png",i);
		player1_anim_right_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));

		sprintf(name, "player2_anim_%02d.png",i);
		player2_anim_right_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
	}
	//第9-12張圖片是表示向下的動畫
	for (int i=9; i<=12; i++) 
	{
		sprintf(name, "player1_anim_%02d.png",i);
		player1_anim_down_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
		sprintf(name, "player2_anim_%02d.png",i);
		player2_anim_down_vector.pushBack(player2_spriteFrameCache->getSpriteFrameByName(name));
	}
	//第13-16張圖片是表示向上的動畫
	for (int i=13; i<=16; i++) 
	{
		sprintf(name, "player1_anim_%02d.png",i);
		player1_anim_up_vector.pushBack(player1_spriteFrameCache->getSpriteFrameByName(name));
		sprintf(name, "player2_anim_%02d.png",i);
	}

<span style="white-space:pre">	</span>//根據角色的上下左右四個vector 創建四個方向的動作
	Animation * player1_animation_left = Animation::createWithSpriteFrames(player1_anim_left_vector,0.1f);
	Animation * player1_animation_right = Animation::createWithSpriteFrames(player1_anim_right_vector,0.1f);
	Animation * player1_animation_down = Animation::createWithSpriteFrames(player1_anim_down_vector,0.1f);
	Animation * player1_animation_up = Animation::createWithSpriteFrames(player1_anim_up_vector,0.1f);


	Animation * player2_animation_left = Animation::createWithSpriteFrames(player2_anim_left_vector,0.1f);
	Animation * player2_animation_right = Animation::createWithSpriteFrames(player2_anim_right_vector,0.1f);
	Animation * player2_animation_down = Animation::createWithSpriteFrames(player2_anim_down_vector,0.1f);
	Animation * player2_animation_up = Animation::createWithSpriteFrames(player2_anim_up_vector,0.1f);

	///根據角色的上下左右四個動作  創建四個方向的動畫
	player1_animate_left = Animate::create(player1_animation_left);
	player1_animate_right = Animate::create(player1_animation_right);
	player1_animate_down = Animate::create(player1_animation_down);
	player1_animate_up = Animate::create(player1_animation_up);


	player2_animate_left = Animate::create(player2_animation_left);
	player2_animate_right = Animate::create(player2_animation_right);
	player2_animate_down = Animate::create(player2_animation_down);
	player2_animate_up = Animate::create(player2_animation_up);

}

2、 創建完角色需要的文件後,還需要角色在地圖的位置,由於能走的路徑都在way圖層中,在setWayPassToGrid()方法中,我們把way圖層中sprite的座標保存到wayLayerPass_vector中,這樣就可以根據其中的座標設置角色的位置了

void  GameBaseScene::setWayPassToGrid()
{
	TMXLayer* wayLayer = _map->layerNamed("way");


	Size _mapSize = wayLayer->getLayerSize(); 
	for (int j = 0;  j < _mapSize.width; j++) {  
		for (int i = 0;  i < _mapSize.height; i++) {  
			Sprite* _sp = wayLayer->tileAt(Point(j, i));  
			if (_sp) 
			{  
				float x = _sp->getPositionX();
				float y = _sp->getPositionY();
				int col = x/tiledWidth;
				int row = y/tiledHeight;
				canPassGrid[row][col] = true;
				//取得該位置的座標,保存到對象wayLayerPass_vector中
				Vec2 p = _sp->getPosition();
				wayLayerPass_vector.push_back(p);
				log("canPassGrid row=  %d ,col =%d ,canpass = %d" ,row,col,canPassGrid[row][col]);
			}  

		}  
	}  
	log("setWayPassToGrid finished");
}

3、 添加的角色我們先封裝成一個RicherPlayer類,該類記錄角色的信息,包括角色名稱、資金、體力、敵友


RicherPlayer* RicherPlayer::create(char* name,SpriteFrame* spriteFrame,bool enemy,int money,int strength)
{
	RicherPlayer* player = new RicherPlayer();
	player->init(name,spriteFrame, enemy,money,strength);
	player->autorelease();
	return player;

}


bool RicherPlayer::init(char* name,SpriteFrame* spriteFrame,bool enemy,int money,int strength)
{

	Sprite::initWithSpriteFrame(spriteFrame);
	_name = name;
	_enemy = enemy;
	_money = money;
	_strength = strength;
	return true;
}

4、接下來在addPlayer()方法中,從容器wayLayerPass_vector中隨機取出座標,進行角色的添加。

void GameBaseScene:: addPlayer()
{
	//指定隨機數種子,隨機數依據這個種子產生 採用當前時間生成隨機種子:
	struct timeval now; 
	gettimeofday(&now, NULL); //計算時間種子
	unsigned rand_seed = (unsigned)(now.tv_sec*1000 + now.tv_usec/1000);     // 初始化隨機數   
	srand(rand_seed);

	//從幀緩存圖片中取第一張,做爲角色的初始圖片
	SpriteFrame* spf1 = player1_spriteFrameCache->getSpriteFrameByName("player1_anim_01.png");
	player1 = RicherPlayer::create("player1",spf1,false);
	//根據wayLayerPass_vector的座標數量,取得隨機的一個id
	int _rand1 = rand()%(wayLayerPass_vector.size()); 
	log("rand %d" ,_rand1);
	//根據id,取出其中的座標
	Vec2 vec2ForPlayer1 = wayLayerPass_vector.at(_rand1);
	//這個我們給縱向位置添加一個tiledHeight高度,目的是爲了讓角色居中顯示在道路中
	vec2ForPlayer1.y +=tiledHeight; 
	//設置角色的位置,以及錨點
	player1->setPosition(vec2ForPlayer1);
	player1->setAnchorPoint(ccp(0,0.5));
	//log 相關
	int col = vec2ForPlayer1.x/tiledWidth;
	int row = vec2ForPlayer1.y/tiledHeight;
	log("player1 position row=  %d ,col = %d" ,row,col);
	log("player1 position x=  %f ,y = %f" , vec2ForPlayer1.x, vec2ForPlayer1.y);
	//添加角色到地圖場景
	addChild(player1);

	角色2的添加同角色1方法相同,不再累述
	…………………

}

測試ok 已經可以看到2個角色了




未完待續.......................


差點忘了代碼 

點擊下載代碼     http://download.csdn.net/detail/lideguo1979/8281909

發佈了77 篇原創文章 · 獲贊 48 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章