ページ 1 / 1
弾の描画について
Posted: 2009年11月14日(土) 17:59
by Ω
今プチシューティングを作ってて、自機を操作するとこまでは
上手くいっったんですけど、弾の描画が全く出来ません。
ゲームプログラミングの館の26を参考にしてみましたが、
あのコードを盛り込む方法が分かりません。 環境はBorland BCCdeveloperです
自分なりに盛り込んだ結果↓
//for文をZキーで実行させるとプログラムがフリーズします
#include "DxLib.h"
#define Z_image 1
typedef struct{
int x,y,Tama_y,Tama_x,Tama_Flag;}Ziki_date;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int Ziki_image[Z_image],Tama[10],i;
char Key[256];
Ziki_date Ziki;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
Ziki.x=320;
Ziki.y=240;
Ziki.Tama_x=Ziki.x;
Ziki.Tama_y=Ziki.y;
SetDrawScreen(DX_SCREEN_BACK);
LoadDivGraph("Ziki.png",1,1,1,32,32,Ziki_image);
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
if(Key[KEY_INPUT_RIGHT]==1)
Ziki.x+=4;
if(Key[KEY_INPUT_LEFT]==1)
Ziki.x-=4;
if(Key[KEY_INPUT_UP]==1)
Ziki.y-=4;
if(Key[KEY_INPUT_DOWN]==1)
Ziki.y+=4;
DrawGraph(Ziki.x,Ziki.y,Ziki_image[0],TRUE);
if(Key[KEY_INPUT_Z]==1){
for(i=0;0<10;i++){
Ziki.Tama_x=Ziki.x,Ziki.Tama_y=Ziki.y;
Ziki.Tama_Flag=0;
}
Ziki.Tama_y-=8;
DrawCircle(Ziki.Tama_x,Ziki.Tama_y,2,GetColor(255,255,255),TRUE);
}
ScreenFlip();
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Re:弾の描画について
Posted: 2009年11月14日(土) 18:55
by ひよこ
if(Key[KEY_INPUT_Z]==1){の中でfor(i=0;0<10;i++){は0は10を超えることはないため無限ループで
止まります。
Re:弾の描画について
Posted: 2009年11月14日(土) 19:58
by Ω
すいません・・・ 単なるタイプミスでした・・・
それで、for文を (i=0; 0<10; i++) から (i=0; i<10; i++)に直したんですけど、
今度はZが押されてる間だけ弾が表示されるだけ(飛んでいかない)になってしまいました。
どこかに、Ziki.Tama_y のy座標が0より大きい時のみ、Ziki.Tama_y のy座標を減らす式を
入れないとだめっぽいんですけど、試行錯誤してみましたが、全く入れ方が分かりません。
事情で返事は明日になるかと思います。
Re:弾の描画について
Posted: 2009年11月14日(土) 20:22
by ひよこ
Zキーを押したときfor(i=0;0<10;i++){はいらないと思います。Zikiは配列ではないし、
押したときにX、Yを決めて、Yを減らし描くじゃだめです。
Yを減らすのも描くのも外に置きましょう。
y座標が0より大きい時のみ
簡単にif(y>0)y--;でいいでしょう。
Re:弾の描画について
Posted: 2009年11月15日(日) 16:00
by Ω
返事が遅くなりました。
ひよこさんの言ったとおりにしてみました。
一応Zを押したら弾が飛ぶようになったんですけど、
なんか画面内に描画出来る弾数が1個だけしかないみたいなんです。
しかも、Zを押してないのに最初に1発だけ弾が出たりとバグだらけで・・・
何度もすいません
Re:弾の描画について
Posted: 2009年11月15日(日) 16:52
by ひよこ
描画出来る弾数が1個だけしかないみたいなんです。
配列ではないしひとつの変数だからです。
Zを押してないのに最初に1発だけ弾が出たりと
>>最初初期化して何の条件もないので、弾が出ます。
配列にしてくださいといっても難しいかもしれないので、
簡単なソースを作ってみました、今までのソースとうまく合わせれば思った通りになると思います。
わからなかったら、聞いてください。
#include "DxLib.h"
#define TAMA_MAX 100//弾の数
typedef struct{
int x,y;//x,y座標
int flag;//フラグ 使っているとき1 使っていないとき0
}tama_t;
tama_t tama[TAMA_MAX];
char Key[256];
int serch_tama(){
int i;
for(i=0;i<TAMA_MAX;i++){
if(tama.flag==0)
return i;
}
return -1;
}
//Zキーを押すと撃っていない弾を探す。見つけたら弾を撃つ
void shot_tama(){
int i;
if(Key[KEY_INPUT_Z]==1){
if((i=serch_tama())!=-1){
tama.flag=1;
tama.x=320;
tama.y=460;
}
}
}
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 image = LoadGraph("char.png");
for(int i=0;i<TAMA_MAX;i++){
tama.flag=0;
tama.x=320;
tama.y=460;
}
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
shot_tama();
//撃っている弾を探して撃っていてyが0より大きかったらyを減らす、そうでなかったら消す。
for(int i=0;i<TAMA_MAX;i++){
if(tama.flag==1){
if(tama.y>0)
tama.y-=3;
else
tama[i].flag=0;
DrawGraph(tama[i].x,tama[i].y,image,TRUE);
}
}
ScreenFlip();//裏画面を表画面に反映
}
DxLib_End();
return 0;
}
Re:弾の描画について
Posted: 2009年11月16日(月) 19:02
by Ω
返事遅れました 試行錯誤してました
サンプルプログラムまで用意して下さるとは・・・
ひよこさんのコードを自分なりに盛り込んだら良い感じに発射出来ました。ありがとうございます。
ただ、最初に一発出てくるのと、Zを押しっぱなしにしてるとピューピューでてくるのを直したいです。
前者は簡単そうなんですが、後者は、やはり無理矢理に入れてもバグばかり発生して・・・
返事は多分明日以降になるかと
Re:弾の描画について
Posted: 2009年11月16日(月) 21:10
by ひよこ
ソースを見せてくれないと答えようがないんですが・・
最初に一発出てくるのと
>>Ωさんの前のソースも交じっているからかもしれません。
Zを押しっぱなしにしてるとピューピューでてくるのを
>>これはゲームプログラミングの館の
「キーがどれ位押されたか」を判定する関数を見ればできると思います。
Re:弾の描画について
Posted: 2009年11月17日(火) 17:24
by Ω
ピューピュー出てくるのは解消されました。参考ありです
すいません コードがなけりゃ無理ですよね・・・ 長いです↓
#include "DxLib.h"
#define Z_image 2 //自機画像の数 2
#define Tamax 10 //弾の最大数 10
#define T_Speed 10 //弾の速度 10
typedef struct{
int x,y; }Ziki_date;
typedef struct{
int x,y,Flag; }Tama_date;
char Key[256];
int KEY[256];
int count=0;
int C=0;
Tama_date Tama[Tamax];
Ziki_date Ziki;
//////////////////////////////////////
//ここらへんはfpsの設定 長いので切る//
//////////////////////////////////////
int Seach_Tama(){ //使われてない弾のサーチ
int i;
for(i=0; i<Tamax; i++){
if(Tama.Flag==0)
return i;
}
return -1;
}
//サーチできたら撃つ
void Shot_Tama(){
int i;
if(C<5)C++; //もしCが5以下だったらCに+1
else if(Key[KEY_INPUT_Z]==1){ //↑でCが5以上になったら起動
C=0;
if((i=Seach_Tama())!=-1){
Tama.Flag=1; //フラグを立てる
Tama.x =Ziki.x; //自機の座標代入
Tama.y =Ziki.y;
Tama.x +=7; //弾のx軸補正
}
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
Ziki.x=320; //自機に座標を代入
Ziki.y=240;
int Ziki_image[Z_image],Count; //自機画像を入れる箱とCountを宣言
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
SetDrawScreen(DX_SCREEN_BACK); //裏画面に設定
LoadDivGraph("Ziki.png",2,2,1,20,26,Ziki_image); //画像を読み込ませる
for(int i=0; i<Tamax; i++){
Tama.Flag=1;
Tama.x =Ziki.x;
Tama.y =Ziki.y;
}
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
/////////////////////////////////////////
//ここにfpsの表示させるコードがあります//
/////////////////////////////////////////
if(Key[KEY_INPUT_RIGHT]==1)
Ziki.x+=4;
if(Key[KEY_INPUT_LEFT]==1)
Ziki.x-=4;
if(Key[KEY_INPUT_UP]==1)
Ziki.y-=4;
if(Key[KEY_INPUT_DOWN]==1)
Ziki.y+=4;
Shot_Tama();
for(int i=0; i<Tamax; i++){
if(Tama.Flag==1){
if(Tama.y>0)Tama[i].y-=T_Speed;
else Tama[i].Flag=0;
DrawGraph(Tama[i].x,Tama[i].y,Ziki_image[1],FALSE);
}
}
DrawGraph(Ziki.x,Ziki.y,Ziki_image[0],FALSE);
ScreenFlip();
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
Re:弾の描画について
Posted: 2009年11月17日(火) 17:45
by ひよこ
Ωさん、すみませんが、どこがどんなふうにだめなのか、もう一度言ってくれるとうれしいです。
Re:弾の描画について
Posted: 2009年11月18日(水) 13:09
by Ω
上記のコードは、エラーは出ないんですけど、
最初に一発だけ弾が出るので、それを直したいです。
追記
本件から逸脱してしまいますが、弾を撃っている最中(多分Zを押している最中)、
アローキーの「→」と「↓」を同時に押しても↘に移動しないです。
弾を撃ってない時はちゃんと反応します。 色々試しましたが、やはりエラーやらバグやらで・・・
Re:弾の描画について
Posted: 2009年11月18日(水) 17:06
by ひよこ
最初に一発だけ弾が出るので、それを直したいです。
>>最初の初期化中のTama.Flag=1;が原因です。そして一発に見えますが、Tamaxの数だけ出ています。
同時に押しても↘に移動しないです。
>>これは、私じゃよくわかりませんが、キーボードが対応していないくらいしかわかりません。
>>他の人に聞いたほうがいいと思います。
Re:弾の描画について
Posted: 2009年11月18日(水) 18:05
by Ω
直りました! 弾については以上です。ありがとうございました。 Tamaxの数だけ出てたんですねぇ
それにしても自分のタイプミスの多さといったら・・・
変な話、コピーペーストよりも手打ちしたい派なんです
右下 キーボードが対応してないのかな・・・ それだと、どうしようもないなw