欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

cocos2d - 新聞資訊 - 云南小程序開(kāi)發(fā)|云南軟件開(kāi)發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開(kāi)發(fā)/軟件開(kāi)發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 技術(shù)分享 >

cocos2d

發(fā)表時(shí)間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):45

[img]http://img.blog.csdn.net/20150104174030021
     迎接回來(lái),上篇我們講到了物理引擎中重力情況模仿以及主角考拉與地面墻壁的碰撞,信賴大年夜家已經(jīng)對(duì)2D世界的物理模仿有了必定的懂得,如今我們接著講若何讓考拉動(dòng)起來(lái)吧!

     [img]http://img.blog.csdn.net/20150104174527077
讓考拉動(dòng)起來(lái)!
    這里控制考拉移動(dòng)變得異常簡(jiǎn)單,它只有向前和跳兩個(gè)才能(源碼中我加了考拉向后走功能,建議大年夜家本身加幾個(gè)虛擬按鍵來(lái)實(shí)現(xiàn)更非富的功能)如不雅你按著屏幕左半部考拉會(huì)向前走,按住右半部考拉會(huì)跳起來(lái)(原文設(shè)定考拉不會(huì)撤退撤退-_-)。
    我們須要在Player.h里加兩個(gè)成員變量:
    bool _mightAsWellJump; //可以跳躍嗎?
在GameLevelLayer類里加上觸摸,在.h文件里加上:
virtual void registerWithTouchDispatcher();

	void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
	void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
	void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
在GameLevelLayer.cpp的init里加上(加載地圖代碼后)
setTouchEnabled(true);  //設(shè)置可觸摸
然后寫(xiě)注冊(cè)觸摸辦法
void GameLevelLayer::registerWithTouchDispatcher()
{
	CCDirector* pDirector = CCDirector::sharedDirector();
	pDirector->getTouchDispatcher()->addStandardDelegate(this, 0); //注冊(cè)多點(diǎn)觸摸
}
如今,讓我們看看那三個(gè)觸摸事宜吧!
void GameLevelLayer::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
{
	CCSetIterator iter = pTouches->begin();
	for (; iter!=pTouches->end(); iter++)
	{
		CCTouch* pTouch = (CCTouch*)(*iter);
		CCPoint touchLocation = this->convertTouchToNodeSpace(pTouch);  //把touch點(diǎn)地位轉(zhuǎn)換為本地坐標(biāo)
		if (touchLocation.x > 240)   //在屏幕最右邊點(diǎn),就是跳
		{
			_player->bMightAsWellJump = true;
		}
		else 
		{
			_player->bForwardMarch = true;
		}

	}
}

void GameLevelLayer::ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
{
	
	_player->bForwardMarch = false; //松開(kāi)按鍵時(shí),設(shè)置為弗成跳也不是向前狀況
	_player->bMightAsWellJump = false;
}
代碼一目了然,ccTouchesBegan時(shí)根據(jù)玩家按的地位決定了考拉狀況是進(jìn)步照樣跳躍,松開(kāi)按鍵時(shí)將這兩個(gè)狀況變量重置為false。
真正的角色移動(dòng)是在player的update辦法里進(jìn)行的,看代碼:

void Player::update(float delta)
{
	CCPoint gravity = ccp(0.f, -450.f);  //考拉每秒降低450個(gè)單位
	CCPoint gravityStep = ccpMult(gravity, delta); //計(jì)算在重力影響下delta時(shí)光內(nèi)具體降低了若干, 即dt時(shí)光后下落速度為若干

	CCPoint forwardMove = ccp(800.f, 0.f); //進(jìn)步速度,每秒進(jìn)步800.f
	CCPoint forwardStep = ccpMult(forwardMove, delta);   // 1

	this->_velocity = ccpAdd(this->_velocity, gravityStep); //當(dāng)前速度=當(dāng)前速度+重力加快度
	this->_velocity = ccp(this->_velocity.x *0.9f, this->_velocity.y); //2
	
	if (this->bForwardMarch)
	{
		this->_velocity = ccpAdd(this->_velocity, forwardStep); //當(dāng)前速度要加上向前的速度矢量
	}// 3

	CCPoint minMovement = ccp(-120.f, -350.f);
	CCPoint maxMovement = ccp(120.0f, 250.f);
	this->_velocity = ccpClamp(this->_velocity, minMovement, maxMovement); //4

	CCPoint stepVelocity = ccpMult(this->_velocity, delta); //計(jì)算下此速度下主角移動(dòng)了若干

	this->_desiredPosition = ccpAdd(this->getPosition(), stepVelocity); //當(dāng)前期望要去的地位=當(dāng)前地位+當(dāng)前速度
}
讓我們來(lái)具體地看一下新增部分:
  1. 當(dāng)玩家觸摸進(jìn)步的時(shí)刻和重力模仿類似,我們加了一個(gè)向前的推動(dòng)力800.f,處理方法與重力雷同
  2. 第2步橫向速度乘以0.9是模仿摩擦力效不雅,推敲下當(dāng)有向前推力時(shí)玩家會(huì)向前移動(dòng),沒(méi)有了呢?是不是急速停下來(lái)?那樣看起來(lái)太生映了棘所以這里x軸速度每幀乘以0.9就起到了平均減速的效不雅,就像摩擦力一樣
  3. 檢查一下玩家是否按了前,按進(jìn)步時(shí)速度上就要加上向前的推動(dòng)力,就起到了向進(jìn)步的效不雅了
  4. 這一步是調(diào)用了clamp是限制速度前后高低不要太大年夜,給它一個(gè)最大年夜值。之前的那句設(shè)定下落速度最大年夜值可以去掉落了。
好了運(yùn)行一下,我們可以看到我們的主角小考拉如今可以進(jìn)步了!

               [img]http://img.blog.csdn.net/20150104182452187
讓考拉跳起來(lái)!
 跳躍是動(dòng)作游戲里最明顯的一個(gè)特點(diǎn)。我們欲望角色跳的膩滑逼真,如今讓我們來(lái)實(shí)現(xiàn)它。
 到player類的update辦法里,在if(this->_forwardMarch)語(yǔ)句之前加高低面代碼:
if (tilePos.y > (_map->getMapSize().height-1))
{
	this->gameOver(false);
	return NULL;
}
在checkForAndResolveCollisions辦法里有調(diào)用getSurroundingTilesAtPosition辦法,如不雅它返回個(gè)空數(shù)組可就不妙了,所以在checkForAndResolveCollisions也要改一下,在 CCArray* tiles = this->getSurroundingTilesAtPosition(player->getPosition(), _walls);一句之后,加上
CCPoint jumpForce = ccp(0.f, 310.f);

if(this->_mightAsWellJump && this->_onGround)
{
  this->_velocity = ccpAdd(this->_velocity, jumpForce);
}
   只要加一個(gè)向上的力,角色就可以跳起來(lái)了。
    如不雅你止步于此,你會(huì)獲得一個(gè)老式的雅代利式跳躍,即每次跳躍都是雷同的高度,每次你都施給玩家一個(gè)同樣的力,然后等側(cè)重力把你拉回地面來(lái)。
     這么做似乎沒(méi)什么不當(dāng),如不雅你請(qǐng)求不高的話,然則細(xì)心不雅察一下各類風(fēng)行的平臺(tái)游戲,如超等馬里奧,索尼克,洛克人,水上魂斗羅等,似乎玩家可以或許經(jīng)由過(guò)程按鍵的力度來(lái)控制跳躍的高度,達(dá)到更靈活的效不雅。那是怎么做到的呢?
其實(shí)實(shí)現(xiàn)這個(gè)效不雅也很簡(jiǎn)單,所謂玩家按鍵力度不過(guò)就是按鍵時(shí)光的長(zhǎng)久,按的時(shí)光長(zhǎng)也就是施加跳躍力的時(shí)光就長(zhǎng),跳的當(dāng)然高了,半路上榿不雅玩家不給力了,當(dāng)然會(huì)跳到一半掉落鏈子,不過(guò)玩家有種錯(cuò)覺(jué)就是想特點(diǎn)高就使勁按著跳躍鍵,不想跳了松開(kāi)鍵就是-_-
CCPoint jumpForce = ccp(0.f, 310.f);  //向上的跳躍力 玩家一向按著跳躍鍵時(shí)的跳躍力
	float jumpCutOff = 150.f;   //玩家沒(méi)有按住跳躍鍵時(shí)的跳躍力

	if(this->bMightAsWellJump && this->onGround)  //如不雅當(dāng)前玩家按了跳躍鍵并且在地上
	{
		this->_velocity = ccpAdd(this->_velocity, jumpForce); //跳躍就是加上一個(gè)向上的速度
	}
	else if (!this->bMightAsWellJump && this->_velocity.y > jumpCutOff) //玩家沒(méi)有按住跳躍鍵,并且向上的速度已經(jīng)跨越了設(shè)定的值,就限制向上跳躍速度
	{
		this->_velocity = ccp(this->_velocity.x, jumpCutOff);
	}
注釋解釋的很清跋扈,就不多說(shuō)清楚明了。
好了,build一下run下我們的游戲吧,看吧,我們的小考拉可以自由歡騰地高低翻飛了。
    [img]http://img.blog.csdn.net/20150104215042551
跳是跳的很歡了,不過(guò)悲劇的是,它跳到最右邊就彪炳屏幕,看不見(jiàn)了。
來(lái)修改這個(gè)問(wèn)題,這個(gè)問(wèn)題其實(shí)就是視點(diǎn)跟隨,在cocos2dx上有解決這一問(wèn)題的標(biāo)準(zhǔn)算法,貼出代碼:
void GameLevelLayer::setViewpointCenter(cocos2d::CCPoint pos)
{
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();

	//限制角色不克不及跨越半屏
	int x = MAX(pos.x, winSize.width/2);
	int y = MAX(pos.y, winSize.height/2);

	//限制角色不克不及跑出屏幕
	x = MIN(x, (_map->getMapSize().width * _map->getTileSize().width) - winSize.width/2);
	y = MIN(y, (_map->getMapSize().height * _map->getTileSize().height) - winSize.height/2);

	CCPoint actualPosition = ccp(x, y);

	CCPoint centerOfView = ccp(winSize.width/2, winSize.height/2);
	CCPoint viewPoint = ccpSub(centerOfView, actualPosition);
	//設(shè)定一下地圖的地位
	_map->setPosition(viewPoint);
}
     辦法參數(shù)就是玩家考拉當(dāng)前地位。這個(gè)辦法可以不只能閣下跟隨還能高低跟隨主角,異常好用。這個(gè)辦法道理在很多博客都有提到,道理其實(shí)就是地圖在跟玩家做返偏向活動(dòng),大年夜家可以查閱一下其他文┞仿解釋它的道理,不過(guò)我在這里不想再多說(shuō)了,不是一兩句能說(shuō)清,我們只要會(huì)用這個(gè)辦法就行了。
    我們要做的就是在GameLevelLayer類的update辦法里調(diào)用就行了,可以放在update辦法結(jié)尾之前,如下:
    this->setViewpointCenter(_player->getPosition());
    如今build再run一下,這回我們的小考拉再也不會(huì)跑出屏幕外了!


嘗一下受傷的滋味!
在player.cpp的init辦法或在構(gòu)造函數(shù)里把它們?cè)O(shè)置為false
如今我們可以著手做游戲過(guò)關(guān)和GameOver的功能了。
地圖里有個(gè)hazards層,這個(gè)層里放置一些考拉碰上就會(huì)掛的object。其實(shí)本質(zhì)也上碰撞檢測(cè),看代碼:

void GameLevelLayer::handleHazardCollisions(Player* player)
{
	CCArray *tiles = this->getSurroundingTilesAtPosition(player->getPosition(), _hazards);
	CCDictionary* dic = NULL;
	CCObject* obj = NULL;
	float x=0.f; float y = 0.f;
	int gid = 0;
	CCARRAY_FOREACH(tiles, obj)
	{
		dic = (CCDictionary*)obj;
		x = dic->valueForKey("x")->floatValue();
		y = dic->valueForKey("y")->floatValue();
		CCRect tileRect = CCRectMake(x, y, _map->getTileSize().width, _map->getTileSize().height);
		CCRect pRect= player->collisionBoundingBox();

		gid = dic->valueForKey("gid")->intValue();
		if (gid && tileRect.intersectsRect(pRect))  //如不雅有釘刺并且玩家與它產(chǎn)生碰壯了棘gameOver
		{
			this->gameOver(false);
		}
	}
}
代碼看上倒是不是很熟悉呀,你沒(méi)記錯(cuò),其實(shí)就是大年夜checkAndResolveCollisions辦法里拷來(lái)的,只不過(guò)沒(méi)分那么多情況并且處理方法也簡(jiǎn)單了只是調(diào)用了gameOver辦法,gameOver的布爾值參數(shù)為true表示游戲成功,為false就是掉敗
_hazards在GameLevelLayer類也是個(gè)CCTMXLayer* 地圖層類型的成員變量,在詞攀類的init辦法里初始化它:
_hazards = _map->layerNamed("hazards");
學(xué)完此教程后,你可以學(xué)到
剩下我們還能做什么?
然后在update辦法里調(diào)用這個(gè)辦法,如今update辦法是這個(gè)樣子:
void GameLevelLayer::update(float delta)
{
	_player->update(delta);

	this->handleHazardCollisions(_player);
	
	this->checkForAndResolveCollisions(_player);
	this->setViewpointCenter(_player->getPosition());
}
如今實(shí)現(xiàn)gameOver辦法了,當(dāng)玩家跳到harads層里的刺上時(shí),我們會(huì)調(diào)用這個(gè)辦法游戲停止,或者當(dāng)玩家走到終點(diǎn)時(shí),我也會(huì)調(diào)用這個(gè)辦法,這個(gè)辦法會(huì)顯示出一個(gè)restart按鈕,并在屏幕上打印出一些信息,告訴玩家你逝世了或者你贏了之類的-_-
有興趣可到此看看: 橫版格斗游戲源碼
void GameLevelLayer::gameOver(bool bWon)
{
	bGameOver = true;

	CCString* gameText;
	if (bWon)
	{
		gameText = CCString::create("You Won!");
	}
	else
		gameText = CCString::create("You have Died!");

	CCLabelTTF* diedLabel = CCLabelTTF::create(gameText->getCString(), "Marker Felt", 40);
	diedLabel->setPosition(ccp(240, 200));
	CCMoveBy *slideIn = CCMoveBy::create(1.f, ccp(0, 250));
	CCMenuItemImage* replay = CCMenuItemImage::create("replay.png","replay.png","replay.png", this, menu_selector(GameLevelLayer::restartGame));

	CCArray *menuItems = CCArray::create();
	menuItems->addObject(replay);
	CCMenu *menu = CCMenu::create();
	menu->addChild(replay);
	menu->setPosition(ccp(240, -100));

	this->addChild(menu);
	this->addChild(diedLabel);

	menu->runAction(slideIn);
}
辦法開(kāi)首的變量bGameOver也是GameLevelLayer類新定義的一個(gè)成員變量,在init里要初始化為false,此變量表示游戲是否停止。這個(gè)變量感化是你在update辦法里開(kāi)首斷定一下,如不雅bGameOver==true,則直接返回不要做任何事了。如下:
void GameLevelLayer::update(float delta)
{
	if(bGameOver)
		return;

	_player->update(delta);

	this->handleHazardCollisions(_player);
	
	this->checkForAndResolveCollisions(_player);
	this->setViewpointCenter(_player->getPosition());
}
如今你再編譯運(yùn)行,碰上釘板嘗嘗,會(huì)出現(xiàn)杯具性的終局...
[img]http://img.blog.csdn.net/20150104234824031
不要測(cè)驗(yàn)測(cè)驗(yàn)的太多,當(dāng)心動(dòng)物保護(hù)組織會(huì)找上你家門(mén)來(lái)(-_-這就是所謂的美式滑稽嗎?)
修改一個(gè)致命BUG
還記得前面出現(xiàn)過(guò)當(dāng)考拉掉落出地圖出現(xiàn)的工作嗎?在游戲地圖里有些坑我們本意是考拉掉落下卻竽暌刮戲會(huì)停止,但事實(shí)上法度榜樣崩掉落了。凡是帶有TILED地圖的都邑出現(xiàn)如許的問(wèn)題,只要角色走出地圖界線游戲就會(huì)崩掉落,這個(gè)問(wèn)題困擾了很多多少人,也包含我。其實(shí)解決這個(gè)BUG很簡(jiǎn)單,關(guān)鍵在tileGIDAt辦法。
#include "SimpleAudioEngine.h"
此辦法你打開(kāi)源碼實(shí)現(xiàn)就知道,它有個(gè)CCASSERT宏,斷定出地圖就會(huì)拋出異常。本來(lái)嗎此辦法是取地圖上某處tile的gid,你都出地圖了還取什么當(dāng)然要拋異常啦。這里我們就在getSurroundingTilesAtPosition辦法里加個(gè)斷定,留意當(dāng)然要在調(diào)用tileGIDAt辦法之前,不讓考拉出地圖:


if (bGameOver) //可能玩家掉落坑里,就不處理了
	{
		return;
	}
編譯再運(yùn)行,把考拉掉落進(jìn)坑里嘗嘗,發(fā)明法度榜樣不再DOWN了!
Winner!
      這里我們簡(jiǎn)單點(diǎn),只是斷定下考拉向右走了多遠(yuǎn)就取勝
void GameLevelLayer::checkForWin()
{
	if (_player->getPositionX()>3130.0)
	{
		this->gameOver(true);
	}
}
真實(shí)游戲里我們平日在終點(diǎn)放置一個(gè)object,如門(mén)呀城堡小旗什么的,主角碰著就成功了可進(jìn)入下一關(guān),有興趣的本身測(cè)驗(yàn)測(cè)驗(yàn)!
這個(gè)辦法也要放到GameLevelLayer的update辦法里,如下:
void GameLevelLayer::update(float delta)
{
	if(bGameOver)
		return;

	_player->update(delta);

	this->handleHazardCollisions(_player);
	this->checkForWin();
	this->checkForAndResolveCollisions(_player);
	this->setViewpointCenter(_player->getPosition());
}
運(yùn)行一下,走到終點(diǎn)嘗嘗:
[img]http://img.blog.csdn.net/20150105001049297
void GameLevelLayer::gameOver(bool bWon)
{
	if (bGameOver)  //不要反復(fù)調(diào)用 
	{
		return;
	}
	bGameOver = true;
	SimpleAudioEngine::sharedEngine()->playEffect("hurt.wav");
編譯運(yùn)行,試一試你親手制造的帶有音樂(lè)感的游戲吧!
添加音效
在GamelevelLayer的init辦法里加上:
成功了之后沒(méi)有音樂(lè)怎么行,一個(gè)無(wú)聲的世界可真是會(huì)令人掉望呀,來(lái)我們加些音效吧!
在GameLevelLayer.cpp和 player.cpp加上頭文件如下:
   在最后,我們處理下考拉走到終點(diǎn)時(shí)顯示成功的情況。
using namespace CocosDenshion;
SimpleAudioEngine::shareEngine()->playBackgroundMusic("level1.mp3");
在player.cpp里的update辦法里斷定玩家跳的處所加上音效:
if(this->bMightAsWellJump && this->onGround)  //如不雅當(dāng)前玩家按了跳躍鍵并且在地上
	{
		this->_velocity = ccpAdd(this->_velocity, jumpForce); //跳躍就是加上一個(gè)向上的速度
		SimpleAudioEngine::sharedEngine()->playEffect("jump.wav");
	}
在GameLevelLayer.cpp的gameOver辦法里也加上音效:

源碼下載地址:下載
要做的還有什么,角色動(dòng)畫(huà)沒(méi)有吧,此外還有怪物,AI, 關(guān)卡,角色狀況機(jī)等等。這些都在IOS GAME三件套 Platformer Start Kit里,前面說(shuō)過(guò),本教程只是這個(gè)Start Kit的前奏曲,那真正的Platformer game是什么樣的呢?
[img]http://img.blog.csdn.net/20150105003648910

[img]http://img.blog.csdn.net/20150105000307598
[img]http://gd3.alicdn.com/imgextra/i3/39772956/TB2G831bpXXXXXRXpXXXXXXXXXX_!!39772956.jpg
[img]http://gd1.alicdn.com/imgextra/i1/39772956/TB2HL71bpXXXXavXpXXXXXXXXXX_!!39772956.jpg
[img]http://gd4.alicdn.com/imgextra/i4/39772956/TB2DUo5bpXXXXb1XXXXXXXXXXXX_!!39772956.jpg
[img]http://gd2.alicdn.com/imgextra/i2/39772956/TB2MGM9bpXXXXXkXXXXXXXXXXXX_!!39772956.jpg
[img]http://gd4.alicdn.com/imgextra/i4/39772956/TB2.ds5bpXXXXcqXXXXXXXXXXXX_!!39772956.jpg
[img]http://gd3.alicdn.com/imgextra/i3/39772956/TB2RJw6bpXXXXbIXXXXXXXXXXXX_!!39772956.jpg
[img]http://gd1.alicdn.com/imgextra/i1/39772956/TB2o7c0bpXXXXaGXpXXXXXXXXXX_!!39772956.jpg[img]http://gd1.alicdn.com/imgextra/i1/39772956/TB2fuA2bpXXXXXOXpXXXXXXXXXX-39772956.jpg
怎么樣?心動(dòng)了吧,善于版權(quán)問(wèn)題不便在此公開(kāi),有興趣的可到此看看: 橫版平臺(tái)游戲源碼
此外大年夜名鼎鼎的三件套之一橫版格斗游戲 Beat 'Em Up Game Starter Kit 也是異常出色哦!網(wǎng)上公開(kāi)的源碼教程還不到瑯綾擎的二十分之一-_-
[img]http://img.blog.csdn.net/20150105004547469
[img]http://gd4.alicdn.com/imgextra/i4/39772956/TB2EFZ1XVXXXXarXpXXXXXXXXXX_!!39772956.png
    bool _forwardMarch;  //是否向前走
[img]http://gd2.alicdn.com/imgextra/i2/39772956/TB2RcU5XVXXXXbgXXXXXXXXXXXX_!!39772956.png
[img]http://gd1.alicdn.com/imgextra/i1/39772956/TB2RXM2XVXXXXXBXpXXXXXXXXXX_!!39772956.png
[img]http://gd2.alicdn.com/imgextra/i2/39772956/TB2qGA3XVXXXXXmXpXXXXXXXXXX_!!39772956.png[img]http://gd1.alicdn.com/imgextra/i1/39772956/TB2bPA8XVXXXXaaXXXXXXXXXXXX_!!39772956.png[img]http://gd4.alicdn.com/imgextra/i4/39772956/TB2Gy.8XVXXXXafXXXXXXXXXXXX_!!39772956.png
[img]http://gd4.alicdn.com/imgextra/i4/39772956/TB2dTA1XVXXXXXLXpXXXXXXXXXX_!!39772956.png
[img]http://gd4.alicdn.com/imgextra/i4/39772956/TB2lHZ4XVXXXXc5XXXXXXXXXXXX_!!39772956.png











相關(guān)案例查看更多