まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
さー次は敵を作ろう!と思ってとりあえず敵を作ってみた。

これも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使用 画像は上の画像を使用
動かすとこんな感じ

まずgtimeという変数を使って時間の概念を導入する。gtimeはメインループ1回ごとに1増えていく。
例えばgtimeが10の時に敵1を任意の場所へ表示、gtimeが20の時に敵2を任意の場所へ表示・・・
と言った感じで1面分の敵を全て書いてしまえば(タイムテーブルと言うらしい)思い通りに敵を出現できる。
いやー、この遊々窓々さんのスプリクト見た時は、おお!と感動してしまいました。(こんな事でと思われるかもしれませんが(汗))
簡単にスプリクトの説明をすると、まずタイムテーブルを読みに行って、そこで敵の座標などを決定。
んで敵の数だけ生成を行って、移動させて表示。
って文章だと簡単だけど、こんなの思いつきませんって(笑)
まだ、敵のアルゴリズムやアニメーションなど全然出来てませんが、すげーレベルアップしたような気になりました^^
これも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使用 画像は上の画像を使用
動かすとこんな感じ
まずgtimeという変数を使って時間の概念を導入する。gtimeはメインループ1回ごとに1増えていく。
例えばgtimeが10の時に敵1を任意の場所へ表示、gtimeが20の時に敵2を任意の場所へ表示・・・
と言った感じで1面分の敵を全て書いてしまえば(タイムテーブルと言うらしい)思い通りに敵を出現できる。
いやー、この遊々窓々さんのスプリクト見た時は、おお!と感動してしまいました。(こんな事でと思われるかもしれませんが(汗))
簡単にスプリクトの説明をすると、まずタイムテーブルを読みに行って、そこで敵の座標などを決定。
んで敵の数だけ生成を行って、移動させて表示。
って文章だと簡単だけど、こんなの思いつきませんって(笑)
まだ、敵のアルゴリズムやアニメーションなど全然出来てませんが、すげーレベルアップしたような気になりました^^
PR
この記事にコメントする
カレンダー
03 | 2025/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/04)
(12/26)
(12/25)
(11/17)
(10/11)
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
最古記事