問答収集 カテゴリ:Flashプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:8 / 状態:未解決 / No:97 / ATOM
1 名前:名無し 日付:2012/09/18(火)18:34:56 ID:MEC8H+U0wRZK
こんにちは。
flash初心者で質問があります。
速度を使って移動させるスクリプトについてなのですが、
一定の距離を進むと止まる処理について悩んでおります。
flash lite 2.1です。

【状況】
味方(mc_target1)と敵(enemy1)というシンボルがあります。
(これらはドラッグ&ドロップでユーザーが任意に配置可能)

ボタンを押すと、
・味方と敵の当たり判定を行う
・当たっている場合、enemy1の移動速度が30になり、味方とは反対方向に移動を開始します。
(ぶつかって跳ね返るイメージです)
・その後、一定の距離を進むと、移動を停止、という記述をしたいです。
(一定の距離とは、味方から相対的な距離になります。)

下記が該当箇所の記述なのですが、forの中にどう記述してよいかわかりません。
お手数なのですが、ご教示いただけますでしょうか?

on (press) {
   if (_root.mc_target1.hitTest(_root.enemy_1.enemy1_hitarea_top)){
for(????)
_root.enemy_1.dx = -30;

※enemy1_hitarea_topとは、enemy1の四辺に薄く配置したシンボルの事です。
2 日付:2012/09/18(火)22:09:43 ID:uqGvQ4UrzKin
状況は理解できました。先に質問よろしいでしょうか。

ソースに、_root.enemy_1.dx = -30; とありますが
移動させるのは、x 座標のみの1次元でしょうか?それとも y 座標も含む2次元でしょうか?


また、for 文を使ってどのような事を実現されたいのでしょうか?
3 名前:名無し 日付:2012/09/19(水)09:48:29 ID:MEC8H+U0wRZK
回答ありがとうございます!

ご質問いただいた移動の次元ですが、y座標も含む二次元です。
ただ、一回の移動の際にx、y両方使うという事は無く、基本的にx座標での移動かy座標での
移動のみを行うようにしたいと考えています。

for文を使って実現したいのは、
・移動させる距離を制限したい。(1回のhittestで130px程動かす)
・130px分移動しない内に、他の矩形がある場合その他の矩形と隣接する形で移動を停止させたい

という点になります。
よろしくお願いいたします。
4 日付:2012/09/19(水)19:37:18 ID:uqGvQ4UrzKin
>・移動させる距離を制限したい。(1回のhittestで130px程動かす)
こちらの確認ですが、

mc_target1 と当たってから、enemy1 の移動速度が 30 となり

0フレーム目 当たった位置
1フレーム目 当たった位置から 30px 移動
2フレーム目 当たった位置から 60px 移動
3フレーム目 当たった位置から 90px 移動
4フレーム目 当たった位置から 120px 移動
5フレーム目 当たった位置から 130px 移動

という感じで、
敵が 130px 分移動している途中の状態は表現したいということでよろしいでしょうか?

それとも、for 文で繰り返し 30px ずつ移動させ、
最終的に1フレームだけで 130px 一気に移動させたいということでしょうか?


また、他の矩形がある場合その他の矩形と隣接する形で移動を停止させたいという事ですが、
他の矩形とは別の敵でしょうか。地形でしょうか。
5 名前:名無し 日付:2012/09/19(水)20:21:06 ID:MEC8H+U0wRZK
回答ありがとうございます。

色々と説明不足ですみません。
移動距離についてですが、
途中の動いている状態を表現したいので、30pxずつ移動させる、というイメージです。

隣接する形で移動を停止させる、というのは、他の敵で、座標は任意で変更します。

将棋の盤面に、敵に隣接したらコマが吹き飛ばされて移動するイメージです。

度々申し訳ありませんが、よろしくお願いいたします。

6 名前:1/3 日付:2012/09/20(木)00:24:38 ID:uqGvQ4UrzKin
ありがとうございます。

敵が移動を開始してから別の敵と接触するのは、
ボタンを押してから数フレーム後にも起こりえますので、

>・130px分移動しない内に、他の矩形がある場合その他の矩形と隣接する形で移動を停止させたい

この処理を、on (press) イベント中に含めるのは難しいです。


on (press) {} イベント中の処理は。

・味方と敵の当たり判定を行う
・味方と敵が当たっている場合、
 →敵の速度を変更する
 →敵の移動先の座標をセットする
 →敵を「ぶつかって跳ね返っている」という状態に変更する

という処理までに留めることになります。


敵が敵と接触したか調べるのは、
onEnterFrame イベントハンドラなどを使用して、その中で毎フレームチェックすることになります。
7 名前:2/3 日付:2012/09/20(木)00:27:24 ID:uqGvQ4UrzKin
敵の処理はこんな感じとして…

───────────────────────

// 敵ムービークリップの参照
var enemy = _root.enemy1;

// -------------------------------------------
// 初期化
// -------------------------------------------
// x 方向速度
enemy.dx = 0;
// y 方向速度
enemy.dy = 0;
// 目的地 x 座標
enemy.target_x = 0;
// 目的地 y 座標
enemy.target_y = 0;
// 状態
enemy.step = "NORMAL";


// -------------------------------------------
// 毎フレーム実行されるイベント
// -------------------------------------------
enemy.onEnterFrame = function(){

switch(this.step){

// 通常状態
case "NORMAL":

break;

// ノックバック状態
case "KNOCKBACK":

// 現在位置から目的地までの差分
var sub_x = this.target_x - this._x;
var sub_y = this.target_y - this._y;


// 差分より速度のほうが大きい場合、速度 = 差分 とし、目的地に吸着させる
if(sub_x > 0){
if(sub_x < this.dx){
this.dx = sub_x;
}
}else if(sub_x < 0){
if(sub_x > this.dx){
this.dx = sub_x;
}
}else{
this.dx = 0;
}

if(sub_y > 0){
if(sub_y < this.dy){
this.dy = sub_y;
}
}else if(sub_y < 0){
if(sub_y > this.dy){
this.dy = sub_y;
}
}else{
this.dy = 0;
}


// 他の敵と重なっているか調べる
for(##########){

// 重なっていた場合
if(##########){
// 速度を 0 にする
this.dx = 0;
this.dy = 0;

// 座標を敵と重ならない位置に戻す

// 通常状態に遷移する
this.step = "NORMAL";
}
}


// 速度を座標に加算
this._x += this.dx;
this._y += this.dy;


// 速度が 0 となった場合
if(this.dx == 0 && this.dy == 0){
// 通常状態に遷移する
this.step = "NORMAL";
}

break;
};
}
8 名前:3/3 日付:2012/09/20(木)00:31:17 ID:uqGvQ4UrzKin
(press) イベント中に、味方と敵の当たり判定が合った場合、敵に以下のパラメータを渡します。

 →敵の速度を変更する
 →敵の移動先の座標をセットする
 →敵を「ぶつかって跳ね返っている」という状態に変更する


───────────────────────
on (press) {

// 各ムービークリップの参照
var friend = _root.mc_target1;
var enemy = _root.enemy1;

if (friend.hitTest(enemy.enemy1_hitarea_top)){

// x 方向の速度をセット
enemy.dx = 30;

// 目的地 x 座標をセット
enemy.target_x = friend._x + 130;

// ノックバック状態に遷移する
enemy.step = "KNOCKBACK";

}
}
このスレッドについて
質問の状態 :
未解決
投稿開始日 :
2012/09/18(火)18:34:56
投稿終了日 :
2012/09/27(木)00:31:49
投稿者 :
名無し
レス総数 :
8
スレッド番号 :
97
MondoCollectionSystem ver.0x00020000 by Hakuhin