質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2502閲覧

キャラクターの移動について(cocos2dx,C++)

tsysrtk

総合スコア15

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/07/14 04:47

最近プログラムを始めた初心者という前提でお願いいたします。
個人的にcocos2d-xを使ってC++でゲームを作っています。

キャラクターの移動についてわからないことがあります。

Sprite *pPlayer = (Sprite*)this->getChildByTag(1); pPlayer->stopActionByTag(100); auto moveSpeed = 300.0f; auto playerPos = pPlayer->getPosition(); CCLOG("現在位置X = %f , 現在位置Y = %f", playerPos.x, playerPos.y); auto touchPoint = pTouch->getLocation(); CCLOG("目的地X = %f , 目的地 = %f", touchPoint.x, touchPoint.y); auto distance = playerPos.getDistance(touchPoint); CCLOG("距離 = %f", distance); auto moveTime = abs(distance) / moveSpeed; CCLOG("移動時間 = %f", moveTime); auto moveTo = MoveTo::create(moveTime, touchPoint); moveTo->setTag(100); pPlayer->runAction(moveTo);

マップがタッチされると上記のコードが呼ばれるようにしています。
タッチの位置と現在位置の距離を求め、moveToの引数が時間のため、
移動速度が一定になるように、移動時間を計算し移動を行っています。

これで、移動の処理を行えたのですが、

画面のスクロールを実装したところ、
元々画面外だった箇所へ移動の際の挙動がおかしくなってしまいます。

出力して確認してみたところ、
元々画面外だった箇所のタッチ位置がおかしくなってしまっているようでした。

解決法がわからないので
どなたかご教授よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

タッチ座標は、AppDelegate.cppで設定しているデザイン解像度(DesignResolutionSize)の範囲です。
デザイン解像度は、以下のコードで確認できます。

cpp

1auto winSize = Director::getInstance()->getWinSize(); 2CCLOG("winSize.width=%.3f, winSize.height=%.3f", winSize.width, winSize.height);

タッチ座標をキャラクターが動く範囲の座標に変換してやる必要があります。
Fllowアクションでスクロールを実装しているのであれば、以下のコードで変換できると思います。

cpp

1auto touchPoint = pTouch->getLocation(); 2CCLOG("タッチ座標(返還前): x=%f, y=%f", touchPoint.x, touchPoint.y); 3 4auto globalTouchPoint = this->convertToNodeSpace(pTouch->getLocation()); 5CCLOG("タッチ座標(変換後): x=%f, y=%f", globalTouchPoint .x, globalTouchPoint .y);

もし、違う方法でスクロールを実装しているのであれば、
自前でスクロール量を管理しておき、タッチ座標にスクロール量を足したものを使用するという事になります。

投稿2017/07/14 08:40

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsysrtk

2017/07/14 10:29 編集

いつもありがとうございます。 なるほど、デザイン解像度の座標を指定してしまっていたのですね。 Followアクションを使ってスクロールを実装していたので、 問題なく処理を行うことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問