cocos2d x 遊戲創作過程 三 2

2021-08-25 19:42:17 字數 3789 閱讀 6099

這個很難,但是解決了,至少花費了乙個月,甚至翻閱的三角函式,來尋找答案。 最終完成了。炮彈的角度問題,和炮彈的發射點問題。 這兩樣非常重要。

至少對我來說太珍貴了,這幾行**。上一章說到了,骨骼動畫 隨意控制骨骼,可以控制骨骼的角度,自由的變換。而手槍發射的時候是根據你的胳膊的變化來自由調整角度。 那麼問題就來了,如果計算出發射點,是很重要的。 而發射的角度,如果轉化成真實發射的角度。 真實發射的角度是 橫座標,和縱座標。(x,y)之間的比例。 也就是角度轉弧度的問題。

其實他們的關係是。 角度 * ((2* pai)/360),就是弧度了。

而槍口的位置也非常重要,雖然我想了很久計算槍口的位置,但是我覺得還不如在骨骼上加乙個隱藏的骨骼。當旋轉胳膊的時候那條隱藏骨骼也在動。 這樣就少了很多麻煩。

//**的關係是

void basefsm::changetoattack()

b2bodydef bodydef;

bodydef.

type

= b2_dynamicbody;

b2body *body1 = world->createbody(&bodydef);

// spine::skeletonanimation

*f = role->getskeletonanimation();

spbone *bone1 =f->findbone("rear-upper-arm");

spbone *bone3 =f->findbone("rear-upper-arm");

float rotation=bone1->rotation;

//轉換為弧度

float radian = rotation*(2

*3.1415926)/360;

float rotation_x =

20; //轉換為縱座標,橫座標 * tan(弧度)

float rotation_y =

20*tan(radian);

float vo=

20; float rotation1=bone3->rotation;

float radian1 = rotation1*(2

*3.1415926)/360;

float rotation_x1 = vo*-

1;//轉換為縱座標,橫座標 * tan(弧度)

float rotation_y1 = vo*tan(radian1);

g->clear();

//隱藏骨骼

spbone *bone2 =f->findbone("bullet");

spbone *bone4 =f->findbone("bullet");

if(bone2)else

//子彈

//這個是右邊結構。

if(role->getskeletonanimation()->getskeleton()->flipx==

0) //對稱的左邊的結構

else

if(role->getskeletonanimation()->getskeleton()->flipx==-

1)}

然後是設定子彈模組,上邊已經保證了子彈的出彈位置,和出彈方向。 然後需要把子彈的剛體重力取消。 否則就不能以直線打出去了。會形成弧線。落地。 炮彈倒是可以,但是子彈要保證直線。

void basefsm::initbullet(b2body *body,b2vec2 b2vec,b2vec2 b2vec1)
然後就不是問題了。很基礎的問題了。

敵人的問題,應該不是很難的問題,基礎的ai 和 射線檢測上一章就有,現在重要的問題是如何**敵人。由於碰撞檢測類裡邊無法操作 word的問題。網路上大部分都一筆帶過了,所以我想把我的**擺一下。

思路是在碰撞監聽b2contactlistener 裡設定設定兩個 vector 集合,把需要**的精靈和剛體全部放在裡邊

if(spritea->gettag()==39 )

}if(spritea->getname()=="zidan" )

}

主介面中 update 下面進行刪除, 刪除的時候要注意一點,把vector裡邊的記憶體也清空了,vector可以自動擴容,但是不能自動縮小。就算刪除了裡邊的元素也不能縮小。

void gamelayer::update(float dt)

}//sprite是我定義的vector別看錯了。

if(!contactlistener->sprite.empty())

}}

所以需要

//清理乾淨

contactlistener->b2body.clear();

contactlistener->sprite.clear();

//製造乙個什麼都沒有vector 附在vecotor 裡邊,以刪除舊的vector空間。

vector

f; vector

s; contactlistener->b2body.swap(f);

contactlistener->sprite.swap(s);

剛開始還傻傻的以為很簡單,用碰撞檢測去做,但是梯子問題,也是地圖問題,所以射線是必選的。

思路是在主角中發射射線,如果檢測到了梯子,那麼上鍵的作用,就變成向梯子上樓梯,開啟執行緒。 然後整個body進入0重力狀態,按下向上,人就會位移向上走,在梯子附近人會持續檢測,如果射線一直檢測到,那麼人就會0重力在梯子上,如果按左,或者按右,達到射線檢測不到的位置, 開啟的向上爬的執行緒就會關閉,然後人會落下來。

//檢測梯子是否被檢測到。 否則取消執行緒人物直接掉下來。

if(this->ladder)else

//檢測梯子

if(sprite->gettag()==

29) }

}else

}}

至於梯子與頂層的交接點還沒寫好,也沒畫好,估計是射線檢測到了那個交界點然後直接跳到上層。

有點困了,其實資料問題,主要是從 .plist中取出資料,比如人物的初始資料甚至是儲存 人物獲得的資料。然後實體化這些資料。

把.plist中資料取出來放進map 裡邊,然後map中取出資料,再放進實體裡,然後,就可以用這些資料隨控制什麼了,屬性也好,**,也好。速度也好。名稱也好。

具體的**是

auto rolemap = fileutils::getinstance()->getvaluemapfromfile("propertyrole.plist");

//建立物件

propertydata *propertydata = propertydata::create();

propertydata->setid(rolemap[

"id"

].asint());

propertydata->sethp(rolemap

["hp"

].asint());

//這是血條。 血條的控制完全取決於資料的大小。

float hp = propertydata->gethp() * 0.01;

然後就沒有了。 幾個月的成果就這麼少。 然後就是設計劇情,人像,**什麼的。

cocos2d x 遊戲創作過程 二

首先引入乙個類 那就是camera 這個類。最早想嗎,如果不行,自己寫乙個,沒想到當定義到camera這個類的時候,出現紅線。最後發現cocos2d x 竟然有這個類。然後對於camera類進行研究發現。這個類可以解決很多問題。主要應用在3d方面。但是如果2d也可以應用到。建立camera came...

cocos2d x 遊戲創作過程 四

製作乙個可以操控的介面 然後給介面 載入需要的值 從瓦片地圖中獲取需要的屬性。開啟介面關閉介面。如果用cocosstudio的話,可以輕鬆製作乙個,美觀的介面。然後用這張介面載入資料。載入介面的時候用邏輯符號,所對應的ui。載入就可以了,很簡單。void dialoglayer initdialog...

cocos2d x 遊戲優化方案

優化的方案 引擎底層優化 紋理優化 渲染優化 資源快取 記憶體優化.紋理優化 cocos2d x 底層是opengl es實現的。對於圖案片載入的記憶體是2的冪次方。使用的是100 128 會被轉為128 128。如此浪費一定的空間。色深優化 png a8r8g8b8 a1r5g5b5 argb44...