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

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

ステージ作製を進めて行こうかと思ったのですが、それよりも先にゲームシステムを
もっと作り込んでからでないと、後で調整するのが大変そうだと思ったので
入れようと思っていたプレイヤーセレクトを考えてみました。

あまり選べる種類が多いのは好きではないので、選択は2種類にしようかと思っています。
もちろん、攻撃ワイド&自機低速タイプと攻撃直進&高速タイプです(笑)
で、攻撃ワイドの方は現在のオプションが自機の周りを回転するギミックで良いかと思っているのですが
攻撃直進の方は、グラディウスのオプションのような動きにさせたいと思って
色々と考えてみたのですが良い方法も浮かばず、検索してみたら
とても良いスクリプトを公開されているページを発見しました^^

ZEROQOOO.comさんと言うページのHSPプログラミング講座にある
サンプルスクリプト集にグラディウス風のオプションを動かすスクリプトがありました。

それを参考に簡単なスクリプトを作って考えてみました↓
*********************************************
 screen 0,240,320,0,0,0 ;メインウインドウ0を240×320で用意
 px=112:py=304 ;自機の初期位置
 dim Opx, 100
 dim Opy, 100
 repeat 100
 Opx.cnt=px
 Opy.cnt=py
 loop

*main
 redraw 0 ;仮想画面を指定
 color 0,0,0 ;色に黒を指定
 boxf 0,0,240,320 ;指定色で画面を塗りつぶす

;オプション移動処理
*Option
 Opx. 0 = px : Opy. 0 = py    ; 自機の座標を、代入
 if (vx=0) : if (vy=0) { goto *abc }   ; ※ここの先頭に「;」を付けるとトレース
 a = 79 : b = 80
 repeat 80
  Opx. b = Opx. a    ; 1~80のオブジェクト代入
  Opy. b = Opy. a
  a -
  b -
 loop
*abc
 color 255,90,0
 pos Opx. 15, Opy. 15 : mes "▲" 
 pos Opx. 30, Opy. 30 : mes "▲"
 pos Opx. 45, Opy. 45 : mes "▲"
 pos Opx. 60, Opy. 60 : mes "▲"

;自機移動処理
 vx=0 : vy=0
 stick ky,15 ;キーボードのチェック
 if ky&1 : px-=4 : vx=1 : if px<0 :px=0
 if ky&4 : px+=4 : vx=1 : if px>224 :px=224
 if ky&2 : py-=4 : vy=1 : if py<0 :py=0
 if ky&8 : py+=4 : vy=1 : if py>304 :py=304
 pos px,py ;自機の座標指定
 color 0,255,255 : mes "▲" ;青で▲を表示

 redraw 1 ;画面を更新 
 await 1
 getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
 goto *main ;*mainに戻る
*********************************************
hsp 3.0使用

このスクリプトを動かすと↓こんな感じ
2007_5_51.jpg
青い▲が自機で、オレンジの▲がオプションです。自機の動きに合わせて
くっついてきます^^

考え方としては、自機の座標を50フレーム分くらい配列変数に覚えさせて
その配列変数から表示させたい部分の配列を取り出して表示するって感じ。

例えば自機の座標がx=200、y=200だったとします。
オプションの初期位置も最初は同じなので、オプションの座標をOpx.cnt、Opy.cntとして
repeatで↓のように設定します。
repeat 100
 Opx.cnt=px
 Opy.cnt=py
 loop
回数は100でなく、使う配列分で良いのですが、気分的な問題です^^;
で、pos px,py : mes "▲"//pos Opx. 15, Opy. 15 : mes "▲" で▲を表示すると
自機とオプションは同じ位置に表示されますよね。

次に自機がx方向に4ドット、y方向に4ドット動いたとします。
すると自機座標はpx=204 : py=204です。
オプションの方はと言うと↓の部分で計算しています。
*********************************************
 Opx. 0 = px : Opy. 0 = py    ; 自機の座標を、代入
 a = 79 : b = 80
 repeat 80
  Opx. b = Opx. a    ; 1~80のオブジェクト代入
  Opy. b = Opy. a
  a -
  b -
 loop
pos Opx. 30, Opy. 30 : mes "▲"
*********************************************
repeat 80のところが肝です。
このリピートをバラして考えてみると(x軸部分だけで考えてみます)
Opx. 80 = Opx. 79
Opx. 79 = Opx. 78
Opx. 78 = Opx. 77



Opx. 3 = Opx. 2
Opx. 2 = Opx. 1
Opx. 1 = Opx. 0
と言う事をやっている訳です。

最初にOpx. 0 = px : Opy. 0 = py   として自機の座標を代入しているので
自機が移動した1ループ目は
Opx. 1のみ204になります。
次に自機が移動した2ループ目は
Opx. 1とOpx. 2が204になります。
コレの繰り返しで最終的にOpx. 80が204になるって事です。

でオプションの表示をpos Opx. 30, Opy. 30 : mes "▲"とかにすれば
自機移動より30フレーム遅れてオプションが自機の動きを追って
動かすようにする事が出来ます。

上記を踏まえて、プレイヤーセレクト用の自機スクリプトを作ってみました↓
グラディウス風オプションスクリプト

動かすとこんな感じ↓
2007_5_5.jpg
自機の動きに合わせて、オプションも移動します。
でも、オプション4機は強すぎかな?と思ってどうしようか考え中です^^;

そして、このスクリプトを応用すれば誘導レーザーや蛇のような敵も作れそうで
良い感じです^^

PR
先日公開したSolid State SURVIVORですが、私の開発マシン(P4M1.7G/16MB)では
弾がいっぱい出た時などにFPSが50~55くらいまで落ちていました。

なんとかならんもんかなぁ?と思ってどうすれば速くなるかな?と考えてみたところ
repeat回数を減らすのが良いのでは?と思い、方法を色々と考えてみました。

まず、私は一つ大きな勘違いをしていました。
配列変数の名前をタイプ値ごとに変えなければならないと思っていたのです。
例えば、空中敵のタイプ値は2で配列変数はex.enemy。
地上敵のタイプ値は32で配列変数はex.tijyouといった具合に分けていました。
これでも動く事は動くのですが、当り判定などは別々に行わなければならず
効率的ではありません。

es_find命令はタイプ値を足して検索出来るのですから、地上敵と空中敵のタイプ値を
足して検索すれば、一回の検索ですむので効率的と言えます。
このように、まとめれる検索は配列変数を統一してまとめて検索するようにしたのが第一点。

で、その検索も0から始めるのではなく、検索ごとにスプライト番号を指定し
設定したスプライト番号を超えたらbreakするようにしました。
↓こんな感じ
////////////////////////////////////////////////////////////
jikitama=609
 repeat
  es_find jikitama,4,jikitama
  if jikitama=-1 : break
 色々な処理
  jikitama++
  if jikitama>670 : break
 loop
////////////////////////////////////////////////////////////
こうする事によって無駄なrepeatが減った(はず)
でも/ if jikitama=-1 : break /でrepeatを抜けている気もするのですが^^;

それと、今まではスプライトの使用数をその都度足して適当に設定していた為
1540個のスプライトを使用する設定になっていましたが
これも無駄な検索の要因になっているはずです。
例えば、今までだと敵弾の数を最大499発までに設定していましたが
実際はそんなに撃つ場面はありません。
(と言うか処理落ちしすぎるので私の技術では無理)
でも499発に設定していたら、かならず499回は検索しないといけません。
なので、スプライト番号をキチンと考えて、なるべく無駄のないように分配し
総スプライト数を1024に減らしました。

それと、スプライトの有効範囲も大きく取っていたのですが、これも画面外の
見えない所でスプライトは動いているので、負担になります。
なので、場面場面でスプライト有効範囲を切り替えるようにし、なるべく
無駄に画面外で動かないようにしました。

で、結果は殆どの場面でFPS60を保ってくれるようになりました^^
キーコンフィグで設定を変えるとゲームプレイ中は良いのですが、ゲームを終了してしまうと
設定が元に戻ってしまいます。
これを防ぐ為には予め設定ファイルを作っておいて設定を変更したら、設定ファイルを書き換えし
ゲームプレイ時に読み込めば良いです。

で、この設定を覚えさせておくのがiniファイルなんですよね。
(別にiniファイルにこだわる必要はないのですが、なんとなく設定ファイルと言えばiniかなと思いまして^^;)

ですが、HSPには標準でiniファイルを操作する命令はありません。
どうするんやろ?と思って検索してみた所、HSPルームさんのHSP研究室で
詳しく解説されていました。
方法としてはwindowsのAPIを使用して保存できるようにするみたい?ですが
ここに便利なモジュールが掲載されていたので、使用させてもらいました^^
saveini、loadini、fileiniの3つの命令が使えるようになり。保存と読み込みが可能になります。

で、簡単なスクリプトを作って考えてみたのですが、今日このスクリプトをみたら
もうちょっと付け足したら簡単なゲームになるなぁ・・・と思って、簡易的なゲームを作ってみました↓
Awakening Blur Ver1.0

タイトル画面
2007_4_300.jpg

通常時プレイ画面
2007_4_301.jpg

覚醒時プレイ画面
2007_4_302.jpg

スコアアタック型のゲームで敵を倒すごとにレベルが上がって行きます。
で、覚醒ボタンをつけて覚醒時はモーションブラーするようにしました^^
覚醒時に敵を倒すと、弾が得点アイテムにかわります。
レベル10でクリア
十字キーで自機移動、ボタン1で弾連射&スピードダウン、ボタン2で覚醒
ボタンを押していない時は勝手に弾が発射されます。
簡単な曲もついてます。(TSS使用)

キーコンフィグで設定を変えてプレイしたリプレイデータもちゃんと再生できるようにする為に
リプレイデータにキー情報も覚えさせるようにしました。

突貫工事で作ったのでバグがある可能性大ですので、おかしい所があったら
教えて頂けると嬉しいです^^
ジョイスティックのコンフィグを実装しようと思って、まずck_joyforceの説明書を読んでみました。
すると「● ck_joyconfig 0~15, 0~, (0)~ ;// ck_joystick命令で取得されるキーコードを変更する」
と言う命令を見つけ、これを使えばエエんかな?と思い色々と試してみたのですが
どうも上手く行きませんでした。

で、ここで頭をもう一度最初に戻って考えてみました。
例えば、ボタン1で弾を発射させる場合、スクリプトは↓みたいな感じで書きますよね。
ck_joystick ky,2048
if ky&2048 : {hassya=1}else{hassya=0}
これをボタン2で発射させたいと思ったら↓になります。
ck_joystick ky,4096
if ky&4096 : {hassya=1}else{hassya=0}

つまり、この数字の部分を変数にしてキーコードをその変数に入れておけば
自由に発射キーを変更する事が出来るようになると言う事です。
ck_joystick ky,key1
if ky&key1 : {hassya=1}else{hassya=0}
こんな感じで書いて、key1に2048とか4096とか8192とかが入れば良いって事です。
これを踏まえて以前作ったリプレイのスクリプトを流用して
簡単なキーコンフィグスクリプトを作ってみました↓
キーコンフィグスクリプト

これを実行すると最初に発射キーにしたいボタンを押すと
そのキーが発射キーになりゲームがスタートします。
2007_4_28.JPG

まず最初にココでキーの入力を待っています↓
 ck_joystick ky
 key1=ky
 if key1>2047 : goto *main
変数key1にジョイスティックで押されたボタンのキーコードが入力されます。
なんで2047以上にしてるかと言うと、ジョイスティックの十字キー以外のボタンのキーコードが
2048以上だからです。
そうしないと、十字キーで発射って言う設定にも出来てしまうので・・・

で、メインループでは↓のようにしてキーのチェックをすれば
自由にキーの変更が出来るようになりました^^
ck_joystick ky,15+key1
if ky&1 :px-=3
if ky&4 :px+=3
if ky&2 :py-=3
if ky&8 :py+=3
if ky&key1 {hassya=1}else{hassya=0}

でも、この方法だとキーボードの場合の変更はZXCVしか変更できません。
ck_joyconfig命令が使いこなせたらもっと色々と設定出来るんだと思うんですが
まぁ、キーボードの場合はZXCVが変更できれば十分かな?と自分に良いように考えてます(笑)
ここ一ヶ月の間に行った変更について簡単に書いてみたいと思います。

オプション画面を新設
キーコンフィグを実装
Vsync待ちの変更を実装
サウンドの音量変更を実装
サウンドテストを実装
スプライトの使用数を減らした(高速化)
iniファイルを使用して設定を保存できるようにした
ゲーム中の一旦停止(ポーズ処理)を実装

これらの変更を行ったファイルをアップしてみました↓一応ソースファイルも付いてます。
Solid State SURVIVOR Ver1.2(右クリック→対象をファイルに保存で保存して下さい)

サウンドテストのレベルメータの実装がまだ上手くいっていなくて
このメーターは録音側の方の音量を表示しているので、パソコンの設定によっては
メーターは動きません^^;
なんとかしたいんですが、悩み中です・・・
2007_4_26.jpg
それと、TSSファイルの再生が途切れる場合があったのですが、これはVsyncを待つ設定にしていると
途切れる場合があり、Vsyncを待たない設定にしていると音飛びが発生しないので
どちらか選択できるようにしました。
この音飛びもパソコンによっては全然発生しないし、良くわからないんですよね・・・

あと、ポーズ処理を入れるのを忘れていたので、これも実装しました↓
2007_4_261.jpg
ポーズを押すと、なつかしの「アノ音」がするようにしてます^^この音はTSSCPで作って録音してみました。

その他の変更については、また後日詳しく書こうと思ってます。
Twitter
カレンダー
04 2025/05 06
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]