項(xiàng)目git地址:https://github.com/marco115/NoOneDies.git
前幾篇文章已經(jīng)把邊界框,游戲人物和滑塊的運(yùn)動(dòng)給做出來(lái)了平斩,我們現(xiàn)在就要做游戲的交互
- 負(fù)責(zé)控制對(duì)象邏輯工具類
- 點(diǎn)擊事件的處理
負(fù)責(zé)控制對(duì)象邏輯工具類
主要負(fù)責(zé)實(shí)現(xiàn)滑塊出現(xiàn)邏輯逗堵,添加邊界框和游戲人物,并添加實(shí)現(xiàn)點(diǎn)擊事件
1.1 首先創(chuàng)建一個(gè)GameController頭文件繼承自Ref,同時(shí)聲明了初始化方法和創(chuàng)建方法
<pre>
class GameControll:public Ref
{
private:
float _postion;
Layer * _layer;
Size visiableSize;
int currentIndexFrame;//當(dāng)前幀數(shù)
int nextIndexCount;//下一個(gè)要觸發(fā)這個(gè)事件的幀數(shù)
EdgeBox* edge;
Hero* hero;
private:
void resetFrame();
void addBlock();
public:
//虛函數(shù)
virtual bool init(Layer * layout,float positionY);
static GameControll* create(Layer* layout,float position);
bool hitTestPoint(Vec2 vector);//是否與觸摸點(diǎn)碰撞
void onUserTouch();
void onUpdate(float dt);
};
</pre>
在cpp文件內(nèi)實(shí)現(xiàn)create方法前普,并初始化GameController
1.2 在初始化方法內(nèi),添加邊界框和游戲人物
<pre>
GameControll * GameControll::create(Layer * layout, float position)
{
auto _ins = new GameControll();
_ins->init(layout, position);
_ins->autorelease();
return _ins;
}
bool GameControll::init(Layer * layer, float positionY)
{
_layer = layer;
_postion = positionY;
visiableSize = Director::getInstance()->getVisibleSize();
//添加邊界框
edge = EdgeBox::create();
edge->setContentSize(visiableSize);
edge->setPosition(visiableSize.width / 2, visiableSize.height / 2+ positionY);
edge->setContentSize(visiableSize);
layer->addChild(edge);
//添加人物
std::string roleName = UserDefault::getInstance()->getStringForKey("HeroRoleName");
hero = Hero::create();
hero->setPosition(30, positionY);
hero->setRoleName(roleName);
layer->addChild(hero);
//添加地板
auto ground = Sprite::create();
ground->setColor(Color3B(0, 0,0));
ground->setTextureRect(Rect(0, 0, visiableSize.width, 3));
ground->setPosition(visiableSize.width / 2, 1.5+positionY);
layer->addChild(ground);
resetFrame();
return true;
}
</pre>
之后在Scene內(nèi)添加GameController
<pre>
gcs.insert(0, GameControll::create(this, 0));
</pre>
1.3 設(shè)置滑塊出現(xiàn)的時(shí)機(jī)壹堰,每隔多久出現(xiàn)一塊拭卿,讓滑塊出現(xiàn)后則重置出現(xiàn)邏輯
<pre>
void GameControll::onUpdate(float dt)
{
currentIndexFrame++;
if (currentIndexFrame >= nextIndexCount) {
resetFrame();
addBlock();
}
}
void GameControll::resetFrame()
{
currentIndexFrame = 0;
nextIndexCount = rand()% 120 + 60;
}
</pre>
點(diǎn)擊事件的處理
首先判斷點(diǎn)擊的地方是在邊界框內(nèi),點(diǎn)擊后游戲角色進(jìn)行跳躍
<pre>
bool GameControll::hitTestPoint(cocos2d::Vec2 point) {
bool contain = edge->getBoundingBox().containsPoint(point);
return edge->getBoundingBox().containsPoint(point);
}
void GameControll::onUserTouch() {
hero->getPhysicsBody()->setVelocity(Vec2(0, 400));
}
</pre>
在Scene內(nèi)添加點(diǎn)擊事件監(jiān)聽(tīng)
<pre>
//添加觸摸事件
auto touch = EventListenerTouchOneByOne::create();
touch->onTouchBegan = [this](Touch * t, Event * e) {
for (auto it = gcs.begin(); it != gcs.end(); it++) {
if ((it)->hitTestPoint(t->getLocation())) {
(it)->onUserTouch();
break;
}
}
return false;
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touch, this);
</pre>
添加監(jiān)聽(tīng)器后贱纠,就可以嘗試這點(diǎn)擊邊界框跳動(dòng)了
對(duì)文章有什么優(yōu)化改進(jìn)的地方峻厚,請(qǐng)留言!謝謝大家