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

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

今まで使っていた爆発パターンが、ちょっと気に入ってなかったので変更してみました。
0512.GIF
ちょっとオレンジの要素を多くして爆破回数も増やし、コマ数も16から24個に変更。
Detonation v1.2にて作成しています。
今まで使っていたのはコレ↓
0513.GIF
単純に1回爆破させていただけなので動きが単純ですね。

で、ゲームに反映させるとこんな感じです。
WS000491.JPG
爆破画像自体の大きさも大きくしたのですが、あまりやりすぎると敵弾等が見えにくくなるので
(すでに見にくいですが^^;)爆破方向や光度なんかも良く考えて発生させないといけませんね。
でも、爆破は派手な方が爽快感があると思うので、その辺のバランスが難しいです。
PR
先日作成したリプレイプログラムを元にリプレイ機能を実装してみました。
s-WS000485.jpg
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1241894228

ゲーム終了時にファイルを保存するかどうか聞くようにしてみました。
s-WS000486.jpg
とりあえず、家にあるパソコンではズレる事無く動いているようなのですが、ちょっと不安なので
普通に実行出来る物をアップロードしましたので、どなたかお暇な時にでも検証して頂けると
助かります。
ダウンロードはコチラ↓
tstg_01実行ファイル(右クリック→対象をファイルに保存で保存して下さい)

解凍して出来たファイルのship01.exeを実行するとゲームが動きます。
REPLAYを選択後Zキーでリプレイ開始です。
スペースキーを押すと早送り(Vsyncを待たない)出来ます。
ちゃんと再生されたとすると
スコア   23600
g_gtime 5714
で終了するはずです。
尚、配列変数を10000までしか確保してませんので、g_gtimeが10000以上になるとプログラムが
誤作動するかもしれませんので注意して下さい。

リプレイを考える上で乱数の扱いをどうしようかと思ったのですが、これはSRand関数を使う事で
解決出来ました。
例えばSRand(10);と記述しておけば、GetRand関数で選ばれる数字は常に同じになるんです。
なので、この(10)の数字を記憶させておけば良いって事ですね。
現状ではとりあえずSRand(10);として乱数は固定しています。

ただ、ふと思ったのですが乱数など使わずに、自機の座標やスコアなんかを足したり引いたり
割ったり掛けたりすれば、乱数っぽく出来るのではないか?と。
極力リプレイがズレそうな原因となりそうな物は排除したいので、一度試してみようかと思ってます。
リプレイ機能を実装しようと思って、まずは簡単なリプレイ保存&再生プログラムを作ってみました。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1241814869
このプログラムを動かすと、まず録画か再生かを聞いてきます。
s-WS000483.jpg
Zキーもしくはジョイスティックの1ボタンを押すと録画
Xキーもしくはジョイスティックの2ボタンを押すと再生
↑↓←→キーで自機移動です。
s-WS000484.jpg
g_gtimeが500になると、リプレイ選択画面に戻ります。
リプレイファイルはreplay_data.datファイルとしてルートフォルダに保存されます。

で、まずリプレイを保存する方法をどうしようかと思ったのですが、以前ジョイパッドに対応させようと
した時にGetJoypadInputState関数でキーの状態を数字で表示出来る事がわかりました。
例えば↑キーを押していたら8
Zキー(ボタン1)を押していたら16
と言う感じ。
更に、↑キーとZキーを押していた場合は8+16の24が返ってきます。
なので、こんな感じで↓
int key;
key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
と記述すれば、変数keyにキーの状態が入力されるわけです。
この変数keyをゲームカウンタ毎に保存出来れば、リプレイが実装出来るのでは?
と思い作ってみました。

方法としては、配列変数を使って保存する方法で、例えば
int g_replay[1000];
として変数g_replayを1000個作ります。
で、key = GetJoypadInputState(DX_INPUT_KEY_PAD1);として
ゲームカウンタ用の変数g_gtimeを宣言して、g_gtimeは1ループに1回プラスしていきます。
で、録画時はg_replay[g_gtime] = key;とすれば、1ループするごとにg_replayにキー情報が
保存されますし、再生時はkey= g_replay[g_gtime];とすれば、1ループごとにキー情報を
読み込む事が出来ます。

とりあえず、コレで録画と再生は出来たのですが、このままだとゲームが終了する度にリプレイ記録
も消えてしまうので、データの保存を行う必要があります。
コレはfopen関数とfclose関数を使って、ファイルに保存出来るようにしました。
ファイルの保存方法は以前書いたデータの保存方法と同じなのですが、配列変数の保存方法が
最初わからずに苦労しました^^;
で、本やネットを調べてみたら、 fwrite( g_replay, sizeof(int), 1000, rp ) ;と言う感じで書けば
上手く動いてくれました。
sizeof(int)がデータのサイズで1000がデータの最大数って事みたいです。
例えばdouble g_replay[5000];だったら
fwrite( g_replay, sizeof(double), 5000, rp ) ;と書けば良いみたい。

読み出しも保存と同じでfread( g_replay, sizeof(int), 1000, rp ) ;と書けばOKでした。

とりあえず、コレで基本的なプログラムは出来た(と思いたい)ので、コレを元に作成中のゲームに
リプレイを組み込もうと思っているのですが、ちゃんと動いてくれるのか凄く不安です(汗)
関数の中でローカル変数を宣言すると関数を呼び出す度に初期化されるので
値を保持したい時には使えずに、グローバル変数を使っていました。
例えばこんな感じ
************************************************************************
test(){
int i;
i++;
printf( "%d\n", i );
}

int main(){
while(1){
test();
}
}
************************************************************************
コレを実行しても、test関数を呼び出す度にiが初期化されてしまうので変数iはずっと1のままです。
なので、今までだとiをグローバル変数として宣言して対応していました。
************************************************************************
int i;

test(){
i++;
printf( "%d\n", i );
}

int main(){
while(1){
test();
}
}
************************************************************************
変数iをグローバル変数とする事で、変数iの値はプラスされつづけます。

しかし、ゲーム作成の事を考えるとグローバル変数を沢山使うのは得策ではありません。
で、何か良い方法は無いものかと思っていたのですが、良い方法がありました^^
静的変数(スタティック変数)を使う方法で、変数の宣言の時にstaticと書くだけ。
こうする事で、ローカル変数として宣言しても値が消える事はありません。
************************************************************************
test(){
static int i;
i++;
printf( "%d\n", i );
}

int main(){
while(1){
test();
}
}
************************************************************************
こんな感じでstatic int i;と宣言すれば、関数内で宣言した変数でも値はプラスされ続けます。
この方法を使えばグローバル変数を使う必要がないので、プログラムがわかりやすくなりますね。
ただ、静的変数として宣言すると値は保持されますが、他の関数からは参照出来ないみたいなので
その辺の扱いには注意が必要そうです。
ケツイのアレンジアルバムがケイブより発売されるとの事で公式ページで視聴曲が公開されています。
そのアレンジャー群が豪華すぎてwktkしまくりです。
**公式ページより抜粋**
01.DOOMSDAY Select (なるけみちこ)
02.INTERCEPTION-喧騒の街(渡部恭久)
03.DARKENED(兄貴・葉山宏治)
04.BREAKTHRU(梅本竜)♪
05.SUBURB - 機甲の緑(TECHNOuchi)
06.CANAL FLEET - 夕暮の艦隊(与猶 啓至)
07.DEFENSIVE LINE - 闇に潜む(Virt)♪
08.EVAC INDUSTRY - 審判の日(海田明里)
09.SCAFFOLD(山中季哉)
10.NO REMORSE(Wasi303)
11.AFTERGLOW(山田一法)  
12.LAST WORDS(岩垂徳行 Noriyuki Iwadare)♪

全12曲のアレンジアルバムとなるのですが、個人的に気になったアレンジャーの担当したゲームを
紹介してみます。
渡部恭久「メタルブラック」

オープニングからスタート~ステージ1と繋がる曲がカッコよすぎます。

TECHNOuchi「スペースマンボウ」


与猶 啓至「ニューラルギア」

1:35辺りからのステージ1の曲がカッコイイです。OPも良いですが。

山中季哉「スタークルーザー」

このゲームのオープニングは何度聴いても泣けます。ナイトアームズもオススメです。

Wasi303「サイヴァリア」

と言った感じで、アレンジャーが楽しみな面々ばかりなのに加えて、大好きなケツイの曲のアレンジ
アルバムって事なので買わない訳にはいきませんね^^
Twitter
カレンダー
07 2026/08 09
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 31
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]