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

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

先日作成したガレッガ風?の爆破処理を追加してみました。
s-WS000431.jpg
ちょっと爆破が派手過ぎますが、暫定と言う事で^^;
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1241113201

この爆破を追加するにあたって悩んだのが構造体の配列の宣言方法です。
まず敵自体を構造体を使って管理しているのですが、敵は複数存在するので
配列変数を使って管理しています。
こんな感じ。
typedef struct{//敵構造体
double ex,ey;//座標
}enemy_t;
enemy_t enemy[10];//構造体用
この場合はenemy[n].exとenemy[n].eyを10個用意したって事です。

次に爆発を考えてみます。爆発は敵1対に対して複数個必要なので
配列の配列、つまり二次元配列で管理する必要があります。
記述するとこんな感じ。
typedef struct{//敵構造体
double ex,ey;//座標
double bx[10],by[10];//爆破座標xy
}enemy_t;
enemy_t enemy[10];//構造体用
この場合は
enemy[n].exとenemy[n].eyを10個
enemy[n].bx[n]とenemy[n].by[n]を100個(10*10=100なので)用意したって事になるんです。
このenemy[n].bx[n]という記述方法が最初わからずに苦労しました^^;

で、後は爆発処理を追加するだけなのですが、二次元配列となってしまうと頭がこんがらがって来て
あーでもない、こーでもないと色々と試しながら、やっと出来たという感じでした。

ただ、現在の仕様では敵の大きさが変わると爆破位置がズレてしまうので、もうちょっと汎用出来る
ような関数にしたいと思っているのですが、横長の敵や縦長の敵の場合の処理をどうするかとか、
全然違うサイズの敵の場合なんかを考えると、あまり汎用性の拘らずに別々の関数にした方が
良いのかな~?なんて考えています。
でも、分けすぎると後で見た時に、なんじゃこれ?状態になってしまうので難しい所です^^;
PR
バトルガレッガ(鋳薔薇)の爆発処理を真似したくて簡単な爆発発生プログラムを作ってみました。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1241025718
このプログラムを動かすとこんな感じ↓
s-WS000377.jpg
1~5キーを押すと、それぞれ対応した爆発処理を行います。
↑↓←→キーで爆破位置(赤い四角)を移動する事が出来ます。

1キーを押すと上の画像のような感じで、一つの爆発が上下左右に移動していきます。
2キーを押すと円を描いて爆発します。
s-WS000394.jpg
この楕円を描くように広がる処理が出来なくて苦労しました^^;
普通に円を描くように描画するだけなら
移動量x=cos(角度)×速度;
移動量y=sin(角度)×速度;
で移動量を計算して、表示座標にプラスしてやれば良いのですが、楕円となるとそうはいきません。
で、なんやかんやと試していたら
移動量x=cos(角度-任意の数字)×速度;
移動量y=sin(角度-任意の数字)×速度;
と言う感じで、角度から任意の数字を引けば、楕円で表示出来るようになりました。
なんで、そうなるのかは全く理解できてませんが、ちゃんと楕円になっているので良しとしています。

3キーを押すと円を描いて回転しながら爆破します。
s-WS000397.jpg
画像では良くわかりませんね・・・

4キーを押すと、爆破位置から外側に向かって爆破が連なって表示されます。
s-WS000404.jpg
表示半径や、爆破の表示数などもランダムに変わるようにしてみました。
この爆破表示は以前作った事があったので、比較的すぐに出来ました。
考え方としては、まず実際に表示する爆破位置を中心として、円を描くように爆破する表示を作成して
その最初の爆破位置と実際に爆破を表示させる位置との差を計算して
最初の爆破位置を実際に表示する爆破位置にずらして表示させています。
う~ん、上手く文章で書けません^^;

5キーを押すと4の動作に加えて2の動作のように外側にも移動します。
s-WS000407.jpg
トリッキーな動きをするので楽しいです^^
爆破パターンは先日紹介したDetonation v1.2で作成しています。

しかし、このプログラムを作っていて思ったのですが、グローバル変数とローカル変数の使い分けが
どうも良くわかりません。
例えば、爆破の関数を作ったとします。
爆破は数フレームにまたがって処理が行われるので、フレームをまたいで数値を覚えておく変数が
必要ですよね。
でもローカル変数を使うと、呼び出す度に初期化されてしまうので数値を記憶させる事が出来ません。
呼び出す度に初期化されてしまうって事は、フレームをまたいで数値を覚えておく事が出来ないって
事です。
そうなると、グローバル変数を使うしか方法が思いつかないのですが、そうするとグローバル変数を
使いまくらないといけなくなって、プログラムが大変見難くなるんですよね・・・
ポインタとかを使えば良いのかな?と思い作ってみたりするのですが、全く上手く出来ずに
どうしたもんかと思っとります(汗)

デススマイルズIIのロケテが近くで行われていたので行ってみました。

で、到着して早速探したのですが見当たりません。ん???と思って良~く探してみたら
ありました。。。が、誰もプレイしてません(汗)
私のイメージとして、ロケテのゲームってギャラリーが数人はいるイメージだったので
見逃してしまったんですよね。
ちょっと不安になりつつプレイ。
s-P1000209.jpg
このバージョンではウィンディアとスーピィの2種類の自機を選択出来ました。
s-P1000208.jpg
7歳って・・・^^;

今回は基盤が変わったようで、3D表示の2DSTGとなっていました。
s-P1000207.jpg
プレイしながら撮ったので上手く撮れてませんが、背景が3D表示になっています。
システムとしては、デススマイルズIと殆ど変わらない印象。
左右打ち分けとボムとサーチを使って進む感じ。
で、ウィンディアとスーピィで2回づつ程度遊んでみたのですが、何か今までのCAVEのゲームと
比べて違和感ありまくりでした。
とりあえず5月中旬稼動って事ですが、敵の出現位置や弾幕など凄く開発途中な感じがしました。
ボスの攻撃方法や弾幕にも捻りがなく、本当に5月に稼動するのか?といった感じ。
私の遊び方が悪かったのかもしれませんが、正直良いと思える部分が殆どありません^^;
特に残念だったのが3D化。
今までのCAVEのゲームだと、2Dの究極!と言うくらい余計な部分まで作りこんであって
グラフィックでも楽しめたのですが、このロケテバージョンでは書き込みも普通な感じで
あんまり凝っていない印象です。
あと、操作感がもっさりした感じを受けたのも残念でした。隣に虫姫さまふたりがあったので、そちらを
プレイしてみると、かなりキビキビ動いてくれたので、余計に気になりました。
筐体はアストロシティでブラウン管モニタだったのですが、それが原因でしょうか?

s-P1000206.jpg
ステージ選択画面はレベルセレクトが無くステージのみ選択出来ました。
で、結局3面ボスで撃沈。
s-P1000205.jpg
4面があったかどうかはわかりませんが、とりあえず3面から急に難易度があがります。
個人的にはウィンディアよりもスーピィの方が使い易いように感じましたが、そんな事よりも
このゲームが今後の調整で面白くなるのかどうかの方が心配です(汗)

爆破アニメを作る為に今まではMIA's HomePageさんの発色弾を使って作成していたのですが
他に何か良いソフトがないかと思って探してみたらDetonation v1.2と言うソフトを発見したので
早速使ってみました。
s-WS000376.jpg
このソフトは使うのがちょっと難しいので、最初はチュートリアルを見ながら作った方が良さそうです。

まず、爆破を作成する為に使用する色を決める為に32*1ドットの画像を用意します。
(色は画像の大きさによって16~256色まで使える模様)
s-04272.jpg
こんな感じ。(拡大して表示しています)
一番左の色は透明色で、後は右から順に色が変わっていくようです。

次に上の色を使って爆破用の画像を用意します。
s-04271.jpg
この画像は適当に書けば良いみたい。
今回は2回爆発させたかったので、もう一枚用意しました。
s-04273.jpg

で、この用意した画像をColorTransformationとParticleEditerに読み込ませて
色々と設定をいじれば爆破アニメの完成です。
ParticleEditerにはレイヤー機能があり、任意のレイヤーに色んな爆破画像を読み込ませる
事によって、任意回爆発させたり爆発する場所や広がり方などを変化させる事が出来るので
かなり複雑な爆破も作る事が出来ます。
(サンプルフォルダに色々と入っているので、参考にすると良いと思います)

で、この画像を使って作成した爆破がコチラ↓
BOMB1.GIF
最初に丸い爆発が起こってから、X状の爆破に移行しているのがわかると思います。
で、PreviewのSaveボタンで画像を保存すれば、爆破パターンがBMP画像として保存されます。
s-04274.jpg
こんな感じ。
作成する画像の大きさも設定出来るので、かなり重宝しそうな感じ。
自分で爆破画像を書く事は出来ないので、こういうソフトは大変ありがたいですね^^

先日作った文字を画像で表示させる関数を使ってスコア表示をさせようとしたのですが
いくら考えても上手く出来ませんでした。
この関数は、表示にchar型の変数を使っているのですが、スコアは整数(int)型なので
変換(キャスト?)が上手く出来ないんです。
charからintは出来るのですが、intからcharは出来なくはないのですが、色々と難しそうでした。

で、この関数を使うのは諦めて、新しく数字を画像として表示出来る関数を作ろうと思ったのですが
DXライブラリの公式ページにとても良い関数が掲載されていたので、それを広げる感じで
00001234みたいな感じで桁数表示が出来る関数を作ってみました。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1240682957
このプログラムを動かすとこんな感じです↓
s-WS000375.jpg
2づつ数字が足されて行きます。

関数としてはこんな感じ
////////////////////////////////// 数値をグラフィック表示する関数//////////////////////////////////
//引数 表示する数字、x座標、y座標
void NumDraw( int Num ,int x , int y)
{
 int i , BeamWidth , xx ;

 // Numが十進数で何桁になるか調べる
 BeamWidth = 0 ;
 for( i = 10 ; Num >= i ; i *= 10 ) BeamWidth ++ ;
 
 //0を桁数だけ表示
 if( BeamWidth==0 ){
 DrawGraph( x-WIDTH  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*2)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*3)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*4)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*5)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*6)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*7)  , y , NumHandle1[ 0 ], TRUE ) ;
 }

 if( BeamWidth==1 ){
 DrawGraph( x-(WIDTH*2)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*3)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*4)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*5)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*6)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*7)  , y , NumHandle1[ 0 ], TRUE ) ;
 }

 if( BeamWidth==2 ){
 DrawGraph( x-(WIDTH*3)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*4)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*5)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*6)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*7)  , y , NumHandle1[ 0 ], TRUE ) ;
 }
 if( BeamWidth==3 ){
 DrawGraph( x-(WIDTH*4)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*5)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*6)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*7)  , y , NumHandle1[ 0 ], TRUE ) ;
 }
 if( BeamWidth==4 ){
 DrawGraph( x-(WIDTH*5)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*6)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*7)  , y , NumHandle1[ 0 ], TRUE ) ;
 }
 if( BeamWidth==5 ){
 DrawGraph( x-(WIDTH*6)  , y , NumHandle1[ 0 ], TRUE ) ;
 DrawGraph( x-(WIDTH*7)  , y , NumHandle1[ 0 ], TRUE ) ;
 }
 if( BeamWidth==6 ){
 DrawGraph( x-(WIDTH*7)  , y , NumHandle1[ 0 ], TRUE ) ;
 }

 // 画面左上にグラフィックで描画
 // x は数字グラフィックを描く矩形の左端の座標です
 xx = (BeamWidth*-(WIDTH/1000)) * WIDTH ; 
 for( i = 0 ; i <= BeamWidth ; i ++ )
 {
  DrawGraph( x+xx , y , NumHandle1[ Num % 10 ], TRUE ) ;
  xx -= WIDTH ;// 描画X座標を移動
  Num /= 10 ;// 1番下の桁が描画し終わったので一桁下げる
 }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
元々、数字を画像で表示するところまでは出来ていたので、桁数が上がる度に
表示場所を文字画像のx分ずらして、0の表示を一つ減らすようにしただけです。
for文などを使えば、もっと簡潔に纏める事が出来るような気がするのですが
良い方法を思いつきませんでした^^;

これを踏まえて、スコア表示を追加したのがコレ↓
s-WS000374.jpg
大して変わってませんが、ちゃんと敵を倒したらスコアが上がって行きます^^

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]