6

これに関する情報はほとんどないので、ここに私の問題があります:

私は2人のプレイヤーが「向かい合って座る」iPadゲームに取り組んでおり、反対側にいるプレイヤーはボタンをタップするのに苦労しています... Appleがデバイスの向きに基づいてタッチを自動シフトするように見えるためです(これは、通常の使用またはメイン プレーヤーに最適です)。それをリセットする方法、またはiPadにそうしないように指示する方法はありますか? (ちなみにiPhoneもこれを行います)

これが私が見つけたすべてです: この明らかな矛盾を考えると、ユーザーがパーツの領域の下にヒットする領域があるように、可動パーツの「境界」を開くことによってそれをごまかすことにしました. 全体として、ユーザーはオブジェクトの上ではなく下にヒットしているように見えるため、iOS によって引き起こされたシフトにはあまり気付かない.

したがって、オフセットを防ぐ簡単な方法がない場合、各 uiview (またはサブクラス) の境界を反対側のプレーヤーにシフトする唯一の解決策はありますか? それともそれも正しいですか?

どんな答えでも大歓迎です。

4

2 に答える 2

3

編集: Omg君たち私はついに方法を見つけました!UIViewのサブクラスを作成し、ゲームビュー(すべてのUIScrollView、UIButtonなどを格納)にそのサブクラスを使用させました。そして、これは私がサブクラスに追加した唯一のコードでした:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint touchSpot = point;
    if (![[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"] && touchSpot.y < 512)
    {
        touchSpot = CGPointMake(touchSpot.x, touchSpot.y+10);
    }

    UIView *hitView = [super hitTest:touchSpot withEvent:event];

    if (hitView == self)
        return self; // you can return nil here if you want touches to go through this view (ie transparent space in a HUD overlay or w/e)

    return hitView;
}

これまでのところ、これはうまく機能しています...反対側に座っている人は、「ホーム」側のプレーヤーと同じように、タッチレスポンスが良好です。ただし、このビューの上にビューを表示することに注意してください...すべてがそのメソッドを通過します...

古い解決策(私がそれを見つける前に^):

さて、今のところ私の解決策は、uigesturerecognizerをサブクラス化し、任意のタッチを転送して(つまり、レコグナイザーに制約がない)、それをゲームのビューに追加することです。次に、タッチに応答するメソッドは、状態が終了したときにのみ実行され、終了した場合は、すべてのサブビュー(多くはない)をループして、タッチが1つと交差したかどうかを確認します。同様に、反対側のプレーヤーの場合、(サブビューごとに)少しオフセットされたrectを比較します。

もっと効率的な方法を見つけることができるかどうかを確認します...しかし、これまでのところ大丈夫です。

ゲームビューをuiviewサブクラスにして、オーバーライドされたタッチを開始/移動/終了することもできましたが、すでにすべて配置されていたので、レコグナイザーを使用しました(したがって、uiviewをサブクラス化する必要はありません)。

于 2011-10-31T06:01:19.863 に答える
3

はい、タッチ オフセットは存在します。そのサイズは文書化されておらず、キャンセルできません (少なくともパブリック API では)。

オフセット自体をリバース エンジニアリングする必要があります。UIKitがタッチしていると言う小さな円を表示し、試行錯誤して調整します。オフセットがある場合は、反対側のプレイヤーのみのイベント ハンドラーで手動で適用できます (-2 * オフセット)。

それがどれほど正しいかはわかりません少し試してみる必要があります。

于 2011-10-24T05:00:06.557 に答える