但是……
這真是出人意料…
嗯……怎麼樣?出乎你的意料了吧!當球碰上磚塊之後,磚塊是被彈開,而不是被擊碎?
為了監聽球和磚之間的碰撞,你需要修改球的contacttestbitmask(注意,在 initwithsize 方法中已經有對應的賦值語句了,你只需要在等號右邊在加上乙個 category 常量):
ball.physicsbody.contacttestbitmask = bottomcategory | blockcategory;
在 bottomcategory 和 blockcategory 之間是位運算子or。這會將這兩個類別所對應的二進位制位上都設為1,其他位則為0。
現在,不管是球和地發生碰撞,還是球和磚發生碰撞,都將呼叫委託方法。
接下來需要處理委託訊息。在 didbegincontact: 方法最後加入:
if(firstbody.categorybitmask == ballcategory && secondbody.categorybitmask == blockcategory)
上述**判斷碰撞是否來自於球與磚。如果是,將發生碰撞的磚塊移除。
想必你已經明白位掩碼,尤其是 contacttestbitmask 是怎麼回事了。前面提及,物體還有乙個collisionbitmask 位掩碼。它決定了當兩個物體發生碰撞時,它們能否相互作用(即作用力與反作用力)。例如,它決定了球是被磚塊彈開,還是直接從磚塊上穿過。
如果你想使用 collisionbitmask,可以給球的collisionbitmask 賦值,這樣當磚塊被消滅時,球將直接穿過。
隱含內容: 使用 collisionbitmask
ball.physicsbody.collisionbitmask = paddlecategory
設定 collisionbitmask 為 paddlecategory 表示球會只會和球拍發生相互作用,而不會和磚塊發生相互作用。對於螢幕四邊的籠子,其 collisionbitmask 保持預設值,不賦予任何類別掩碼。
block.physicsbody.collisionbitmask =
0;這一行語句則將磚塊的 collisionbitmask 設定為0。這表示磚塊不會對其他碰撞物體發生作用力。
你是否完成了這個挑戰(指 collisionbitmask 的使用)並嘗到了勝利的滋味?現在也該到讓你在遊戲贏得勝利的時候了:]
在遊戲中獲勝
為了讓玩家能在遊戲中獲勝,在 myscene.m 中加入這個方法:
-(bool
)isgamewon
} return numberofbricks <=0;}
在方法中遍歷遊戲場景中的所有子節點,判斷螢幕中還剩下多少磚塊。對於每個子節點,我們都要檢查它的節點名是否等於 blockcategoryname。如果所有磚塊都被乾掉了,判定玩家獲勝,返回 yes。
回到 didbegincontact:方法,將最終的 todo 行修改為下面的 if 語句:
if([self isgamewon])
這段**呼叫新方法判斷玩家是否獲勝,如是,則在即將顯示的 gameoverscene視窗中告訴玩家已經獲勝。
結束觸控
在你玩遊戲的時候,你可能注意到,小球在被球拍擊中時,有時會非常快有時會非常慢。
通過 myscene.m 的 update: 方法,你可以防止這種速度的變化:
-(void
)update:(cftimeinterval)currenttime
else }
update:方法在重新整理每一幀之前呼叫。之前沒有在 myscene.m 中實現 update: 方法,因此預設將呼叫預設實現。這裡,我們用自己的實現覆蓋了預設實現。首先我們獲取小球物件,檢查它的velocity 屬性,即其運動速度。如果 velocity 很大,則加大球的線性阻尼係數,這樣球就會慢下來。
編譯執行程式,開始遊戲。你會發現一旦球的速度變得太快,就會恢復到正常水平。
注意: 你可能想直接通過改變球的 velocity 來防止球體速度過快,這樣也許你會更容易控制球的運動。這種做法在 box2d 中是禁止的,在 spritekit 中也不提倡。
源**
下一步
很顯然,這個遊戲十分簡單。但你可以從這裡開始,加入許多有趣的東西。比如給磚塊加上生命值,加入不同的磚塊,小球必須擊打多次才能摧毀它們。有的磚塊可以加分,有的則會減分,甚至讓球拍向磚塊發射雷射,一切只取決於你的想象力!
請留下您的建議,希望本教程對你有用。
用rhino做乙個地球
利用全球的地形圖,根據灰度生成高度不一的柱體 將球的uv展開 柱體鋪滿uv,使用曲面流動到球上 準備一張地形圖,這裡隨便找了乙個全球地形圖,有灰度區分高度的最好,顏色的區分的相對的高程不夠真實。開啟rhino,繪製乙個球,將球的uv展開。根據uv的大小繪製乙個面,用於在grasshopper中拾取作...
用html做乙個目錄 用555做乙個高壓發生器
用555做乙個高壓發生器。如圖,ne555為脈衝發生晶元 以此晶元外圍電路為準,頻率約1.7khz,占空比 10 q2為n溝道場效電晶體,q1為npn三極體,t1為高壓線圈。如圖所示 晶元為ne555,為脈衝發生晶元,脈衝頻率由c1 r1和r2來調整。開關管q2為n溝道場效電晶體。r3為場效電晶體的...
用C 做乙個懸浮視窗
用c 做乙個懸浮視窗 含三種移動無標題窗體的辦法 2006年08月24日 星期四 16 36 今天看幾個c 原始碼,再到愚翁專欄 第一步 建立乙個窗體,設定其屬性 this.formborderstyle system.windows.forms.formborderstyle.none this....