忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

さー次は敵を作ろう!と思ってとりあえず敵を作ってみた。
stg2.gif







これもDOGA-L2を使用して書いてるんですが、凄いソフトだなーと感心してしまう。
ほんと簡単に作成出来て、色んな人が使ってるのも納得って感じ。

んで敵の生成なんですが、ここでつまづいた。本に載ってるスプリクトや色んな解説サイトなんかを見てみても
敵の生成はランダムで行ってるんですよね。でも、ランダムで敵が出てくるのってどうよ?って思う訳です。
出来れば、自分の思うような順番で敵を生成したい!と思い色々と考えたんですがまったく良いアイデアも浮かばず
どうすんだ?と思っていたら、これまた遊々窓々さんのサイトで素晴らしいスプリクトを発見。
ここのStarshipって言うスプリクトにすべての答えが書いてあった!

具体的にどうしたかと言うのが↓このスプリクト(とりあえず敵しか出ません)
*************************************
;初期設定
buffer 1 ;ウィンドウ1をバッファ画面として用意
picload "stg2.gif";画像をバッファに読み込み
screen 0,480,640,0,0,0;メイン画面(ウィンドウ0を480*640で用意)

emx=12;敵の数
dim ex,emx : dim ey,emx;敵の初期位置
dim dx,emx : dim dy,emx;敵の移動量
dim ef,emx;敵のフラグ
dim em,emx;敵の種類

*main
redraw 0 ;仮想画面を指定
color 0,0,0 ;色に黒を指定
boxf 0,0,480,640 ;仮想画面を黒で塗りつぶす
gosub *men ;*men(タイムテーブル)へ移動
;敵移動処理
repeat emx ;repeat〜loop間をemx回繰り返す
if ef(cnt)<1 : continue ;ef(cnt)が1以下(敵が画面にいない)ならばrepeatに戻る
if enm(cnt)=1 : gosub *em01 ;enm(cnt)(敵の名前)が1ならば*em01へ移動
if enm(cnt)=2 : gosub *em02
loop

redraw 1 ;メイン画面を更新
await 1 ;これを入れないとパソコンが固まる
gtime=gtime+1 ;タイムテーブルの為の変数
goto *main ;*mainに戻る

*men ;タイムテーブル
if gtime=0 : bx=0 : by=-64 : gosub *eb01;gtimeが0の時、bxに0をbyに-64を代入し*eb01に移動
if gtime=1 : bx=416 : by=-64 : gosub *eb01
if gtime=50 : bx=80 : by=-64 : gosub *eb01
if gtime=51 : bx=336 : by=-64 : gosub *eb01
if gtime=100 : bx=160 : by=-64 : gosub *eb01
if gtime=101 : bx=256 : by=-64 : gosub *eb01

if gtime=150 : bx=0 : by=-64 : gosub *eb02
if gtime=151 : bx=415 : by=-64 : gosub *eb02
if gtime=200 : bx=0 : by=-64 : gosub *eb02
if gtime=201 : bx=415 : by=-64 : gosub *eb02
if gtime=250 : bx=0 : by=-64 : gosub *eb02
if gtime=251 : bx=415 : by=-64 : gosub *eb02
return

*eb01
repeat emx ;repeat〜loop間をemx回繰り返す
if ef(cnt)>0 : continue ;ef(cnt)が0以上(すでに敵が画面にいる)ならばrepeatに戻る
enm(cnt)=1 ;敵の名前
ef(cnt)=1 ;敵の有無(1=有)
ex(cnt)=bx : ey(cnt)=by ;敵生成位置決定
dx(cnt)=0 : dy(cnt)=2 ;移動方向
break ;repeat〜loop間のループから、強制的に抜け出す
loop
return

*eb02
repeat emx
if ef(cnt)>0 : continue
enm(cnt)=2 ;敵の名前
ef(cnt)=1 ;敵の有無(1=有)
ex(cnt)=bx : ey(cnt)=by ;敵生成位置決定
dx(cnt)=3 : dy(cnt)=1 ;移動方向
break ;repeat〜loop間のループから、強制的に抜け出す
loop
return

*em01
ex(cnt)=ex(cnt)+dx(cnt) : ey(cnt)=ey(cnt)+dy(cnt) ;敵の移動量決定
if ey(cnt)>640 : ef(cnt)=0 ;画面から消えたら敵の存在を無しにする
pos ex(cnt),ey(cnt) : gmode 2 : gcopy 1,0,64,64,64 ;敵1の表示
return

*em02
ex(cnt)=ex(cnt)+dx(cnt) ;敵の移動量決定
if(ex(cnt)<1)|(ex(cnt)>415) :dx(cnt)=-dx(cnt) ;画面の端まで行ったら反転させる

ey(cnt)=ey(cnt)+dy(cnt) ;敵の移動量決定
if ey(cnt)>640 : ef(cnt)=0 ;画面から消えたら敵の存在を無しにする
pos ex(cnt),ey(cnt) : gmode 2 : gcopy 1,0,128,64,64 ;敵2の表示
return
*************************************
HSP3.0使用 画像は上の画像を使用

動かすとこんな感じ
time.jpg

まずgtimeという変数を使って時間の概念を導入する。gtimeはメインループ1回ごとに1増えていく。
例えばgtimeが10の時に敵1を任意の場所へ表示、gtimeが20の時に敵2を任意の場所へ表示・・・
と言った感じで1面分の敵を全て書いてしまえば(タイムテーブルと言うらしい)思い通りに敵を出現できる。
いやー、この遊々窓々さんのスプリクト見た時は、おお!と感動してしまいました。(こんな事でと思われるかもしれませんが(汗))

簡単にスプリクトの説明をすると、まずタイムテーブルを読みに行って、そこで敵の座標などを決定。
んで敵の数だけ生成を行って、移動させて表示。
って文章だと簡単だけど、こんなの思いつきませんって(笑)
まだ、敵のアルゴリズムやアニメーションなど全然出来てませんが、すげーレベルアップしたような気になりました^^

PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Twitter
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]