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

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

ただいまの
回答率

88.04%

キャラ固定のマップスクロール時に障害物を正しく認識させたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,833

score 7

enchant.jsでRPG的なものを作成しています。

■やりたいこと

「キャラをマップの中央に置き、マップをスクロールさせたい」
「障害物を認識させ、キャラが通行可能なところにだけ動かしたい」

■トラブル

「スクロールはするが、正しく障害物を認識した動きにならない」
参照:http://goo.gl/DqRoxL

■考えられる原因

トラブル時の動きから察するに、hittestで障害物の判定を行う際、このソースではキャラの現在位置でなく初期配置位置を常に参照している? ようです。

どこかでキャラの現在位置を保存し、hittestで常にそれを参照させることができれば、目的を達成できると思うのですが……その方法がわからず困っています。

hittestでキャラの現在座標をチェックさせるためには、以下のソースをどのように書き直せば良いでしょうか。


なお、マップをスクロールさせず、キャラを単一画面の中で動かすだけであれば、hittestで障害物を認識させるのには成功しています。
参照:http://goo.gl/v1oM2o


----以下ソース----

enchant();    // ライブラリの初 enchant();

window.onload = function(){
// 320×320ピクセルサイズの画面(Canvas)を作成
var game = new Game(320, 320);
// フレームレートの設定。15fpsに設定
game.fps = 10;
// ブロックサイズ
game.bs = 32;    // 32px
// 画像データをあらかじめ読み込ませる
game.preload("img/map1.png", "img/chara3.png");
// データの読み込みが完了したら処理
game.onload = function(){
// マップのブロックのサイズを32×32に設定
var map = new Map(game.bs, game.bs);
// マップ画像を設定
map.image = game.assets["img/map1.png"];
// 表示するマップのデータを設定
var basemap = [
[2,2,2,2,2,2,2,2,2,2],
[2,1,0,0,0,0,0,0,0,2],
[2,1,0,2,2,2,1,0,0,2],
[2,1,0,2,2,2,1,2,2,2],
[2,1,1,1,1,1,1,1,1,2],
[2,0,2,2,1,2,2,2,0,2],
[2,0,2,0,1,0,0,0,0,2],
[2,0,0,0,1,2,2,2,0,2],
[2,0,0,0,0,0,0,0,0,2],
[2,2,2,2,2,2,2,2,2,2]
];
map.loadData(basemap);

var colMap = [
[1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,1],
[1,0,0,1,1,1,0,0,0,1],
[1,0,0,1,1,1,0,1,1,1],
[1,0,0,0,0,0,0,0,0,1],
[1,0,1,1,0,1,1,1,0,1],
[1,0,1,0,0,0,0,0,0,1],
[1,0,0,0,0,1,1,1,0,1],
[1,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1],
];
map.collisionData = colMap;

// マップを表示
game.rootScene.addChild(map);
// マイキャラを生成
var man = new Sprite(game.bs, game.bs);
man.image = game.assets["img/chara3.png"];
// マイキャラの最初の立ち位置
man.x = game.bs*4;
man.y = game.bs*4;
man.frame = 37;
game.rootScene.addChild(man);
// マイキャラを移動
man.addEventListener(Event.ENTER_FRAME, function(){
// 進んだ結果、yが0未満にならなければ&進入不可でなければ上へ移動
if (game.input.up && !map.hitTest(map.x, map.y + game.bs)){
    map.y = map.y + game.bs;
    this.frame = this.age % 3 + 6;
} else if (game.input.up){
    this.frame = 7;
}
if (game.input.down && !map.hitTest(map.x, map.y - game.bs)){
    map.y = map.y - game.bs;
    this.frame = this.age % 3 + 36;
} else if (game.input.down){
    this.frame = 37;
}
if (game.input.left && !map.hitTest(map.x + game.bs, map.y)){
    map.x = map.x + game.bs;
    this.frame = this.age % 3 + 51;
} else if (game.input.left){
    this.frame = 52;
}
if (game.input.right && !map.hitTest(map.x - game.bs, map.y)){
    map.x = map.x - game.bs;
    this.frame = this.age % 3 + 21;
} else if (game.input.right){
    this.frame = 22;
}

});
}
game.start();    // ゲーム処理開始
}
----ここまで----

以上、アドバイスいただけましたら幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

hitTestに使用しているmap.x(y)の初期値が0です。
そのため、MAPの起点(左下か左上かは確認していませんがどちらかだと思います。)に
キャラがいることになっています。

hitTestの引数をmap.x + man.x, map.y + man.yにすると、うまくいくかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/16 12:58

    ご回答ありがとうございます! 家に戻り次第、早速ためそうと思います。
    取り急ぎお礼まで。。。

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る