flagを使って敵を出現させようとしているのですがなかなか上手く行きません。
質問しようにも聞くことが沢山ありすぎてしまいます。
そこで「test.gifがx320、y240に起動から3秒後に出てくる。」という設定で1つ例を示して頂けないでしょうか?この例を使って勉強したいと思います。すごく長くなっても分割しないで1ソース内に納めてくれてほしいです。
OSはXP、コンパイラはVisual C++2005です。
御回答よろしくお願いします。
敵の出現
Re:敵の出現
敵の出現といっても、パターンが沢山ありすぎるのですが・・。
シューティングの敵やRPGの敵、他アクションの敵や格闘などの敵など・・。
RPGの敵の遭遇については、
http://dixq.net/g/#25
こちらで紹介していますが、コレではダメですか?
シューティングの敵やRPGの敵、他アクションの敵や格闘などの敵など・・。
RPGの敵の遭遇については、
http://dixq.net/g/#25
こちらで紹介していますが、コレではダメですか?
Re:敵の出現
またこれも方法は沢山あって、用途によって様々です。
もしお遊び程度でよければシューティングの館で紹介していますので、そちらをご覧下さい。
しかし、本格的におつくりになるのならこれではダメで、エクセルなどで表を作ることになります。
私が作っているシューティングを例に出しますと、敵1体が1回の出現で持つ情報は
・いつ
・どういう移動パターンで
・どういう種類の敵が
・どこで(x座標)
・どこで(y座標)
・移動スピードはいくらで
・発射時間はいくらで
・弾幕種類は何で
・弾の色は何で
・体力はいくつで
・落とすアイテム1は何で
・落とすアイテム2は何で
・落とすアイテム3は何で
・落とすアイテム4は何で
・落とすアイテム5は何で
・落とすアイテム6は何で
・弾の種類は何で
・待機時間はいくつで
という情報が必要になります。
1面で、これが1000個位。6面で6000個位必要なわけですから、switch文やif文で書いていられません。
基本、シューティングの館を参考に、値の代入はエクセルデータなどからとってくるようにしたほうがいいと思います。
もしお遊び程度でよければシューティングの館で紹介していますので、そちらをご覧下さい。
しかし、本格的におつくりになるのならこれではダメで、エクセルなどで表を作ることになります。
私が作っているシューティングを例に出しますと、敵1体が1回の出現で持つ情報は
・いつ
・どういう移動パターンで
・どういう種類の敵が
・どこで(x座標)
・どこで(y座標)
・移動スピードはいくらで
・発射時間はいくらで
・弾幕種類は何で
・弾の色は何で
・体力はいくつで
・落とすアイテム1は何で
・落とすアイテム2は何で
・落とすアイテム3は何で
・落とすアイテム4は何で
・落とすアイテム5は何で
・落とすアイテム6は何で
・弾の種類は何で
・待機時間はいくつで
という情報が必要になります。
1面で、これが1000個位。6面で6000個位必要なわけですから、switch文やif文で書いていられません。
基本、シューティングの館を参考に、値の代入はエクセルデータなどからとってくるようにしたほうがいいと思います。
Re:敵の出現
ありがとうございます。
その雛型を参考に自分も作ってみました。
#include "DxLib.h"
typedef struct{
int x,y,flag,pattern;
double size;
}kou;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
int GHandle;
kou nz[10];
GHandle=LoadGraph("default.jpg");
int RefreshTime;
RefreshTime = GetNowCount();
ClearDrawScreen();
int i;
for(int i=0;i<100;i++)
if(nz.flag==1)
if(nz.pattern==1)
nz.y=1.5;
for(i=0;i<10;i++)
if(nz.flag==0)
break;
int counter=0;
counter=counter+1;
switch(counter){
case 60:
case 120:
case 180:
case 240:
nz.flag=1; //出現フラグ
counter=0;//出現して何カウント目か測るカウンター初期化
nz.pattern=1; //軌道
nz.size=0.5;//大きさ
nz.x=100; //xの初期座標
nz.y=100; //yの初期座標
break;
default:
break;
}
for(i=0;i<100;i++)
if(nz.flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}
ScreenFlip();
while(GetNowCount()-RefreshTime<17);
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
このプログラムだとエラーは出てきませんでしたが、画面にも何も出てきませんでした。
どのあたりがいけないか、ご指摘お願いします。
その雛型を参考に自分も作ってみました。
#include "DxLib.h"
typedef struct{
int x,y,flag,pattern;
double size;
}kou;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
int GHandle;
kou nz[10];
GHandle=LoadGraph("default.jpg");
int RefreshTime;
RefreshTime = GetNowCount();
ClearDrawScreen();
int i;
for(int i=0;i<100;i++)
if(nz.flag==1)
if(nz.pattern==1)
nz.y=1.5;
for(i=0;i<10;i++)
if(nz.flag==0)
break;
int counter=0;
counter=counter+1;
switch(counter){
case 60:
case 120:
case 180:
case 240:
nz.flag=1; //出現フラグ
counter=0;//出現して何カウント目か測るカウンター初期化
nz.pattern=1; //軌道
nz.size=0.5;//大きさ
nz.x=100; //xの初期座標
nz.y=100; //yの初期座標
break;
default:
break;
}
for(i=0;i<100;i++)
if(nz.flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}
ScreenFlip();
while(GetNowCount()-RefreshTime<17);
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
このプログラムだとエラーは出てきませんでしたが、画面にも何も出てきませんでした。
どのあたりがいけないか、ご指摘お願いします。
Re:敵の出現
ご指摘ありがとうございます。たしかにループもしてないし、カウンターも回ってませんでした。
#include "DxLib.h"
typedef struct{
int x,y,flag,pattern;
double size;
}kou;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
int GHandle;
int counter=0;
kou nz[10];
GHandle=LoadGraph("default.jpg");
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
int RefreshTime;
while(!ProcessMessage() && !ClearDrawScreen()){
RefreshTime = GetNowCount();
counter=counter+1;
DrawFormatString( 0, 0, White , "%d" , counter );//文字列表示
int i;
for(int i=0;i<100;i++)
if(nz.flag==1)
if(nz.pattern==1)
nz.y=1.5;
for(i=0;i<10;i++)
if(nz.flag==0)
break;
switch(counter){
case 60:
nz.flag=1; //出現フラグを立てる
counter=0;//出現して何カウント目か測るカウンター初期化
nz.pattern=1; //どういう軌道を描くか
nz.size=1;//敵の大きさ
nz.x=100; //xの初期座標
nz.y=100; //yの初期座標
break;
default:
break;
}
for(i=0;i<100;i++)
if(nz.flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}
ScreenFlip();
while(GetNowCount()-RefreshTime<17);
}
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
ちゃんとループをして、カウンターが回るようにしました。
DrawFormatString( 0, 0, White , "%d" , counter );ぐるぐると回っておりました。
しかし、またしたも肝心の画像が出てきません。
ご指摘お願いします。
#include "DxLib.h"
typedef struct{
int x,y,flag,pattern;
double size;
}kou;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウィンドウモードに変更
if( DxLib_Init() == -1 ) return -1 ; // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定
int GHandle;
int counter=0;
kou nz[10];
GHandle=LoadGraph("default.jpg");
int White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
int RefreshTime;
while(!ProcessMessage() && !ClearDrawScreen()){
RefreshTime = GetNowCount();
counter=counter+1;
DrawFormatString( 0, 0, White , "%d" , counter );//文字列表示
int i;
for(int i=0;i<100;i++)
if(nz.flag==1)
if(nz.pattern==1)
nz.y=1.5;
for(i=0;i<10;i++)
if(nz.flag==0)
break;
switch(counter){
case 60:
nz.flag=1; //出現フラグを立てる
counter=0;//出現して何カウント目か測るカウンター初期化
nz.pattern=1; //どういう軌道を描くか
nz.size=1;//敵の大きさ
nz.x=100; //xの初期座標
nz.y=100; //yの初期座標
break;
default:
break;
}
for(i=0;i<100;i++)
if(nz.flag==1){
DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE );}
ScreenFlip();
while(GetNowCount()-RefreshTime<17);
}
WaitKey(); // 何かキー入力があるまで待つ
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
ちゃんとループをして、カウンターが回るようにしました。
DrawFormatString( 0, 0, White , "%d" , counter );ぐるぐると回っておりました。
しかし、またしたも肝心の画像が出てきません。
ご指摘お願いします。
Re:敵の出現
一応、動くように修正しましたが、構造体の配列が10個しか用意されていないのに、ループを100回している箇所がありますね。危険ですので、注意した方がいいですよ。
あと、どのループがどの処理をしているのか分かりにくいですね。メンテナンスが容易になるので、きちんと{}で括るべきです。ちなみに、この修正ソースでは、ループは1つにまとめてみました。
ただし、私の勝手な解釈で適当に修正してあるので、必要に応じて再修正を加えてください。
あと、どのループがどの処理をしているのか分かりにくいですね。メンテナンスが容易になるので、きちんと{}で括るべきです。ちなみに、この修正ソースでは、ループは1つにまとめてみました。
ただし、私の勝手な解釈で適当に修正してあるので、必要に応じて再修正を加えてください。
#include "DxLib.h" typedef struct { int flag; int pattern; double x; double y; double size; }kou; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); if (DxLib_Init() == -1) { return -1; } SetDrawScreen(DX_SCREEN_BACK); int GHandle = LoadGraph("default.jpg"); int counter=0; kou nz[10]; // 構造体の中身が初期化されていないまま使用されていますが大丈夫ですか?????? while (!ProcessMessage() && !ClearDrawScreen()) { counter++; DrawFormatString(0, 0, GetColor(255, 255, 255), "%d", counter); for(int i=0;i<10;i++) { // このif文は何を判定しているのでしょう?????? if (nz.flag == 1 && nz.pattern == 1) { // メンバ変数のyはint型ですが、代入されている値がdouble型です。(修正済み) nz.y = 1.5; } // 構造体が初期化されていないので、countが60になる以前の中身が不定となりますが大丈夫でしょうか?????? // というか、この判定は必要ですか?下記のswitch~caseで充分だとおもいますが…?????? if (nz.flag == 0) { break; } switch (counter) { case 60: counter = 0; //出現して何カウント目か測るカウンター初期化 nz.flag = 1; //出現フラグを立てる nz.pattern = 1; //どういう軌道を描くか nz.x = 100.0; //xの初期座標 nz.y = 100.0; //yの初期座標 nz.size = 1.0; //敵の大きさ break; default: break; } if (nz.flag == 1) { // int型をint型にキャストしてますね。意味がありません(修正済み) DrawRotaGraph((int)nz[i].x,(int)nz[i].y,nz[i].size,0,GHandle,TRUE ); } } ScreenFlip(); } WaitKey(); // 何かキー入力があるまで待つ DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }