2009年02月11日

シューティングのレーザー

シューティングのレーザーを作ってみました。
しかし、微妙に不自然なエセレーザーです。
昔立ち読みした本に、レーザーは棒状のグラフィックではなく、
通常のショットを長く繋げて長く見せているだけだと読んだ記憶があります。
でも、ここしか覚えてません(笑)


とりあえずシンプルなレーザーの1パーツを作って、
連続ショットで重なるようにしてみました。

パーツはこんな感じです
2009.2.11.jpg


でもこれだと自機が動いた時にレーザーのパーツがバラけます。


という訳で、自機が動いた時に、既に発射された弾も動かないと
真っ直ぐになりません。

そこでbeemとかいう適当なインスタンス名を付けた
空のMCを作って配置。


自機と同じ座標になるように以下のようなスクリプト記述
※自機のインスタンス名はmyshipにしてます

onClipEvent (enterFrame) {
_x = _root.myship._x;
_y = _root.myship._y;
}

このbeem上にレーザーを描画します。
発射位置はbeem内の(0.-30)にして
ちょっと前にでるようにしてます。
これで描画エリアであるbeemも自機と一緒に動くので
自機が動いても、レーザーは真っ直ぐになります。

こんな感じになります
(カーソルキー操作。Zキー発射。)

ただ、若干自機に遅れて動くので、
ピッタリ合わせたい場合は自機の移動スクリプトを
beemにも適用させてやればよいと思います。
キーボード操作であれ、マウス操作であれ、
自機の移動に使っているスクリプトをそのままコピペ。
(最初にピッタリと合わせておく必要がありますが)


当たり判定は貫通するタイプであれば、個々に取る必要は無く、
レーザーを描画するMCであるbeemと敵との判定を取れば良いと思います。


ただこのレーザーは、ちょっと不自然な部分があります。
連続してビームが発射されている状態であれば、
自機の動きに合わせてレーザーが動いても問題無いのですが、
自機のレーザーを一旦区切った結果、
自機から離れた状態になったレーザーも
自機の動きに合わせて動くのは何とも不自然です。




という訳で参考までに。




posted by ケン at 19:13 | Comment(0) | TrackBack(0) | 実験 | このブログの読者になる | 更新情報をチェックする

2009年02月01日

マウスボタン1個で2つの武器を使い分ける

通常、複数のショットを切り替えて使う場合はボタンが2つ必要ですが、
クリックを一定間隔でクリックした場合と、押しっぱなしにした場合とで別のショットが打てるようにします。
(Flash8使用)

正攻法じゃなくて、簡易版を作ろうとしたら
ぐちゃぐちゃになった・・・・


ど素人なので、苦情はご遠慮下さい(^^;

別に、こんな事しなくても、
クリックし直す度に武器用の変数切り替えたら
簡単に複数個の武器を切り替えられるんじゃない?
といったツッコミもご遠慮下さい(笑)




変数は分かり易いようにと全部_rootを付けてますが、
逆に分かり辛いかも(^^;



要素数10の配列と。変数を2個作ります。
名前は何でも良いです。
(最初に初期化しておかないとエラーになります)
_root.shot = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
_root.shotflag = 0;
_root.shotsum = 0;


仕組みとしては、
マウスを押すと毎フレーム配列に1が入るようになる
マウスを離すと毎フレーム配列に0が入るようになる

で、この配列の合計を監視します。
1.
配列の合計が10なら、マウスは押しっぱなしなので、ショット1を発射。

2.
配列の合計が0なら、マウスは暫く押されていないのでショットを止める。

3.
配列の合計が1〜9なら、マウスは押しっぱなしでもなく
離しっぱなしでもないので、軽く連打していると判断してショット2を発射。


書く場所はどこでも良いと思いますが、
ここでは自機のMCに直接記述したとします。



動きとしては、こんな感じになります
(マウス操作。クリックで発射。)










onClipEvent (mouseDown) {
_root.shotflag = 1;
}
onClipEvent (mouseUp) {
_root.shotflag = 0;
}


//マウスを押したら_root.shotflagに1を
//離したら_root.shotflagに0を入れます










onClipEvent (enterFrame) {
//毎フレーム実行させます。



_root.shot.unshift(_root.shotflag);
_root.shot.pop();
//unshiftを使って配列の先頭にマウスが押されていれば1
//押されていなければ0を挿入します。
//挿入して配列要素が1個増えたので最後尾をpop()で削除。




for (i=0; i<10; i++) {
_root.shotsum += _root.shot[i];
}
//現在の配列の合計値を_root.shotsumに集計します。





if (_root.shotsum == 10) {
【ここにショット1発射の処理】;
} else if (_root.shotsum == 0) {
【ここにショットを止める処理】;
} else {
【ここにショット2発射の処理】;
}

//【】内の処理は省略しています。各自でどうぞ




_root.shotsum = 0;
//最後に配列の合計値を0に戻しておきます。



}






上記を全部まとめて書くと
onClipEvent (mouseDown) {
_root.shotflag = 1;
}
onClipEvent (mouseUp) {
_root.shotflag = 0;
}
onClipEvent (enterFrame) {
_root.shot.unshift(_root.shotflag);
_root.shot.pop();
for (i=0; i<10; i++) {
_root.shotsum += _root.shot[i];
}
if (_root.shotsum == 10) {
【ここにショット1発射の処理】;
} else if (_root.shotsum == 0) {
【ここにショットを止める処理】;
} else {
【ここにショット2発射の処理】;
}
_root.shotsum = 0;
}

まあ何だか無理やりですが、動いたからいいや・・・・
posted by ケン at 10:18 | Comment(0) | TrackBack(0) | 実験 | このブログの読者になる | 更新情報をチェックする

2009年01月29日

グラディウスのオプションを作った

グラディウスのオプションを作ってみました。
(Flash8で作成)
何で違う事やってんの!?って感じですが大人の事情です。

動作確認はこちらをクリック


※自機は最初からステージに配置し、
myshipというインスタンス名にしています。
オプションも特にインスタンス名は付けていませんが、
3つ程最初からステージに配置しています。


これには配列を使います。
自機の過去の座標を、配列に記憶させておき、
自機の動きをトレースさせます。

配列に関しての説明は今回ありませんので、
配列の基礎等は他のサイトを参考にして下さいm(__)m


まずは、X座標用とY座標用の配列を作っておきます。

今回は判り易いようにroot上に作って、パスも絶対パスを使ってます。

_root.optionx = new Array(20);
_root.optiony = new Array(20);

要素数はとりあえず20にしておきました。
20フレーム分の座標を記憶させておけます。



次に、自機の座標を配列に入れていく処理です。
絶対パスにしているので何処に書いても良いですが、
毎フレーム実行されるようにして下さい。
MC内に書くのであればonClipEvent (enterFrame) { }内に記述ですね。



_root.optionx.unshift(_root.myship._x);
_root.optiony.unshift(_root.myship._y);
_root.optionx.pop();
_root.optiony.pop();

unshift()は配列の先頭にカッコ内の値(引数)を挿入するメソッドです。
_root.myship._xは自機の座標なので、
現在の自機座標を配列の先頭であるoptionx[0]へ入れている事になります。
この際に元々入っていた値は、後ろへ全体的にズレます。


しかし、ズレた影響で配列の要素が1個増えてしまいます。
このままでは毎フレームごとに増えて大変なことになるので
optionx.pop();を使って一番後ろの箱を消します。

pop()は配列の最後の要素を取り除くメソッドです。



ということで、毎フレームごとに自機の座標を取得して
配列の先頭に挿入していく事になるので
配列の前の方は自機の最近の座標、後ろの方は自機の古い座標が収納されている事になります。



次に1番目のオプションへ以下のように記述します

onClipEvent (enterFrame) {

this._x =_root.optionx[4] ;
this._y =_root.optiony[4] ;
}

2番目のオプションへ以下のように記述します

onClipEvent (enterFrame) {

this._x =_root.optionx[8] ;
this._y =_root.optiony[8] ;
}


1番目のオプションは4フレーム前の自機座標、
2番目のオプションは8フレーム前の自機座標を自分の座標にしています。


これでオプションの動きが完成です。



ですが、グラディウスのオプションは自機が止まっている間は動きませんね。
上記の処理だと自機が止まってもオプションは止まらず、自機に重なってきます。


これを防ぐ為に条件式を付けます。

if (_root.optionx[0] != _root.myship._x || _root.optiony[0] != _root.myship._y) {
_root.optionx.unshift(_root.myship._x);
_root.optiony.unshift(_root.myship._y);
_root.optionx.pop();
_root.optiony.pop();
}

配列に格納した最新の座標optionx[0]と現在の自機の座標を比べて、
違った場合(自機が動いていた場合)のみ処理を実行するようにします。
これで、自機が止まるとオプションも止まります。


今回はサンプルflaファイル作りました(Flash8で作成)
こちらをクリック
※配列への座標挿入処理は自機に記載しています。



素人なので変な処理をしている可能性もあります。
ご了承下さい。
posted by ケン at 20:34 | Comment(0) | TrackBack(0) | 実験 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。