ボールを投げる 【後編】

throw_ball



ボールを投げるアクションの作り方の後編です
【前編】はこちら




まずはボールをつかんで離す設定を追加
つかんでいる時にはボールが止まり、離すと動くように
ドラッグ領域を設定しておいて、外れたらドラッグ解除するように設定

//ボールの初期移動量
var speedX = 5;
var speedY = 4;

//ボールを持っているかどうか
var pickup:Boolean = false;
//ボタンモード
ball_mc.buttonMode = true;

//ボールの動き設定
addEventListener(Event.ENTER_FRAME,ballAction);
function ballAction(event:Event):void {
    //ボールのスピードが一定以下でスピード0に
    if (Math.abs(speedX) < 0.1) {
        speedX = 0;
    }
    if (Math.abs(speedY) < 0.1) {
        speedY = 0;
    }

    //ボールをつかんだ時の設定
    if (pickup == true) {
    }

    //ボールをつかんでない時の動きの設定
    if (pickup == false) {
        speedX *= 0.99;    //空気抵抗でどんどん遅く
        speedY = speedY*0.99+0.98;    //空気抵抗と重力の設定
        ball_mc.x = ball_mc.x+speedX;
        ball_mc.y = ball_mc.y+speedY;

        //壁に当たったときの設定
        //右の壁に当たったとき
        if (ball_mc.x > 400-ball_mc.width/2) {
            ball_mc.x = 400-ball_mc.width/2;
            speedX = -speedX*0.8;    //跳ね返り係数
        }
        //左の壁に当たったとき
        if (ball_mc.x < 0+ball_mc.width/2) {
            ball_mc.x = 0+ball_mc.width/2;
            speedX = -speedX*0.8;    //跳ね返り係数
        }
        //天井に当たったとき
        if (ball_mc.y < 0+ball_mc.height/2) {
            ball_mc.y = 0+ball_mc.height/2;
            speedY = -speedY*0.8;    //跳ね返り係数
        }
        //地面に当たったとき
        if (ball_mc.y > 270-ball_mc.height/2) {
        ball_mc.y = 270-ball_mc.height/2;
            speedY = -speedY*0.8;    //跳ね返り係数
        }
    }
}

//ボールつかんだ時
var rect:Rectangle = new Rectangle( 15, 15, 370, 240);    //ドラッグ領域設定
ball_mc.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
function onDown(event:MouseEvent) {
    pickup = true;
    ball_mc.startDrag(true,rect);
}

//ボール離した時
ball_mc.addEventListener(MouseEvent.MOUSE_UP,onUp);
function onUp(event:MouseEvent) {
    pickup = false;
    ball_mc.stopDrag();
}
//ステージ外に移動したときにドラッグ解除
ball_mc.addEventListener(MouseEvent.ROLL_OUT,onUp);


つぎにボールを投げる設定
ボールを離すときと、その直前の位置との差によって投げるスピード、方向を決定

//ボールの初期移動量
var speedX = 5;
var speedY = 4;

//ボールの古い位置座標
var x2:int;
var y2:int;

//ボールを持っているかどうか
var pickup:Boolean = false;
//ボタンモード
ball_mc.buttonMode = true;

//ボールの動き設定
addEventListener(Event.ENTER_FRAME,ballAction);
function ballAction(event:Event):void {
    //ボールのスピードが一定以下でスピード0に
    if (Math.abs(speedX) < 0.1) {
        speedX = 0;
    }
    if (Math.abs(speedY) < 0.1) {
        speedY = 0;
    }

    //ボールをつかんで投げる時の設定
    if (pickup == true) {
        //離す時と直前の座標から新たな移動量設定
        speedX = (ball_mc.x-x2);
        speedY = (ball_mc.y-y2);
        //直前の座標設定
        x2 = ball_mc.x;
        y2 = ball_mc.y;

    }

    //ボールをつかんでない時の動きの設定
    if (pickup == false) {
        speedX *= 0.99;    //空気抵抗でどんどん遅く
        speedY = speedY*0.99+0.98;    //空気抵抗と重力の設定
        ball_mc.x = ball_mc.x+speedX;
        ball_mc.y = ball_mc.y+speedY;

        //壁に当たったときの設定
        //右の壁に当たったとき
        if (ball_mc.x > 400-ball_mc.width/2) {
            ball_mc.x = 400-ball_mc.width/2;
            speedX = -speedX*0.8;    //跳ね返り係数
        }
        //左の壁に当たったとき
        if (ball_mc.x < 0+ball_mc.width/2) {
            ball_mc.x = 0+ball_mc.width/2;
            speedX = -speedX*0.8;    //跳ね返り係数
        }
        //天井に当たったとき
        if (ball_mc.y < 0+ball_mc.height/2) {
            ball_mc.y = 0+ball_mc.height/2;
            speedY = -speedY*0.8;    //跳ね返り係数
        }
        //地面に当たったとき
        if (ball_mc.y > 270-ball_mc.height/2) {
        ball_mc.y = 270-ball_mc.height/2;
            speedY = -speedY*0.8;    //跳ね返り係数
        }
    }
}

//ボールつかんだ時
var rect:Rectangle = new Rectangle( 15, 15, 370, 240);    //ドラッグ領域設定
ball_mc.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
function onDown(event:MouseEvent) {
    pickup = true;
    ball_mc.startDrag(true,rect);
}

//ボール離した時
ball_mc.addEventListener(MouseEvent.MOUSE_UP,onUp);
function onUp(event:MouseEvent) {
    pickup = false;
    ball_mc.stopDrag();
}
//ステージ外に移動したときにドラッグ解除
ball_mc.addEventListener(MouseEvent.ROLL_OUT,onUp);


これで投げる動作ができたかと思います
最後に影を追加



新規レイヤーを追加して、ボールのあるレイヤーと枠のレイヤーの間に配置
そこに30×7の楕円を描き、塗りをグラデーションに
中心の色を#000000、端の色を#CCCCCC
それをムービークリップシンボルに変換し、インスタンス名をshadow_mcに
フィルタからぼかし(水平6、垂直6)をかける
影の動きをActionScriptで記述

//ボールの初期移動量
var speedX = 5;
var speedY = 4;

//ボールの古い位置座標
var x2:int;
var y2:int;

//ボールを持っているかどうか
var pickup:Boolean = false;
//ボタンモード
ball_mc.buttonMode = true;

//ボールの動き設定
addEventListener(Event.ENTER_FRAME,ballAction);
function ballAction(event:Event):void {
    //ボールのスピードが一定以下でスピード0に
    if (Math.abs(speedX) < 0.1) {
        speedX = 0;
    }
    if (Math.abs(speedY) < 0.1) {
        speedY = 0;
    }

    //ボールをつかんで投げる時の設定
    if (pickup == true) {
        //離す時と直前の座標から新たな移動量設定
        speedX = (ball_mc.x-x2);
        speedY = (ball_mc.y-y2);
        //直前の座標設定
        x2 = ball_mc.x;
        y2 = ball_mc.y;

    }

    //ボールをつかんでない時の動きの設定
    if (pickup == false) {
        speedX *= 0.99;    //空気抵抗でどんどん遅く
        speedY = speedY*0.99+0.98;    //空気抵抗と重力の設定
        ball_mc.x = ball_mc.x+speedX;
        ball_mc.y = ball_mc.y+speedY;

        //壁に当たったときの設定
        //右の壁に当たったとき
        if (ball_mc.x > 400-ball_mc.width/2) {
            ball_mc.x = 400-ball_mc.width/2;
            speedX = -speedX*0.8;    //跳ね返り係数
        }
        //左の壁に当たったとき
        if (ball_mc.x < 0+ball_mc.width/2) {
            ball_mc.x = 0+ball_mc.width/2;
            speedX = -speedX*0.8;    //跳ね返り係数
        }
        //天井に当たったとき
        if (ball_mc.y < 0+ball_mc.height/2) {
            ball_mc.y = 0+ball_mc.height/2;
            speedY = -speedY*0.8;    //跳ね返り係数
        }
        //地面に当たったとき
        if (ball_mc.y > 270-ball_mc.height/2) {
        ball_mc.y = 270-ball_mc.height/2;
            speedY = -speedY*0.8;    //跳ね返り係数
        }
    }
}

//ボールつかんだ時
var rect:Rectangle = new Rectangle( 15, 15, 370, 240);    //ドラッグ領域設定
ball_mc.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
function onDown(event:MouseEvent) {
    pickup = true;
    ball_mc.startDrag(true,rect);
}

//ボール離した時
ball_mc.addEventListener(MouseEvent.MOUSE_UP,onUp);
function onUp(event:MouseEvent) {
    pickup = false;
    ball_mc.stopDrag();
}
//ステージ外に移動したときにドラッグ解除
ball_mc.addEventListener(MouseEvent.ROLL_OUT,onUp);

//影の動き設定
shadow_mc.addEventListener(Event.ENTER_FRAME,shadowMove);
function shadowMove(event:Event):void {
    //影の位置設定、ボールの下の地面に常にあるように
    shadow_mc.x = ball_mc.x;
    shadow_mc.y = 270;
    //ボールが上にいくにしたがって影が小さく、うすくなるように
    shadow_mc.scaleX = shadow_mc.scaleY= ball_mc.y/300;
    shadow_mc.alpha = ball_mc.y/150;
}


これでムービープレビューすると以下のようになってるかと思います



以上ボールを投げるアクションの作り方でした