JavaScriptの勉強に大変良いということで、最近触り始めました。
RPG風のサンプルが、ドラクエやらポケモンやらを彷彿とさせてとっても楽しい!w
サンプルだと主人公は自分だけ。
キャラ絵は3種類あるみたいなので、登場させちゃおうかと。
簡単な手順
- 新しいキャラを作る。
- ランダムで動くように設定する。
ソース
// game.onload() = function(){ 以下 var npc = new Sprite(32, 32); npc.x = 3 * 16 - 8; npc.y = 3 * 16; var npc_img = new Surface(96, 128); npc_img.draw(game.assets['chara0.gif'], 192, 0, 96, 128, 0, 0, 96, 128); npc.image = npc_img; npc.isMoving = false; npc.direction = 0; npc.walk = 1; npc.addEventListener('enterframe', function() { this.frame = this.direction * 3 + this.walk; if (this.isMoving) { this.moveBy(this.vx, this.vy); if (!(game.frame % 3)) { this.walk++; this.walk %= 3; } if ((this.vx && (this.x-8) % 16 == 0) || (this.vy && this.y % 16 == 0)) { this.isMoving = false; this.walk = 1; } } else { var dir = Math.floor(Math.random()*4+1); var move = Math.floor(Math.random()*10); this.vx = this.vy = 0; if (dir == 4 && !move) { this.direction = 1; this.vx = -4; } else if (dir == 2 && !move) { this.direction = 2; this.vx = 4; } else if (dir == 1 && !move) { this.direction = 3; this.vy = -4; } else if (dir == 3 && !move) { this.direction = 0; this.vy = 4; } if (this.vx || this.vy) { var x = this.x + (this.vx ? this.vx / Math.abs(this.vx) * 16 : 0) + 16; var y = this.y + (this.vy ? this.vy / Math.abs(this.vy) * 16 : 0) + 16; if (0 <= x && x < map.width && 0 <= y && y < map.height && !map.hitTest(x, y)) { this.isMoving = true; arguments.callee.call(this); } } } }); stage.addChild(npc);
当然ですが、難しいことはしてません。
でも、できた!←重要
キャラ絵を変える
npc_img.draw(game.assets['chara0.gif'], 192, 0, 96, 128, 0, 0, 96, 128); // 最初の値を、0か96か192で切り替え
0なら男の子、96ならショートの女の子、192だとリボンの女の子です。
動かす
var dir = Math.floor(Math.random()*4+1); // サンプルコードは矢印キーか、アナログパッドの入力。 // ランダムで動く方向(上下左右の4方向)を、乱数で決めます。 var move = Math.floor(Math.random()*10); if (dir == 4 && !move) { } else if( // ・・・ // enterframeイベントにくっつけて動かします。 // このイベントはほぼ起きっぱなしなので、10回に1回動くようにしてます。 // それでもNPCにしては動きすぎなイメージw
hitTest関数も既存のままなので、障害物は乗り越えません。
プレイヤーと重ならないように
しようと思ったのですが、ここがイマイチわかりません・・。
できた方はぜひ教えてください。
正確には、ほぼできたけど、完璧にはできなかったです。
プレイヤーが移動する時に、移動先にNPCがいればキャンセルするようにしました。
ただ、NPCの移動のタイミングと被ると、重なる場合やらすり抜ける場合があったりやら。
intersect()もwithin()も使ってません。