2011-12-17 29 views
1

使用Cocos2D創建射擊發射子彈地獄風格的遊戲。 一根手指拖動船隻,角落裏有火層。吃一個開始在一層,並防止ccMoved調用(或touchesMoved)的觸摸

從我的主層,我檢測ccTouchesBegan,ccTouchesMoved和ccTouchesEnded。我將一個CGPoint傳遞給我的邏輯控制器。

如果觸摸點位於2個「火災按鈕」圖層之一內,則觸發火災事件。否則,我爲玩家船舶設置了一個新的位置。當觸摸移動到消防層區域外時,我爲玩家船舶設置了新的位置。

問題:由於「觸摸移動設置玩家位置」規則,將手指從發射層內拖入非發射層空間導致船隻跳到該點。

我該如何設計這更好?也許我需要一個「觸摸對象」的數組,並且在穿越消防層的邊界時使它們無效。我覺得我錯過了一些關於觸摸處理的重要概念,如果能夠理解的話,就會給予我想要的控制權,而不必破解一個「觸摸對象」類,它可以比較您點擊哪個位置的位置。

請指教。謝謝!

(是的,我看到:How do I limit touch handling to one layer when layers overlap?。這並不回答我的問題。rectContainsPoint是我如何確定觸摸是在火災層之內還是火之外)。

回答

1

您可以在觸摸中設置一個標誌(BOOL ivar)以指示觸摸開始於火災區域,並且如果此標誌已設置,請不要移動該船?你會重新設置它在touchesEnded。

這聽起來太簡單了,所以我可能錯過了一些東西。

我確實是。爲了處理多點觸摸,你需要一個陣列,就像你在問題中猜測的那樣 - 觸摸開始時,如果觸摸在火焰區域,將它添加到陣列,然後不允許該接觸隨後移動船隻。觸摸刪除結束。除了UITouch文檔中的這個註釋之外,我沒有看到任何錯誤或黑客行爲:

UITouch對象在整個多點觸摸序列中是持久的。處理事件時,不應保留UITouch對象。如果您需要保存從一個階段到另一個階段的觸摸信息,則應該從UITouch對象複製該信息。

但持久性似乎支持你想要做的。我不知道在cocos2d中是否使用了不同的類,但原理保持不變。

+0

我正在設置一個BOOL iVar觸摸*而不是*在火災區域,以防止觸摸從翹曲開始,如果您再次點擊「移動」區域。 您的解決方案不起作用,因爲我希望玩家能夠同時移動和射擊。如果我標誌着一個伊娃被擊中,然後我的主要動作手指移動,什麼都不會發生。 (感謝您的快速回復) – quantumpotato

+0

因此,當玩家觸摸到火區並將其拉出時會發生什麼?你是否想讓這個特殊的接觸被忽略,同時還允許進一步的接觸來移動這艘船? (我確實說過我錯過了一些東西 - 多點觸摸?) – jrturton

+0

是的 - 正好! 我在這裏問了一個這個問題的簡單版本: http://stackoverflow.com/questions/8543473/ignoring-touchesmoved-for-subsequent-touches-while-counting-touchesbegan-total其實..它可能會更困難因爲沒有多個圖層。 (我會標記,如果有一個普遍的答案) – quantumpotato

相關問題