まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ゲームのリプレイ機能は是非とも導入したいと思っていたのですが、なんとなく非常にややこしいのでは?と思っていました。
それにゲーム自体出来ていないし、リプレイなんてまだまだ先の事・・・と思っていたのですが、興味本位で検索してみるとわかりやすく
説明されているサイトを発見しました。
Presys net.さんと言うサイトのHSP-Roomにリプレイのサンプルがあり見てみると、とても簡単に実現出来そうです^^
(他にも色々なサンプルがあり、とても参考になります)
で、それを元に以前作った自機狙いサンプルを改造してリプレイ機能を足してみました↓
*************************************
*get_mode
;リプレイ記録用変数
sdim replay,32000
fname="replay1.dat"
timer=0;ゲームタイマー
dialog "「はい」:ゲームプレイ/「いいえ」:リプレイ再生",2
if stat=6 : playmode=0
if stat=7 : playmode=1 : gosub *load_data
*strat
screen 0,240,320,0,0,0 ;メインウインドウ0を240×320で用意
px=112:py=304 ;自機の初期位置
ex=0:ey=10 ;敵の初期位置
etx=0:ety=10 ;敵弾の初期位置
dx=8:dy=8 ;敵の移動量
dx=1:dy=1 ;敵弾の移動量
*main
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
timer=timer+(timer<32000) ;ゲームタイマー加算
if playmode=0 : gosub *key_input;ゲームプレイ時はキー入力へ
if playmode=1 : gosub *read_replay;リプレイ再生時はリプレイファイル読み込みへ
redraw 0 ;仮想画面を指定
color 0,0,0 ;色に黒を指定
boxf 0,0,240,320 ;指定色で画面を塗りつぶす
pos px,py ;自機の座標指定
color 0,0,255 : mes "▲" ;青で▲を表示
if px<0 :px=0
if px>224 :px=224
if py<0 :py=0
if py>304 :py=304
;敵移動処理
ex=ex+dx ;敵座標に移動量をプラス
if(ex<0)|(ex>224) :dx=-dx ;画面端で反転
ey=ey+dy
if(ey<0)|(ey>304) :dy=-dy
pos ex,ey
color 255,0,0 : mes "■"
;敵弾処理
if etf=0 { ;敵弾が画面にない時{}内の処理を行う
ds=5 ;敵弾の速さ
r=atan(py-ey, px-ex) ;敵と自機との角度を求める
etxv = cos(r)*ds ;敵弾のx軸方向の移動量
etyv = sin(r)*ds ;敵弾のy軸方向の移動量
etf=1 ;弾の存在を有にする
etx=ex : ety=ey ;敵弾の初期座標
}
if etf=1 { ;敵弾が画面に有る時{}内の命令を行う
etx=etxv+etx ;敵弾のx軸の座標指定
ety=etyv+ety ;敵弾のx軸の座標指定
pos etx,ety ;敵弾の座標指定
color 255,255,0 : mes "●"
;敵弾当り判定
if (abs(px-etx)<8)&(abs(py-ety)<8) { ;自機と敵との差が4ドット以下なら{}}内の命令を行う
gosub *gameover};*gameoverに行く
if etx>240 : etf=0 ;敵弾が画面から消えたら存在をなしにする
if etx<0 : etf=0
if ety>320 : etf=0
if ety<0 : etf=0
}
pos 0,0:color 255,255,255:mes ""+ky+"";キー入力を表示
redraw 1 ;画面を更新
await 1
goto *main ;*mainに戻る
*key_input
;自機移動処理
stick ky,15 ;キーボードのチェック
if ky&1 :px-=4
if ky&4 :px+=4
if ky&2 :py-=4
if ky&8 :py+=4
;変数kyをリプレイデータに記録
poke replay,timer,ky
return
*read_replay
;リプレイデータを変数kyに代入
ky=peek(replay,timer)
if ky&1 :px-=4
if ky&4 :px+=4
if ky&2 :py-=4
if ky&8 :py+=4
return
*load_data
bload fname,replay,32000;replayデータにfnameをロード
wait 10
return
*gameover
if playmode=0 {
bsave fname,replay,32000;fnameにreplayデータをセーブ
wait 10
}
goto *get_mode
*************************************
HSP3.0使用
実行すると、まずダイアログが出てきてゲームプレイかリプレイ再生かを聞いてきます。
で、ゲームプレイ開始で敵弾に当るとゲームオーバーでダイアログが出てきてゲームプレイかリプレイ再生のどちらかを選ぶループになっています。
実行するとこんな感じ↓
当初、参考にさせて頂いたサンプルがHSP2.6用だったので、HSP3.0とは記述が違い悩みました(汗)
(特にpeekの記述方法が違うのに全然気づかず悩みました^^;)
基本的な考え方は、ゲーム時間の変数timerとキー読み込みの為の変数kyとを同期させて変数replayに記録するって感じでしょうか?
こんな簡単な記述だけでリプレイ機能が出来るとは夢にも思っていなかったので、ちょっと感動してしまいました^^
といっても、敵の動きに乱数を使った場合などはどうするのかは、まだ良くわかってませんので
ちゃんとしたリプレイ機能には程遠い感じもしますが(汗)
それにゲーム自体出来ていないし、リプレイなんてまだまだ先の事・・・と思っていたのですが、興味本位で検索してみるとわかりやすく
説明されているサイトを発見しました。
Presys net.さんと言うサイトのHSP-Roomにリプレイのサンプルがあり見てみると、とても簡単に実現出来そうです^^
(他にも色々なサンプルがあり、とても参考になります)
で、それを元に以前作った自機狙いサンプルを改造してリプレイ機能を足してみました↓
*************************************
*get_mode
;リプレイ記録用変数
sdim replay,32000
fname="replay1.dat"
timer=0;ゲームタイマー
dialog "「はい」:ゲームプレイ/「いいえ」:リプレイ再生",2
if stat=6 : playmode=0
if stat=7 : playmode=1 : gosub *load_data
*strat
screen 0,240,320,0,0,0 ;メインウインドウ0を240×320で用意
px=112:py=304 ;自機の初期位置
ex=0:ey=10 ;敵の初期位置
etx=0:ety=10 ;敵弾の初期位置
dx=8:dy=8 ;敵の移動量
dx=1:dy=1 ;敵弾の移動量
*main
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
timer=timer+(timer<32000) ;ゲームタイマー加算
if playmode=0 : gosub *key_input;ゲームプレイ時はキー入力へ
if playmode=1 : gosub *read_replay;リプレイ再生時はリプレイファイル読み込みへ
redraw 0 ;仮想画面を指定
color 0,0,0 ;色に黒を指定
boxf 0,0,240,320 ;指定色で画面を塗りつぶす
pos px,py ;自機の座標指定
color 0,0,255 : mes "▲" ;青で▲を表示
if px<0 :px=0
if px>224 :px=224
if py<0 :py=0
if py>304 :py=304
;敵移動処理
ex=ex+dx ;敵座標に移動量をプラス
if(ex<0)|(ex>224) :dx=-dx ;画面端で反転
ey=ey+dy
if(ey<0)|(ey>304) :dy=-dy
pos ex,ey
color 255,0,0 : mes "■"
;敵弾処理
if etf=0 { ;敵弾が画面にない時{}内の処理を行う
ds=5 ;敵弾の速さ
r=atan(py-ey, px-ex) ;敵と自機との角度を求める
etxv = cos(r)*ds ;敵弾のx軸方向の移動量
etyv = sin(r)*ds ;敵弾のy軸方向の移動量
etf=1 ;弾の存在を有にする
etx=ex : ety=ey ;敵弾の初期座標
}
if etf=1 { ;敵弾が画面に有る時{}内の命令を行う
etx=etxv+etx ;敵弾のx軸の座標指定
ety=etyv+ety ;敵弾のx軸の座標指定
pos etx,ety ;敵弾の座標指定
color 255,255,0 : mes "●"
;敵弾当り判定
if (abs(px-etx)<8)&(abs(py-ety)<8) { ;自機と敵との差が4ドット以下なら{}}内の命令を行う
gosub *gameover};*gameoverに行く
if etx>240 : etf=0 ;敵弾が画面から消えたら存在をなしにする
if etx<0 : etf=0
if ety>320 : etf=0
if ety<0 : etf=0
}
pos 0,0:color 255,255,255:mes ""+ky+"";キー入力を表示
redraw 1 ;画面を更新
await 1
goto *main ;*mainに戻る
*key_input
;自機移動処理
stick ky,15 ;キーボードのチェック
if ky&1 :px-=4
if ky&4 :px+=4
if ky&2 :py-=4
if ky&8 :py+=4
;変数kyをリプレイデータに記録
poke replay,timer,ky
return
*read_replay
;リプレイデータを変数kyに代入
ky=peek(replay,timer)
if ky&1 :px-=4
if ky&4 :px+=4
if ky&2 :py-=4
if ky&8 :py+=4
return
*load_data
bload fname,replay,32000;replayデータにfnameをロード
wait 10
return
*gameover
if playmode=0 {
bsave fname,replay,32000;fnameにreplayデータをセーブ
wait 10
}
goto *get_mode
*************************************
HSP3.0使用
実行すると、まずダイアログが出てきてゲームプレイかリプレイ再生かを聞いてきます。
で、ゲームプレイ開始で敵弾に当るとゲームオーバーでダイアログが出てきてゲームプレイかリプレイ再生のどちらかを選ぶループになっています。
実行するとこんな感じ↓
当初、参考にさせて頂いたサンプルがHSP2.6用だったので、HSP3.0とは記述が違い悩みました(汗)
(特にpeekの記述方法が違うのに全然気づかず悩みました^^;)
基本的な考え方は、ゲーム時間の変数timerとキー読み込みの為の変数kyとを同期させて変数replayに記録するって感じでしょうか?
こんな簡単な記述だけでリプレイ機能が出来るとは夢にも思っていなかったので、ちょっと感動してしまいました^^
といっても、敵の動きに乱数を使った場合などはどうするのかは、まだ良くわかってませんので
ちゃんとしたリプレイ機能には程遠い感じもしますが(汗)
PR
この記事にコメントする
無題
順調に進んでおられますね^^
羨ましいかぎりです
こちらはボスを作っておりまして
各部品が壊れるようにしたところ
どうもうまくいきません^^;
それと今更ながらktさんのように分けて作れば
良かったと悔やんでます
頭から全部纏めて作ってるのでエラー直すのすごく大変!!
>乱数
たしかに困りますよねえ、メジャーなゲームでも
ランダムっぽい処理は普通に見受けられますし
どうやってるんでしょうか???
やはり毎回の数値を記憶させてるんですかね
羨ましいかぎりです
こちらはボスを作っておりまして
各部品が壊れるようにしたところ
どうもうまくいきません^^;
それと今更ながらktさんのように分けて作れば
良かったと悔やんでます
頭から全部纏めて作ってるのでエラー直すのすごく大変!!
>乱数
たしかに困りますよねえ、メジャーなゲームでも
ランダムっぽい処理は普通に見受けられますし
どうやってるんでしょうか???
やはり毎回の数値を記憶させてるんですかね
無題
こんにちは。
私が以前作ったリプレイ機能だと、ランダム用に日時を保存してそれを元に乱数を作ってました。
http://gamdev.org/up/img/5266.lzh
http://www5.atwiki.jp/yaruhara/pages/32.html
私が以前作ったリプレイ機能だと、ランダム用に日時を保存してそれを元に乱数を作ってました。
http://gamdev.org/up/img/5266.lzh
http://www5.atwiki.jp/yaruhara/pages/32.html
無題
ふろんてあさん>
いえいえ、順調にいってないのでリプレイファイルの保存なんて事をやってたりします(汗)
気分転換していかないとモチベーション続きません^^;
私も最初は全部纏めて作っていたのですが(速度的に有利かな?と思いまして)、後で見てわけがわからなくなったので別々に分けて書くようにしました。
それでも、頭がこんがらがってますが・・・
Leighさん>
早速プレイさせてもらいましたが、ちゃんとランダムでもリプレイ出来るんですね〜^^
でも、私の知らない命令がいっぱい使ってあって全然理解出来なかったので、じっくりと解析?して自分のスクリプトに応用させてもらいます!
アドバイス有難う御座いますm(_ _)m
いえいえ、順調にいってないのでリプレイファイルの保存なんて事をやってたりします(汗)
気分転換していかないとモチベーション続きません^^;
私も最初は全部纏めて作っていたのですが(速度的に有利かな?と思いまして)、後で見てわけがわからなくなったので別々に分けて書くようにしました。
それでも、頭がこんがらがってますが・・・
Leighさん>
早速プレイさせてもらいましたが、ちゃんとランダムでもリプレイ出来るんですね〜^^
でも、私の知らない命令がいっぱい使ってあって全然理解出来なかったので、じっくりと解析?して自分のスクリプトに応用させてもらいます!
アドバイス有難う御座いますm(_ _)m
カレンダー
10 | 2024/11 | 12 |
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が特に好きで、並木学氏は最高!
ブログ内検索
最古記事