如何使用box2d來做碰撞檢測且僅用來_第1頁
如何使用box2d來做碰撞檢測且僅用來_第2頁
如何使用box2d來做碰撞檢測且僅用來_第3頁
如何使用box2d來做碰撞檢測且僅用來_第4頁
如何使用box2d來做碰撞檢測且僅用來_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

屬于:子龍山人首發(fā)于:泰然整理:滔小免責申明(必讀?。罕静┛吞峁┑乃械姆g原稿均來自于互聯(lián)網(wǎng),僅何糾紛,均與本博客所有人、該翻譯稿之人無任何關(guān)系。謝謝合作!原文地址

這并不是說你不能使用box2d提供的強大的碰撞檢測功能!Zwoptex工具來制作它。還會涉box2ddebugdrawingVertexHelper這的果沒有,最好把前面的先看一遍),或者你有相關(guān)經(jīng)驗也可以。的SpritesandSprite然后傳遞一個精靈給它。但是,根據(jù)cocos2d最佳實踐,如果使用spritesheet來做的話,那樣會極大地提高效率。為了指定spritesheet中的每個子的位置,你需要為每個指定一個坐CCSpriteSheet*sheet=[CCSpriteSheetspriteSheetWithFile:CCSpriteSheet*sheet=[CCSpriteSheetspriteSheetWithFile:@"grossini_dance_atlas.jpg"capacity:1];CCSprite*sprite1=[CCSpritespriteWithTexture:sheet.texturerect:CGRectMake(85*0,121*1,85,121)];CCSprite*sprite2=[CCSpritespriteWithTexture:sheet.texturerect:CGRectMake(85*1,121*1,85,121)];CCSprite*sprite3=[CCSpritespriteWithTexture:sheet.textureCGRectMake(CGRectMake(85*2,121*1,85,CCSprite*sprite4=[CCSpritespriteWithTexture:sheet.texturerect:CGRectMake(85*3,121*1,85,121)];單(spritesheet),同時會導出每個子的坐標,這樣你在cocos2d里面使制作精靈注意,這些已經(jīng)被自動地把周圍的空白部分給去掉了。這并不是我擇菜單Modify\UntrimSelectedImages?,F(xiàn)在,的看起來非常好了。點擊Arrange\ComplexbyHeight(no最后,讓把畫布(canvas)的大小調(diào)整為合適的大小。點擊Modify\CanvasWidth,128pxModify\Canvas最后,是時候?qū)С鰏pritesheetFile\Export名字的plist文件。從Spritesheet中添們的精靈Xcode并創(chuàng)建一個新的工程,選擇cocos2d-0.99.1Box2dApplication從彈球的中找到具體的做法。#define#definePTM_RATIO “Copyitemsintodestinationgroup’sfolder(ifneeded)”被復選CCSpriteSheetCCSpriteSheet spritesheet和plist文件。具體--(id)initif((self=[superinit]))//Createourspritesheetandframe_spriteSheet=[[CCSpriteSheetspriteSheetWithFile:@"sprites.jpg"capacity:2]retain];[selfaddChild:_spriteSheet];[self[selfschedule:@selector(secondUpdate:)}return}第一件事情就是創(chuàng)建一個spritesheet然后,使用CCSpriteFrameCache類來加載坐標屬性列表文件。這個函器,每隔一秒調(diào)用一次secondUpdate函數(shù)。接下來,讓實現(xiàn)spawnCar方法。的做法是讓車子地在屏幕中間做路徑為三角形的運動。在init函數(shù)的上面添加下面函數(shù)代碼:--(void)spawnCarCCSprite*car=[CCSpritespriteWithSpriteFrameName:@"car.jpg"];car.position= (100,100);car.tag=[carrunAction:[CCRepeatForeveractionWithAction:[CCSequenceactions:[CCMoveToactionWithDuration:1.0position:(300,100)],[CCMoveToactionWithDuration:1.0position:(200,200)],[CCMoveToactionWithDuration:1.0position:(100,100)],[_spriteSheet}注意,這里創(chuàng)建sprite的時候,不是使用spriteWithFile,而是使用而是把CarSpritesheet的孫子添加進去的。面的spawnCar方法后面添加下面的方法:--(void)spawnCatCGSizewinSize=[CCDirectorCCSprite*cat=[CCSpritespriteWithSpriteFrameName:@"cat.jpg"];intminY=cat.contentSize.height/2;intmaxY=winSize.height-(cat.contentSize.height/2);intrangeY=maxY-minY;intactualY=arc4random()%intstartX=winSize.width+(cat.contentSize.width/2);intendX=-(cat.contentSize.width/2);CGPointstartPos= (startX,actualY);CGPointendPos= (endX,actualY);cat.position=startPos;cat.tag=1;[catrunAction:[CCSequence[CCMoveToactionWithDuration:1.0position:endPos], [_spriteSheet}-{CCSprite*sprite=[_spriteSheetremoveChild:sprite}-{[self譯并運行代碼,如果一切ok,你將會看到一輛車在屏幕上來回動,同時有一只貓從右至左穿過屏幕。接下來,添加一些碰撞檢測的代碼。為這些精靈創(chuàng)建Box2d的和之前的做法差不多。因此,讓首先創(chuàng)建world。打開oWorldScene.h,并在文件頂部添#import#importb2Worldb2Worldb2Vec2b2Vec2gravity=b2Vec2(0.0f,0.0f);booldoSleep=false;_world=newb2World(gravity,因為并不想讓這些對象自動運動,而是人為控制其運動。其次,告訴box2d不能讓這些對象sleep。這一點非常重要,因為是人為地移動對象,--(void)addBoxBodyForSprite:(CCSprite*)spriteb2BodyDefspriteBodyDef.type=b2_dynamicBody;spriteBodyDef.userData=b2Body*spriteBody=_world- b2FixtureDefspriteSh = Def.density=Def.isSensor=spriteBody- }這段代碼對你來說應該比較熟悉了---它和在breakout中是一樣的。然后,這里有一點區(qū)別,把sh 撞反應,那么你就需要把isSensor設置成true。這正是想要的效果![self[self[self[self你的spriteDone方法改寫成下面的形式:--(void)spriteDone:(id)senderCCSprite*sprite=(CCSprite*)sender;b2Body*spriteBody=NULL;for(b2Body*b=_world->GetBodyList();b;b=b-{if(b->GetUserData()!=NULL)CCSprite*curSprite=(CCSprite*)b->GetUserData();if(sprite==curSprite){spriteBody=b;}}}if(spriteBody!=NULL)_world-}[_spriteSheetremoveChild:sprite}[self[self--(void)tick:(ccTime)dt_world->Step(dt,10,for(b2Body*b=_world->GetBodyList();b;b=b-{if(b->GetUserData()!=NULL)CCSprite*sprite=(CCSprite*)b-b2Vec2b2Position=b2Vec2(sprite.position.x/PTM_RATIO,float32b2Angle=-1*b->SetTransform(b2Position,}}}cocos2dbox2dbodydebugBox2DDebug#import#import"GLES-GLESDebugDrawGLESDebugDraw//Enabledebug//Enabledebug_debugDraw=newGLESDebugDraw(PTM_RATIO_world-uint32flags=flags+= _debugDraw-傳遞一個flag來指定需要顯示的仿真細節(jié)---這里只想顯示box2d的 -(-(void){_world-}最后需要注意的一點,在dealloc函數(shù)中添加清理代碼:--(void)deallocdelete_world;[superdealloc];}周的矩形區(qū)域。如果ok話,你會看到這些粉紅shsprite運碰撞檢把MyContactListener.h和MyContactListener.mm兩個文件添加到工程中同時,你還可以我為本制作的美妙的音效。#importMyContactListenerMyContactListener//Createcontact//Createcontact_contactListener=new//Preload[[SimpleAudioEnginesharedEngine]std::vector<b2Body*>toDestroy;std::vector<b2Body*>toDestroy;for(pos=_contactListener->_contacts.begin();pos!=_contactListener->_contac d();++pos){MyContactcontact=b2Body*bodyA=contact.fixtureA->GetBody();b2Body*bodyB=contact.fixtureB-if(bodyA->GetUserData()!=NULL&&bodyB->GetUserData()!={CCSprite*spriteA=(CCSprite*)bodyA->GetUserData();CCSprite*spriteB=(CCSprite*)bodyB->GetUserData();if(spriteA.tag==1&&spriteB.tag=={}elseif(spriteA.tag==2&&spriteB.tag=={}}}std::vector<b2Body*>::iteratorstd::vector<b2Body*>::iteratorfor(pos2=toDestroy.begin();pos2!=toDestroy.end();{b2Body*body=if(body->GetUserData()!=NULL)CCSprite*sprite=(CCSprite*)body->GetUserData();[_spriteSheetremoveChild:spritecleanup:YES];}_world-}if(toDestroy.size()>0)[[SimpleAudioEnginesharedEngine]}[_spriteSheetrelease];調(diào)整sh的邊界你可能已經(jīng)注意到了,的box2dsh的邊界并不是和sprite的邊界些確不行!需要嚴格地定義sh的邊界和精靈的邊界重合在一起。在Box2d里面,你可以通過指定sh 的頂點來指定sh 已經(jīng)開發(fā)出了一個非常方便的工具,叫做VertexHelper,它可以用來非常方便地定義頂點,而且可以導出box2d所需要的格式的數(shù)據(jù)。好了,先去VertexHelper吧。他是一個Mac應用程序,同時包含了源代碼,因此,你只需要打開VertexHelper.xcodeproj,然后編譯并運行就可把編譯好的工程放到Application文件夾下面,以后就直接打開就可以了)2.VertexHelper會自動地把劃分成兩個部分。連接起來,因此,不需要連接它們。形是凸多邊形。這意味著多邊形的沒有一個角大于180度。或者說是,多邊形內(nèi)任何兩個頂點的連線都在多邊形的。如果你對這個定義不是很清楚的box2db2_maxPolygonVerticessh最8b2Settings.h中把這個值改掉。但是,這個中,只需要8個頂點就夠了。一旦你做完之后,在下拉列表中選擇Box2d,Style選擇好,讓把工程中的sh 后修改addBoxBodyForSprite

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論