まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
今までmes命令でウィンドウズに入っていたフォントの文字を表示させていたのですが、それだと人によって入っているフォントの
種類が違うので、自分の思ったように表示されなかったりします。
なので、自分でフォント画像を用意して表示させるようにしようと思って色々と調べた結果、無事表示させる事が出来ました^^

フォントは暫定です。(書くのが一番簡単そうだったので)
具体的にどうするのかと言うと、まずHSPで使用される文字と言うのは全てに文字コードなる物が設定されています。
この文字コードを調べて、画像に変換して表示すると上手く出来ました。
例えば↓このスプリクトを実行してみると・・・
mojicoad="0123456789"
a=peek(mojicoad, 0)
b=peek(mojicoad, 1)
c=peek(mojicoad, 2)
d=peek(mojicoad, 3)
e=peek(mojicoad, 4)
f=peek(mojicoad, 5)
g=peek(mojicoad, 6)
h=peek(mojicoad, 7)
i=peek(mojicoad, 8)
j=peek(mojicoad, 9)
mes "0="+a+""
mes "1="+b+""
mes "2="+c+""
mes "3="+d+""
mes "4="+e+""
mes "5="+f+""
mes "6="+g+""
mes "7="+h+""
mes "8="+i+""
mes "9="+j+""
stop
0=48〜9=57までの数字が表示されます。
これが対応している文字コードになります。(詳しくはHSPフォルダのindexファイルの文字列のひみつに書いてあります)
それを踏まえて、簡単なスプリクトを作ってみました。
************************************
*start
#include "hspdxfix.as"
;■ DirectX 初期化&チェック
dialog "fullscreenで起動しますか?「はい」を選択した場合、画面解像度を640×480に変更します。",2,"Config"
if stat=6:screenmode=0
if stat=7:screenmode=1
es_ini 1124,1124,360;スプライト最大数2048,キャラクタ最大数1024,角度360度
es_screen 640,480,16,0,screenmode,1;directX使用時の解像度640*480
if stat=1 : goto *dxerr1
if stat=2 : goto *dxerr2
goto *setup
*dxerr1
dialog "DirectXの初期化に失敗しました。",1 : end
*dxerr2
dialog "スクリーンの初期化に失敗しました。",1 : end
*dxerr3
es_bye : wait 100
dialog "VRAMの容量が不足しています。",1 : end
*setup
;■ バッファへ画像の読みこみ
buffer 1,160,72,0 ;バッファ作成
pos 0,0 : picload "suuji.gif",1 ;バッファへ読み込み
es_buffer 5,0 ;オフスクリーンバッファへの転送
if stat=1 : goto *dxerr3
gsel 0
es_cls
es_sync
wait 100
*main
es_cls;画面クリア
sc+;スコアを1づつ足す
gosub *hyouji
await 0
es_sync 16
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
goto *main
*hyouji
pos 0,0
es_mes "ESCを押すと終了"
sco=strf("%08d",sc);変数scを8桁の数字にしscoに代入
pos 200,200
es_mes ""+sco+""
mojisu=strlen(str(sco));変数scoを文字列に変換し文字列の長さ(桁数)を調べる
repeat mojisu;桁数だけリピート(このスプリクトでは8回)
coad=str(sco);変数scoを文字列に変換しcoadに代入
moji=peek(coad,cnt);変数coadの文字コードを一桁づつ調べmojiに代入
if moji=48 : mojih=0
if moji=49 : mojih=16
if moji=50 : mojih=32
if moji=51 : mojih=48
if moji=52 : mojih=64
if moji=53 : mojih=80
if moji=54 : mojih=96
if moji=55 : mojih=112
if moji=56 : mojih=128
if moji=57 : mojih=144
pos 200+cnt*16,250;8桁なので8回16ドットづつずらして表示
es_copy 5,mojih,0,16,24;数字表示
loop
return
************************************
HSP3使用 hspdxfix.DLL使用 画像は↓を使用

これを実行すると、標準フォントで書かれた8桁の数字と読み込んだフォントで書かれた数字が表示され1づつ足されていきます。

まず、スコア用の変数scを以前書いたstrf関数にて8桁表示にします。(桁数はいくらでもOKです)
で、それの桁数を調べ一桁づつ文字コードを調べて読み込んだ画像をes_copyで表示させています。
筆者が今作っているゲームが、スコア表示部分にスプライトを使用出来ないようにしているのでes_copyで表示させていますが
スプライトが使える場合は、キャラ番号48〜57に対応する数字画像を読み込ませてes_putなどで表示させれば
もっと簡単に表示出来ると思います。
と、まるで自分で考えたように書いてますが、色んな掲示板やサイトを見回って得た事を書いてるだけです(汗)
まーでも、上手く表示されて良かったです^^
種類が違うので、自分の思ったように表示されなかったりします。
なので、自分でフォント画像を用意して表示させるようにしようと思って色々と調べた結果、無事表示させる事が出来ました^^
フォントは暫定です。(書くのが一番簡単そうだったので)
具体的にどうするのかと言うと、まずHSPで使用される文字と言うのは全てに文字コードなる物が設定されています。
この文字コードを調べて、画像に変換して表示すると上手く出来ました。
例えば↓このスプリクトを実行してみると・・・
mojicoad="0123456789"
a=peek(mojicoad, 0)
b=peek(mojicoad, 1)
c=peek(mojicoad, 2)
d=peek(mojicoad, 3)
e=peek(mojicoad, 4)
f=peek(mojicoad, 5)
g=peek(mojicoad, 6)
h=peek(mojicoad, 7)
i=peek(mojicoad, 8)
j=peek(mojicoad, 9)
mes "0="+a+""
mes "1="+b+""
mes "2="+c+""
mes "3="+d+""
mes "4="+e+""
mes "5="+f+""
mes "6="+g+""
mes "7="+h+""
mes "8="+i+""
mes "9="+j+""
stop
0=48〜9=57までの数字が表示されます。
これが対応している文字コードになります。(詳しくはHSPフォルダのindexファイルの文字列のひみつに書いてあります)
それを踏まえて、簡単なスプリクトを作ってみました。
************************************
*start
#include "hspdxfix.as"
;■ DirectX 初期化&チェック
dialog "fullscreenで起動しますか?「はい」を選択した場合、画面解像度を640×480に変更します。",2,"Config"
if stat=6:screenmode=0
if stat=7:screenmode=1
es_ini 1124,1124,360;スプライト最大数2048,キャラクタ最大数1024,角度360度
es_screen 640,480,16,0,screenmode,1;directX使用時の解像度640*480
if stat=1 : goto *dxerr1
if stat=2 : goto *dxerr2
goto *setup
*dxerr1
dialog "DirectXの初期化に失敗しました。",1 : end
*dxerr2
dialog "スクリーンの初期化に失敗しました。",1 : end
*dxerr3
es_bye : wait 100
dialog "VRAMの容量が不足しています。",1 : end
*setup
;■ バッファへ画像の読みこみ
buffer 1,160,72,0 ;バッファ作成
pos 0,0 : picload "suuji.gif",1 ;バッファへ読み込み
es_buffer 5,0 ;オフスクリーンバッファへの転送
if stat=1 : goto *dxerr3
gsel 0
es_cls
es_sync
wait 100
*main
es_cls;画面クリア
sc+;スコアを1づつ足す
gosub *hyouji
await 0
es_sync 16
getkey syuryo,27:if syuryo=1:end;ESCを押すと強制終了
goto *main
*hyouji
pos 0,0
es_mes "ESCを押すと終了"
sco=strf("%08d",sc);変数scを8桁の数字にしscoに代入
pos 200,200
es_mes ""+sco+""
mojisu=strlen(str(sco));変数scoを文字列に変換し文字列の長さ(桁数)を調べる
repeat mojisu;桁数だけリピート(このスプリクトでは8回)
coad=str(sco);変数scoを文字列に変換しcoadに代入
moji=peek(coad,cnt);変数coadの文字コードを一桁づつ調べmojiに代入
if moji=48 : mojih=0
if moji=49 : mojih=16
if moji=50 : mojih=32
if moji=51 : mojih=48
if moji=52 : mojih=64
if moji=53 : mojih=80
if moji=54 : mojih=96
if moji=55 : mojih=112
if moji=56 : mojih=128
if moji=57 : mojih=144
pos 200+cnt*16,250;8桁なので8回16ドットづつずらして表示
es_copy 5,mojih,0,16,24;数字表示
loop
return
************************************
HSP3使用 hspdxfix.DLL使用 画像は↓を使用
これを実行すると、標準フォントで書かれた8桁の数字と読み込んだフォントで書かれた数字が表示され1づつ足されていきます。
まず、スコア用の変数scを以前書いたstrf関数にて8桁表示にします。(桁数はいくらでもOKです)
で、それの桁数を調べ一桁づつ文字コードを調べて読み込んだ画像をes_copyで表示させています。
筆者が今作っているゲームが、スコア表示部分にスプライトを使用出来ないようにしているのでes_copyで表示させていますが
スプライトが使える場合は、キャラ番号48〜57に対応する数字画像を読み込ませてes_putなどで表示させれば
もっと簡単に表示出来ると思います。
と、まるで自分で考えたように書いてますが、色んな掲示板やサイトを見回って得た事を書いてるだけです(汗)
まーでも、上手く表示されて良かったです^^
PR
ちょっと大き目の敵を追加して、自機弾が当った時は自機弾消滅画像を表示させ、敵も明るい画像を表示させるようにしてみました。

最初、当った時だけ敵の画像を変化させる方法がわからずに、色々と試していたのですが
es_chrでキャラナンバーを変えれば上手く出来ました^^
あと、小さい画像を繋げてレーザーっぽい弾も作ってみました。
これも、最初は長い画像を用意して拡大させたりコピー部分を増やしてみたりしていたんですが
やっぱり上手くいかず、小さい画像を繋げて、それらしく見せる方法しか出来ませんでした。
スコア表示も追加しています。最終的にはフォント画像を読み込んで表示させたいんですが
なかなかやり方が良くわからないんですよね・・・勉強中です^^;
最初、当った時だけ敵の画像を変化させる方法がわからずに、色々と試していたのですが
es_chrでキャラナンバーを変えれば上手く出来ました^^
あと、小さい画像を繋げてレーザーっぽい弾も作ってみました。
これも、最初は長い画像を用意して拡大させたりコピー部分を増やしてみたりしていたんですが
やっぱり上手くいかず、小さい画像を繋げて、それらしく見せる方法しか出来ませんでした。
スコア表示も追加しています。最終的にはフォント画像を読み込んで表示させたいんですが
なかなかやり方が良くわからないんですよね・・・勉強中です^^;
ここ数日、ずーーーっと悩んでいた戦車の処理がやっと出来ました!
原因はホントしょうもない事でした。
コメント欄でふろんてあさんに「すごいくだらない事で引っかかってるんでは?」といわれてスプリクトを改めて見直してみると
ありましたよ、ミスが。そりゃもうしっかりと。
当初考えていたスプリクトは、砲台と戦車の当り判定を見てお互いが当っている時(重なっている時)は生存。
砲台が破壊されて、お互いが当らなくなったら本体も消滅。と言うスプリクトを考えていました。
で、それを作って実行してみると砲台を破壊すると別の場所の本体が消滅したりしなかったりだったんです。
その当り判定を見ていたスプリクトが↓なんですが
es_check senb,enemy,64
if senb>0 {es_kill senb}
このスプリクトの2行目の「es_kill senb」って所が、「es_kill sen」となっていたために、ちゃんと動かなかったんです。
なんでsenbとsenを間違えたのかと言うと、戦車本体のスプライト番号の変数をsenで処理していた為に
何か勘違いしていたんでしょうねぇ・・・

ちゃんと破壊跡が一番奥に表示されるようになりました^^
たった一文字の間違いですが、相当悩まされましたよ(汗)
まーでも、ちゃんと動いてくれて良かったです。これで安心して次に進めます。
原因はホントしょうもない事でした。
コメント欄でふろんてあさんに「すごいくだらない事で引っかかってるんでは?」といわれてスプリクトを改めて見直してみると
ありましたよ、ミスが。そりゃもうしっかりと。
当初考えていたスプリクトは、砲台と戦車の当り判定を見てお互いが当っている時(重なっている時)は生存。
砲台が破壊されて、お互いが当らなくなったら本体も消滅。と言うスプリクトを考えていました。
で、それを作って実行してみると砲台を破壊すると別の場所の本体が消滅したりしなかったりだったんです。
その当り判定を見ていたスプリクトが↓なんですが
es_check senb,enemy,64
if senb>0 {es_kill senb}
このスプリクトの2行目の「es_kill senb」って所が、「es_kill sen」となっていたために、ちゃんと動かなかったんです。
なんでsenbとsenを間違えたのかと言うと、戦車本体のスプライト番号の変数をsenで処理していた為に
何か勘違いしていたんでしょうねぇ・・・
ちゃんと破壊跡が一番奥に表示されるようになりました^^
たった一文字の間違いですが、相当悩まされましたよ(汗)
まーでも、ちゃんと動いてくれて良かったです。これで安心して次に進めます。
ここ数日、戦車の処理が上手くいかずに悩んでます・・・
当初、スプライトを重ねて砲台が破壊されたら本体も同時に消えるように処理しようとしていたんですが上手くいかず
次に、砲台のみスプライトで処理して、本体はスプライトを使わずにes_excopyで砲台が生きている時だけ表示、と言うようにしてみたら
砲台を破壊したら本体も表示されなくて、非常に上手く出来たように見えたのですが・・・

この画像のように、破壊跡の更に下に次に出てきた戦車本体が表示されてしまい、上手く行きません・・・
es_excopyには表示の優先順位を決める命令もないようなので、やっぱりこの方法も却下。
スプライトのみで表示すると、表示は上手く行くんですが当り判定でつまづくし
どうしたもんだか・・・
当初、スプライトを重ねて砲台が破壊されたら本体も同時に消えるように処理しようとしていたんですが上手くいかず
次に、砲台のみスプライトで処理して、本体はスプライトを使わずにes_excopyで砲台が生きている時だけ表示、と言うようにしてみたら
砲台を破壊したら本体も表示されなくて、非常に上手く出来たように見えたのですが・・・
この画像のように、破壊跡の更に下に次に出てきた戦車本体が表示されてしまい、上手く行きません・・・
es_excopyには表示の優先順位を決める命令もないようなので、やっぱりこの方法も却下。
スプライトのみで表示すると、表示は上手く行くんですが当り判定でつまづくし
どうしたもんだか・・・
昨日作った戦車を動かしてみました。と言っても、まだ完璧ではなく当り判定が上手くいっていません。
砲台を自機の方に向けたかったので戦車と砲台は別々に動かして、一つのキャラとして扱っているのですが
戦車と砲台を別々に判定すると上手くいくのですが、戦車本体を倒すと砲台も一緒に消える・・・ってやろうとすると何故か上手く行きません。
色々と悩み中です(汗)
それと地上物を出して気が付いたのですが、地上物よりも飛行物が手前に表示されないと、飛行しているのに地上物の下を通ったりして
なんともマヌケな感じになってしまいます。
更に爆破跡となると戦車よりも奥に表示されないとおかしいので、表示順位を良く考えて作っていかないと後で非常に面倒くさい事になるなぁと
実感しました。
敵弾は何よりも手前に表示されないといけませんし、スプライト番号の管理は頭がこんがらがって来そうです^^;
今の所、こんな感じです↓

どうも戦車が浮いているように見えてしまいますね・・・背景で道路でも書ければもっとそれなりに見えるんでしょうけど・・・
砲台を自機の方に向けたかったので戦車と砲台は別々に動かして、一つのキャラとして扱っているのですが
戦車と砲台を別々に判定すると上手くいくのですが、戦車本体を倒すと砲台も一緒に消える・・・ってやろうとすると何故か上手く行きません。
色々と悩み中です(汗)
それと地上物を出して気が付いたのですが、地上物よりも飛行物が手前に表示されないと、飛行しているのに地上物の下を通ったりして
なんともマヌケな感じになってしまいます。
更に爆破跡となると戦車よりも奥に表示されないとおかしいので、表示順位を良く考えて作っていかないと後で非常に面倒くさい事になるなぁと
実感しました。
敵弾は何よりも手前に表示されないといけませんし、スプライト番号の管理は頭がこんがらがって来そうです^^;
今の所、こんな感じです↓
どうも戦車が浮いているように見えてしまいますね・・・背景で道路でも書ければもっとそれなりに見えるんでしょうけど・・・
カレンダー
| 02 | 2026/03 | 04 |
| 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/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が特に好きで、並木学氏は最高!
ブログ内検索
最古記事