參考資料:
這是我改寫的一則繩子,繩子以body小節相連線
不過我還是覺得 verlet rope那種原型方式更加漂亮!
一根繩子被切斷後就這麼憑空消失了,這總讓人覺得有點兒說不過去吧?
於是我便想以body的形式改寫一則更有質感的繩子,
這樣的話,即使在被切斷了之後,兩段「繩子屍體」依然還能飄來盪去~
學到了不少新的東西,例如ccspritebatchnode的正確使用方法~
以前我也用 ccspritebatchnode,但是用的方法不正確
我現在是這麼認識的,ccspritebatchnode載入乙份檔案,
其他的ccsprite都可以來使用這份,直接從記憶體裡面取的,迅速快捷~
如果乙份反覆要在遊戲裡面用到,但是每次都通過 [ccsprite spritewithfile:@"123.png"]的方式來取的話
就會存在每次都要從磁碟介質裡面拿取這份,而讀磁碟是很耗時間的,不管怎麼說,一定比從記憶體讀取慢!
其實很多時候都要權衡利弊,從記憶體裡面讀取資源檔案雖快,但是ios裝置記憶體吃緊
將整個遊戲幾十兆的資源檔案一次性全部載入到記憶體,程式很有可能會被**掉
上次我查了一番加密資源檔案的手法,有一種方式是將資源檔案「打碎成」位元組資料放在標頭檔案裡面
後來我一想,遊戲一執行,那麼裝載標頭檔案裡面的資源檔案肯定在第一時間就會被全部載入到記憶體
快是夠快了,記憶體夠不夠用卻又成問題了~
如防止別人篡改公司logo,就可能將logo置於標頭檔案中~
last,繩子其實還很有待挖掘,今後有時間的話,一定會力爭寫出更真實,更高效的繩子來~
// byrope.h
// goldmine0.6
// created by bruce yang on 12-1-13.
#import
#import"cocos2d.h"
#import"box2d.h"
#import
#define ptm_ratio32
// 繩子小段的高度和寬度~
#define rope_item_width16.0f
#define rope_item_height4.0f
// 繩子 bar 的高度和寬度~
#define rope_bar_diameter8.0f
// 1.是否在繩子的兩個連線點之間啟用距離限定關節~
#define b2_rope_joint_enabled no
// 2.bar body到底是連線在繩子最外側小節的 body 上,還是連線在 comp 元素的 body 上~
#define connected_with_comp_body0 // 緊隨comp
#define connected_with_rope_body1 // 緊隨繩子最外側小節(因為會隨著繩子抖動,所以效果感覺不怎麼樣)~
#define rope_bar_connect_mode0
* added by bruceyang on 2012.01.15.06.22
* 對 box2d b2math.h 做功能擴充(c語言運算子過載的用法)~
* 之所以放在該類裡面而不直接去 box2d原始碼裡面修改,主要還是為了公升級 box2d 庫的時候不出現方法丟失的問題~
* 可想而知,如果這些**是插進 box2d原始碼裡面的話,公升級的時候乙個替換,這些我自己新新增的東西肯定就要丟失了~
inlineb2vec2 operator * (const b2vec2& a, float32 s) ;
[itemsprite.texturesettexparameters:¶ms];
[itemspritesetposition:ccp(midpoint.x*ptm_ratio, midpoint.y*ptm_ratio)];
[itemspritesetrotation:-1 *cc_radians_to_degrees(stickangle)];
[itembatchaddchild:itemsprite];
body->setuserdata(itemsprite);
//建立繩子關節,限定兩物體之間的最大距離(解決了繩子與被連線物體碰撞的問題,這個繩子關節便沒必要建立了)~
if(b2_rope_joint_enabled ==yes) else if(rope_bar_connect_mode ==connected_with_rope_body) ;
[itemsprite.texturesettexparameters:¶ms];
[itemspritesetposition:ccp(midpoint.x*ptm_ratio, midpoint.y*ptm_ratio)];
[itemspritesetrotation:-1 *cc_radians_to_degrees(stickangle)];
[itembatchaddchild:itemsprite];
body->setuserdata(itemsprite);
//建立繩子關節,限定兩物體之間的最大距離(解決了繩子與被連線物體碰撞的問題,這個繩子關節便沒必要建立了)~
if(b2_rope_joint_enabled ==yes) else if(rope_bar_connect_mode ==connected_with_rope_body) {
jd.initialize(b1, firstbd, p1);
world->createjoint(&jd);
jd.initialize(b2, lastbd, p2);
world->createjoint(&jd);
// 3.建立繩子 bar sprite~
cctexture2d *tex2d = barbatch.textureatlas.texture;
cgrect barrect =cgrectmake(0,0, rope_bar_diameter,rope_bar_diameter);
ccsprite *spritea = [ccsprite spritewithtexture:tex2d rect:barrect];
[spriteasetposition:ccp(p1.x*ptm_ratio, p1.y*ptm_ratio)];
[barbatchaddchild:spritea];
b1->setuserdata(spritea);
ccsprite *spriteb = [ccsprite spritewithtexture:tex2d rect:barrect];
[spritebsetposition:ccp(p2.x*ptm_ratio, p2.y*ptm_ratio)];
[barbatchaddchild:spriteb];
b2->setuserdata(spriteb);
returnself;
-(void)dealloc{
[superdealloc];
@end
box2d 碰撞過濾
原帖 碰撞篩選就是乙個防止某些形狀發生碰撞的系統。按照具體需求設定哪些物體跟那些物體發生碰撞,跟哪些物體不發生碰撞。box2d通過種群跟組索引支援碰撞篩選。組索引比較簡單,設定其shapedef的groupindex值即可,例如boxdef.filter.groupindex 1。通過groupin...
Box2D學習筆記
box2d是乙個用於遊戲的2d剛體 庫,程式設計師可以在他們的遊戲裡使用他們,也可以是的自己的物體運動的更可信。讓他看起來更加接近現實。物理引擎是乙個程式性的動畫系統。而不是由動畫師去移動物體。這一切都是建立在牛頓力學的基礎之上。box2d最初是用c 來寫的,之後有被多種語言所實現。box2d中的核...
BOX2d繪製曲線
來自天地會的 wkyjoey同學 問道如何做乙個重力大師遊戲 如下圖 這裡要特意表示一下歉意,最近一直忙於工作,沒有及時更新教程。對於重力大師遊戲 試玩之後,不難發現,我們在執行時可以建立的剛體有兩種,線條剛體和多邊形剛體。今天我們來一起研究一下線條剛體的建立。多邊形剛體會在下次教程中討論。這裡我們...