はじめまして。今回エンジニアブログを担当させていただきます、藤澤と申します。
ゲーム開発経験ゼロの状態から4月に入社したばかりなので大したことは書けませんが、せっかくなので業務系エンジニアがゲーム開発を始める上ではまるところ、という視点で、自分がはまった点を書いていきたいと思います。
今回は Cocos2d-x でのスクロールについてです。
以下のように、複数行のレコードにボタンを添えて配置する UI を作るとします。
ボタン | データ |
ボタン | データ |
ボタン | データ |
ボタン | データ |
業務アプリであれば Grid 系のコントロールを使うか、WPF なら DataTemplate を使うところですが、Cocos2d-x では CCScrollView や CCTableVIew というのが使えるそうです。
このとき気をつけなければいけないのが、Cocos2d-x では Viewport の範囲外にあるボタンまで押せてしまいます。
ためしに ScrollView の下のほう、ボタンが並んでいるであろうあたりをタップすると、イベントが発生します。
隠れているボタンに対してイベントを発生させないようにするには、自分でボタンの位置を計算して Viewport の範囲外なら処理をしないようにしてやる必要があります。
CCSize viewportSize = pScrollView->getViewSize(); CCPoint scrollPosition = pScrollView->getContentOffset(); int buttonBottom = index * ROW_HEIGHT; int buttonTop = (index + 1) * ROW_HEIGHT; if (buttonTop + scrollPosition.y < 0 || buttonBottom + scrollPosition.y > viewportSize.height) { return; }
こんな感じでしょうか。
業務系では こういった計算を書く機会がほとんどないので混乱してしまいますね。座標系の原点が左下になっているのも混乱する点だと思います。
.NET や Java で業務系のアプリを作っているとフレームワーク側で勝手にヒットテストをしてくれるので、こういうのは なかなか気づかないですが、ゲーム系ではレスポンスが重要なので不要なヒットテストは行なわないということなのでしょうか。
ということで、今回はスクロールの話でした。
こんな感じで、また何か気づいたことがあれば書いていきたいと思います。