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

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

注文していたデススマイルズが到着。
s-DSCF6951.jpg
なんだかんだで、今日の夕方受け取りました。
サントラ付属版を購入したのですが、本体に2枚入っている仕様ではなくて
ちゃんとサントラとしてパッケージがあり、嬉しい誤算^^

で、早速起動させてみました。
s-DSCF6952.jpg
このゲームにはアーケードモードとアレンジモードとXBOX360モードがあります。
まずは360モードでプレイ。
s-DSCF6955.jpg
起動して思ったのは、画面が綺麗!
参考までに、アーケードモードと画質を比べてみました。
XBOX360モード↓
s-DSCF6954.jpg

アーケードモード↓
s-DSCF6953.jpg
かなり綺麗になっている事が判ると思います。

その他のオプションメニューも必要十分な内容で
キーコンフィグ
s-DSCF6961.jpg

画面設定
s-DSCF6963.jpg
画面は縦横自由に設定出来るので、テレビの大きさの最大まで広げる事が出来ます。

s-DSCF6956.jpg
選べる機体は4種類。個人的にはウィンディアかローザが使い易いかな?と思いました。

s-DSCF6957.jpg
アーケードモードだとランクセレクトはそれぞれのレベルで2回選択すると選択出来なくなるので
どのステージからクリアしていくかの戦略も必要なのですが、360モードはずっとレベル1を
選択出来るので、好きなステージからクリアしていけば良さそうです。

s-DSCF6960.jpg
ステージA-1の港町。やはりこのステージの曲は最高にカッコイイですねぇ。

とりあえず全キャラでクリアまでプレイしてみましたが、クリアだけを考えると難易度は易しいです。
360モードですがノーコンクリアも出来てしまいましたし。
ただ、稼ぎを考えはじめると俄然難しくなってきて、打ち返しが発生したりもします。
でも、金塊ジャラジャラが決まると爽快なので、稼ぎプレイで遊ばないのも勿体無い感じ。
初心者から上級者まで楽しめるように作ってある点は、さずがやなぁと感心しました^^
プレイ中のローディングもなくサクサク遊べるので、シューティング初心者の方にもオススメです。
PR
先日作成した文字を画像で表示する関数を追加してみました。
s-WS000373.jpg
フォントやデザインは暫定ですが、とりあえず表示は成功。
ただ、ココで問題が。
この画像表示関数は、文字型で記述して表示させるのですが、スコアは整数(int)型なんですよね。
しかも00001234みたいな感じで表示させたいのですが、引数にスコアの変数を指定しても
変数の名前が表示されるだけで、実際のスコア数が表示される訳ではありません。
どうしたもんかな~と悩み中です^^;

文字を画像で表示させたいな~と思い、実装方法を考えてみました。
以前HSPで数字を画像で表示させた事はあったのですが、文字の場合はどうすれば良いのか?
と思い調べてみたら、文字には文字コードと言う数字が与えられている事が判りました。
対応する文字コード表は「C言語 文字コード」なんかでググれば、すぐ出てきますのでそちらを
参照して下さい。

で、この文字コード表をみてみると、大文字のA~Z、小文字のa~z、数字の0~9がそれぞれ
連番で文字コードが与えられています。コレを上手く使えば文字を画像で表示できるかと思い
簡単な文字⇔画像変換プログラムを作ってみました。
プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1240327271
このプログラムを動かすとこんな感じ↓
s-WS000372.jpg
フォント画像はMighty's Notebookさんで公開されているSEGAフォントを使用させてもらって
Edge2で作成しました。

プログラムとしてはこんな感じ↓
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "DxLib.h"
#include <string.h>
#define WIDTH  24 // 文字グラフィック横幅
#define HEIGHT 24 // 文字グラフィック高さ

int NumHandle[ 100 ]; // 文字グラフィックの配列

//文字を画像に変換する関数
//引数 文字列、表示座標X、表示座標Y
//返値 なし
void draw_mojigazou(char str[] , int x , int y){
 int i;//ループ用
 int j;//2重ループ用
 int len;//文字列の長さを調べる変数
 len = strlen(str);//文字列の長さ(桁数)を調べる

 for(i=0;i<len;i++){//文字列の数だけ繰り返す
  for(j=0;j<26;j++){//英字大文字用
   if( str[i]==65+j )DrawGraph( i*24+x , y , NumHandle[ j ], TRUE ) ;}
  for(j=0;j<26;j++){//英字小文字用
   if( str[i]==97+j )DrawGraph( i*24+x , y , NumHandle[ j+26 ], TRUE ) ;}
  for(j=0;j<10;j++){//数字用
   if( str[i]==48+j )DrawGraph( i*24+x , y , NumHandle[ j+52 ], TRUE ) ;}
 }
}

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
     LPSTR lpCmdLine, int nCmdShow )
{
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

 LoadDivGraph( "Edge1.png" , 62 , 26 , 3 , WIDTH , HEIGHT , NumHandle ) ;//文字グラフィック読み込み
 draw_mojigazou("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10,10);//文字表示
 draw_mojigazou("abcdefghijklmnopqrstuvwxyz", 10,40);//文字表示
 draw_mojigazou("0123456789", 10,70);//文字表示

 // キー入力待ち
 WaitKey() ;

 DxLib_End() ;   // DXライブラリ使用の終了処理

 return 0 ;   // ソフトの終了
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
draw_mojigazouと言う画像変換用の関数を作って、好きな文字と表示場所を指定出来るように
してみました。
draw_mojigazouの"と"の間に入力した文字が画像として指定した座標に表示されます。

例えば、draw_mojigazou("ABC",0,0)と入力したとします。
すると、str[0]に文字型のAが、str[1]にB、str[2]にCが代入されます。
代入したstrをstrlen関数を使って長さを調べてlenに代入します。この場合は3が代入されますね。

次にstr[0]に何が代入されているか調べます。
これは文字コードを総当りで調べていて、この場合はAが代入されているので、文字コード表によると
A=65となり、str[0]が65かどうかを調べれば良いって事になります。
で、65だった場合はDrawGraph関数を使ってAの画像を表示させる・・・と言った感じ。

ただ、一つ気になる事があって、関数の宣言でchar str[]と言う感じで記述しているのですが
これで文字の為の配列変数を勝手に確保してくれてるのかどうか?ってのが
良く判らないんですよね
まぁ、ちゃんと動いてるような感じなので、エエかな?とは思っているのですが^^;

とりあえず、この関数を現在作成中のゲームに組み込もうと思っているのですが
使用するフォントをどれにするかが問題なんですよね^^;
 

ビックカメラで注文していたデススマイルズが発送されてました。
s-4_21.jpg
ひょっとして明日届くのでは?とwktkしてしまいます^^
23日が発売日なので23日には届くと思うのですが、なぜか23、24と泊まりで会社の研修が
あるんですよねorz
滅多に研修なんてないのに、何故に23日やねん!しかも泊りとはトホホです・・・

そして、XBOX360に虫姫さま ふたりが移植されるようです!(via newstage
詳しくはコチラ↓
http://www.famitsu.com/game/news/1223648_1124.html
今回もグラフィック強化などが行われるみたいで期待大ですね^^

ジョイパッドに対応出来るようにしてみました。
まず、プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1240177830
簡単なキーコンフィグも実装したので、適当にタイトル画面も加えてみた。
s-WS000369.jpg
テストシューティングゲーム01って事で、とりあえずTSTG-01としました。
タイトル画面などの選択方法はC言語なんでも質問サイトさんの「34. メイン関数の書き方。」
を参考にswitchで分岐出来るようにしました。

で、ジョイパッドへの対応方法ですが、DXライブラリのGetJoypadInputState関数を使えば
簡単に対応出来ます。
具体的には
int key;
key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
と記述しておいて
if(key & PAD_INPUT_UP)   ~上に行く処理~
if(key & PAD_INPUT_DOWN) ~下に行く処理~
と言う感じで書けばOK。
詳しいリファレンスはDXライブラリの公式ページに載っています。
(DX_INPUT_KEY_PAD1)を使う事によって、キーボードもジョイパッドも対応できるのが良い感じです。

とココまでは良かったのですが、キーコンフィグを作る所でつまづきました。
どうやって実装したら良いのか、まるで思いつきません(汗)
で、とりあえずGetJoypadInputState関数が、何を取得しているのか調べてみようと思って
簡単なプログラムを作ってみました↓
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
   LPSTR lpCmdLine, int nCmdShow )
{
 if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 SetDrawScreen( DX_SCREEN_BACK ) ;   
 int Cr , PadInput ;
  Cr = GetColor( 255 , 255 , 255 ) ;// 白色の値を取得

 while(!ProcessMessage() && !ClearDrawScreen() && CheckHitKey(KEY_INPUT_RETURN) == 0)//画面クリアとリターンで終了処理
 { // パッド1の入力を取得
  PadInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;
  DrawFormatString(240,200,Cr,"PadInput %1d",PadInput); //PadInputを表示

  DrawString(480,460,"リターンキーで終了",Cr);
  ScreenFlip();     //描画
 }

 DxLib_End() ;  // DXライブラリ使用の終了処理

 return 0 ;  // ソフトの終了
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
動かすとこんな感じ↓
s-WS000370.jpg
押されたキー情報を表示します。
すると
↓   1
←  2
→  4
↑   8
1  16
2  32
3  64
4  128



と言う感じでボタンに対する数字がある事がわかりました。
コレって、HSPで使っていたCK JOYFORCE.DLLとほぼ同じです。
この数字を使えばキーコンフィグが作れるな~と思って作ってみた
キーコンフィグの関数はこんな感じ↓
////////////////////////オプション////////////////////////////////////////////////////////////////
//引数 なし
//返値 なし
void option(){
  int padstate;
  int color_white;
  color_white= GetColor( 255 , 255 , 255 ) ;//色取
  DrawString(160,10,"ショットボタンに使うキーを押して下さい",color_white);
  DrawString(150,30,"Z,X,Cまたはボタン1,2,3のみ対応しています",color_white);
  
  if(GetJoypadInputState( DX_INPUT_KEY_PAD1 ) == 0 ){//ボタンが押されたかどうか
  g_padcnt=0;// 押されていない
  }
  else
  {
  if(g_padcnt<1){//押された場合
  padstate = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;//ボタンの状態取得
  if(padstate==16) A=PAD_INPUT_A;//Zまたは1ボタン
  if(padstate==32) A=PAD_INPUT_B;//Xまたは2ボタン
  if(padstate==64) A=PAD_INPUT_C;//Cまたは3ボタン
  if(padstate>=16) if(padstate<=64)g_syorisentaku=0;//ZXC以外のボタンを押しても無効にする為の処理
  g_padcnt++;//連射しないように
  }
  }
  fps();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
まず  if(GetJoypadInputState( DX_INPUT_KEY_PAD1 ) == 0 )でキーが押されたかどうかを調べます。
押された場合は、例えばZキーが押された場合はpadstateに16が返ってくるので
その場合はショットボタンをPAD_INPUT_Aに設定。
Xボタンの場合だとpadstateに32が返ってくるので、PAD_INPUT_Bを設定・・・と言った感じ。
で、if(padstate>=16) if(padstate<=64)でZXCキー以外が押された時は反応しないようにしています。
ただ、同時押しなどには対応出来ていないので、これは今後の課題ですね。

それと、タイトル画面でカーソルを選択させようとしたのですが、普通にif(key & PAD_INPUT_UP)
としてしまうと、ずっとボタンが押された事になってしまってカーソルが動き続けて困ったので
g_padcntと言うボタンが押された時間を数える変数を用意して、if(g_padcnt<1)と言った感じで
カウントが1以下の時は処理を行うようにしてみたら、上手く動いてくれました^^

ついでに家にあったUSBゲームコントローラの返り値を調べてみました。
まず、XBOX360純正(非公式ドライバ使用)
s-DSCF6945.jpg
↓  1
←  2
→  4
↑  8
1  A  16
2  B  32
3  X  64
4  Y  128
5  LB 256
6  RB 512
7  ST 1024
8  BA 2048
9  LT 16384
10 RT 32768
13 XB 65536

PS2純正+エレコム変換機(JC-PS101USV)
s-DSCF6947.jpg
↓  1
←  2
→  4
↑  8
1  △  16
2  ○ 32
3  × 64
4  □ 128
5  L2 256
6  R2 512
7  L1 1024
8  R1 2048
9  ST 4096
10 SE 8192

エレコムのJC-U1608TBK
s-DSCF6946.jpg
↓  1
←  2
→  4
↑  8
1  Y  16
2  X  32
3  B  64
4  A  128
5  L  256
6  R  512
7  SE 1024
8  ST 2048

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]