敵の出現及び消滅処理について質問したいことが・・・
敵の出現及び消滅処理について質問したいことが・・・
自分が今行いたい事は何か
敵を出現(描画)させ、条件を満たした場合消えるという処理
どのように取り組んだか(プログラムコードがある場合記載)
指定した座標と一致した場合、敵の初期値を決め
その後一定の処理を繰り返すという関数を作成したのですが、
敵の体力(teki_S[n].HP)が0以下になった場合、敵の描画をやめる
という条件を満たしたにもかかわらず、敵が描画を続けるという事態に
なってしまい、解決が困難になったので、質問しようと思いました。
[code = C++]
void teki_ugoki(int zahyo, double X, double Y,
double idouX, double idouY, int HP,
int Graph, int sukoa){
static bool patan;
/*座標が一致科の確認*/
if(zahyo == haikei.sizeY)
if(patan == false)
patan = true;
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == false && patan == true){
teki_S[n].X = X;
teki_S[n].Y = Y;
teki_S[n].idouX = idouX;
teki_S[n].idouY = idouY;
teki_S[n].count = 0;
teki_S[n].HP = HP;
teki_S[n].score = sukoa;
teki_S[n].Graph = Graph;
GetGraphSize(teki_S[n].Graph,&teki_S[n].sizeX,&teki_S[n].sizeY);
teki_S[n].fulg = true;
patan = false;
}
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == true){
if(teki_S[n].HP <= 0){
score += teki_S[n].score;
teki_S[n].fulg = false;
}
if(0-teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
|| 0-teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY)
teki_S[n].fulg = false;
teki_S[n].X += teki_S[n].idouX;
teki_S[n].Y += teki_S[n].idouY;
for(i=0; i<tama_kazu; i++)
if(atarisikaku(teki_S[n].X,teki_S[n].Y,teki_S[n].sizeX,teki_S[n].sizeY,
tama.X,tama.Y,tama.sizeX,tama.sizeY) == true
&& tama.boor == true){
teki_S[n].HP--;
tama.boor = false;
}
DrawGraph(teki_S[n].X,teki_S[n].Y,teki_S[n].Graph,true);
}
}
[/code]
OS : Windows, Linux等々
OSはwindow8です。
コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
VC++ 2010です。
・どの程度C言語を理解しているか
C言語は何かを作れと言われた時に、困らないレベルには網羅していると思っています
・ライブラリを使っている場合は何を使っているか
使用ライブラリはDXLIB.h、math.hです。
敵を出現(描画)させ、条件を満たした場合消えるという処理
どのように取り組んだか(プログラムコードがある場合記載)
指定した座標と一致した場合、敵の初期値を決め
その後一定の処理を繰り返すという関数を作成したのですが、
敵の体力(teki_S[n].HP)が0以下になった場合、敵の描画をやめる
という条件を満たしたにもかかわらず、敵が描画を続けるという事態に
なってしまい、解決が困難になったので、質問しようと思いました。
[code = C++]
void teki_ugoki(int zahyo, double X, double Y,
double idouX, double idouY, int HP,
int Graph, int sukoa){
static bool patan;
/*座標が一致科の確認*/
if(zahyo == haikei.sizeY)
if(patan == false)
patan = true;
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == false && patan == true){
teki_S[n].X = X;
teki_S[n].Y = Y;
teki_S[n].idouX = idouX;
teki_S[n].idouY = idouY;
teki_S[n].count = 0;
teki_S[n].HP = HP;
teki_S[n].score = sukoa;
teki_S[n].Graph = Graph;
GetGraphSize(teki_S[n].Graph,&teki_S[n].sizeX,&teki_S[n].sizeY);
teki_S[n].fulg = true;
patan = false;
}
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == true){
if(teki_S[n].HP <= 0){
score += teki_S[n].score;
teki_S[n].fulg = false;
}
if(0-teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
|| 0-teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY)
teki_S[n].fulg = false;
teki_S[n].X += teki_S[n].idouX;
teki_S[n].Y += teki_S[n].idouY;
for(i=0; i<tama_kazu; i++)
if(atarisikaku(teki_S[n].X,teki_S[n].Y,teki_S[n].sizeX,teki_S[n].sizeY,
tama.X,tama.Y,tama.sizeX,tama.sizeY) == true
&& tama.boor == true){
teki_S[n].HP--;
tama.boor = false;
}
DrawGraph(teki_S[n].X,teki_S[n].Y,teki_S[n].Graph,true);
}
}
[/code]
OS : Windows, Linux等々
OSはwindow8です。
コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
VC++ 2010です。
・どの程度C言語を理解しているか
C言語は何かを作れと言われた時に、困らないレベルには網羅していると思っています
・ライブラリを使っている場合は何を使っているか
使用ライブラリはDXLIB.h、math.hです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 敵の出現及び消滅処理について質問したいことが・・・
codeタグが失敗しています。必ずプレビューで確認してくださいね。
デバッガで追いかけてもわからないんでしょうか?
コードが見づらいので書き換えました。
デバッガで追いかけてもわからないんでしょうか?
コードが見づらいので書き換えました。
void teki_ugoki( int zahyo, double X, double Y,
double idouX, double idouY, int HP,
int Graph, int sukoa ) {
static bool patan;
/*座標が一致科の確認*/
if( zahyo == haikei.sizeY ) {
if( patan == false ) {
patan = true;
}
}
for( n = 0; n < teki_kazu; n++ )
if( teki_S[n].fulg == false && patan == true ) {
teki_S[n].X = X;
teki_S[n].Y = Y;
teki_S[n].idouX = idouX;
teki_S[n].idouY = idouY;
teki_S[n].count = 0;
teki_S[n].HP = HP;
teki_S[n].score = sukoa;
teki_S[n].Graph = Graph;
GetGraphSize( teki_S[n].Graph, &teki_S[n].sizeX, &teki_S[n].sizeY );
teki_S[n].fulg = true;
patan = false;
}
for( n = 0; n < teki_kazu; n++ )
if( teki_S[n].fulg == true ) {
if( teki_S[n].HP <= 0 ) {
score += teki_S[n].score;
teki_S[n].fulg = false;
}
if( 0 - teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
|| 0 - teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY ) {
teki_S[n].fulg = false;
}
teki_S[n].X += teki_S[n].idouX;
teki_S[n].Y += teki_S[n].idouY;
for( i = 0; i < tama_kazu; i++ ) {
if( atarisikaku( teki_S[n].X, teki_S[n].Y, teki_S[n].sizeX, teki_S[n].sizeY, tama.X[i], tama.Y[i], tama.sizeX, tama.sizeY ) == true
&& tama.boor[i] == true ) {
teki_S[n].HP--;
tama.boor[i] = false;
}
}
DrawGraph( teki_S[n].X, teki_S[n].Y, teki_S[n].Graph, true );
}
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 敵の出現及び消滅処理について質問したいことが・・・
softyaさん、書き換えありがとうございます。
一応、数値の確認はしたのですが、
出現している際には teki.fulg = 1; //敵が存在している
設定した体力をダメージの合計超えた際には teki.fulg = 0; //敵が存在していない
と表示されているにもかかわらず、敵が表示し続けているのです。
自分が書いた文のどこに不備があるのか、指摘していただけると
助かります。 お願いします。
一応、数値の確認はしたのですが、
出現している際には teki.fulg = 1; //敵が存在している
設定した体力をダメージの合計超えた際には teki.fulg = 0; //敵が存在していない
と表示されているにもかかわらず、敵が表示し続けているのです。
自分が書いた文のどこに不備があるのか、指摘していただけると
助かります。 お願いします。
Re: 敵の出現及び消滅処理について質問したいことが・・・
敵の初期化、残り体力判定、描写を全て一気にやっているところが怪しい気がします。
これでは敵が規定のダメージを超えても直ぐに初期化されて敵は復活しませんか?
これでは敵が規定のダメージを超えても直ぐに初期化されて敵は復活しませんか?
Re: 敵の出現及び消滅処理について質問したいことが・・・
>>これでは敵が規定のダメージを超えても直ぐに初期化されて敵は復活しませんか?
これについてを確かめようと思い、
teki_S[0].HP、teki_S[1].HP、teki_S[2].HP、teki_S[3].HPの数値を確認してみたころ
本来ならば、敵が出現した際には
teki_S[0].HP = 指定した体力
teki_S[1].HP = 0
teki_S[2].HP = 0
teki_S[3].HP = 0
になるはずなのですが、実際は
teki_S[0].HP = 指定した体力
teki_S[1].HP = 指定した体力
teki_S[2].HP = 指定した体力
teki_S[3].HP = 0
になっていたのです。
初期化ではないということが分かったのですが、また別の問題が出てきてしまいました。
なぜ、敵一体で三体分の体力を持っているのかわかりません。
解決にご協力お願いします。
これについてを確かめようと思い、
teki_S[0].HP、teki_S[1].HP、teki_S[2].HP、teki_S[3].HPの数値を確認してみたころ
本来ならば、敵が出現した際には
teki_S[0].HP = 指定した体力
teki_S[1].HP = 0
teki_S[2].HP = 0
teki_S[3].HP = 0
になるはずなのですが、実際は
teki_S[0].HP = 指定した体力
teki_S[1].HP = 指定した体力
teki_S[2].HP = 指定した体力
teki_S[3].HP = 0
になっていたのです。
初期化ではないということが分かったのですが、また別の問題が出てきてしまいました。
なぜ、敵一体で三体分の体力を持っているのかわかりません。
解決にご協力お願いします。
Re: 敵の出現及び消滅処理について質問したいことが・・・
情報が不足しているので以下は推測になります
敵番号0を初期化したいにも関わらず、それ以上に敵が初期化されてしまう原因は
ここで条件式として用いているpatan変数が、敵1を初期化してもfalseにならず
何らかの原因で、ずっとtrueを返しているのだと思います。
patan変数の代入はその前の
ここで行われていますので、デバッカで期待通りに動作をしているか確認しては如何でしょうか。
敵番号0を初期化したいにも関わらず、それ以上に敵が初期化されてしまう原因は
for( n = 0; n < teki_kazu; n++ )
if( teki_S[n].fulg == false && patan == true ) {
teki_S[n].X = X;
teki_S[n].Y = Y;
teki_S[n].idouX = idouX;
teki_S[n].idouY = idouY;
teki_S[n].count = 0;
teki_S[n].HP = HP;
teki_S[n].score = sukoa;
teki_S[n].Graph = Graph;
GetGraphSize( teki_S[n].Graph, &teki_S[n].sizeX, &teki_S[n].sizeY );
teki_S[n].fulg = true;
patan = false;
}
何らかの原因で、ずっとtrueを返しているのだと思います。
patan変数の代入はその前の
ここで行われていますので、デバッカで期待通りに動作をしているか確認しては如何でしょうか。
Re: 敵の出現及び消滅処理について質問したいことが・・・
void teki_ugoki( int zahyo, double X, double Y,
double idouX, double idouY, int HP,
int Graph, int sukoa ) {
static bool patan;
static int tasikame;
/*座標が一致科の確認*/
if( zahyo == haikei.sizeY ) {
if( patan == false ) {
tasikame++;
patan = true;
}
}
整数tasikameは1ではなく3になっていたのです。
ここでわかったことは、座標が一致したときに処理を三回も繰り返していたということです。
ここで問題になってくるのは、どうしたら一度行うだけで済むかということです。
ご協力お願いします。
Re: 敵の出現及び消滅処理について質問したいことが・・・
teki_ugoki関数を呼び出しているコードを掲示してください。the Doss さんが書きました:ここでわかったことは、座標が一致したときに処理を三回も繰り返していたということです。
ここで問題になってくるのは、どうしたら一度行うだけで済むかということです。
taketoshiさんが情報が不足している、と投稿してるんですが、ちゃんと見てますか?
written by へにっくす
Re: 敵の出現及び消滅処理について質問したいことが・・・
どうしたら一度で済むのかではなく、何故3回も呼ばれているのかを考えてはいかがでしょうか。
これ以上は情報が不足していますので、こちらも返答できません。
呼び出し元のコードも提示してみてください。
これ以上は情報が不足していますので、こちらも返答できません。
呼び出し元のコードも提示してみてください。
Re: 敵の出現及び消滅処理について質問したいことが・・・
すみません、情報の不足の意味をはき違えてました。
どの範囲で提示したらいいのか判断がつかないので、現在のすべてのコードを提示しようと思います。
どの範囲で提示したらいいのか判断がつかないので、現在のすべてのコードを提示しようと思います。
//宣言部
#include "DxLib.h" //DXライブラリの使用
#include "stdlib.h" //ランダム使用
#include "stdio.h" //基本関数使用
#include "math.h" //数学的関数使用
#include "windows.h" //総合的な関数使用
#include "regex" //正規表現使用
#include "string.h" //文字列型使用
#include "iostream" //クラス等オブジェクト使用
#define tama_kazu 16
#define PI 3.141592654f
#define teki_kazu 100
int suitti;
int i,n,nn,mod,tasikame; //制御用変数
bool porse;
long score,highscore;
typedef struct{
double X,Y,count,size,idouX,idouY;
bool fulg,patan;
int HP,sizeX,sizeY,Graph,kazu,score;
}teki_s;
bool atarisikaku(double X1, double Y1, int sizeX1, int sizeY1,
double X2, double Y2, int sizeX2, int sizeY2){
//sizeXは横幅の意、sizeYは縦幅の意。
if (abs((X1 + sizeX1 / 2) - (X2 + sizeX2 / 2) ) <= (sizeX1 + sizeX2) / 2)
if (abs((Y1 + sizeY1 / 2) - (Y2 + sizeY2 / 2) ) <= (sizeY1 + sizeY2) / 2)
return true;
else
return false;
}
bool atarimaru(double X1,double X2,double Y1,double Y2,double R1,double R2){
/*
R1:円形1の半径
R2:円形2の半径
X1:円形1のx座標
X2:円形2のx座標
Y1:円形1のy座標
Y2:円形2のy座標
*/
if((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2) <= (R1+R2)*(R1+R2)){
return true;
}else{
return false;
}
}
teki_s teki_S[teki_kazu];
struct{
double X[tama_kazu] , Y[tama_kazu];
int sizeX , sizeY ;
int Graph;
int boor[tama_kazu];
int Leftboor[tama_kazu],Rightboor[tama_kazu];
int Flag;
double Up , Down , Left[tama_kazu] , Right[tama_kazu];
}tama;
struct{
int count[500];
}damage;
struct{
int sizeX[500] , sizeY[500];
int Graph;
double color;
int kazu;
}teki;
struct main{
//必要変数宣言部
double X , Y;
int sizeX , sizeY;
int Graph;
double color;
int boor[500];
double bairitu;
double gamen34;
}
haikei,ziki,gamen,
title,start,stop,sentaku,
hinanjo,titleS,zanki,zankiS,
bom,bomS; //struct main変数
void teki_ugoki(int zahyo, double X, double Y,
double idouX, double idouY, int HP,
int Graph, int sukoa){
static bool patan;
/*座標が一致科の確認*/
if(zahyo == haikei.sizeY){
if( patan == false ){
patan = true;
}
}
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == false && patan == true){
teki_S[n].X = X;
teki_S[n].Y = Y;
teki_S[n].idouX = idouX;
teki_S[n].idouY = idouY;
teki_S[n].count = 0;
teki_S[n].HP = HP;
teki_S[n].score = sukoa;
teki_S[n].Graph = Graph;
GetGraphSize(teki_S[n].Graph,&teki_S[n].sizeX,&teki_S[n].sizeY);
patan = false;
teki_S[n].fulg = true;
break;
}
for(n=0; n<teki_kazu; n++)
if(teki_S[n].fulg == true){
if(teki_S[n].HP <= 0){
score += teki_S[n].score;
teki_S[n].fulg = false;
}
if(0-teki_S[n].sizeX > teki_S[n].X || teki_S[n].X > 480 + teki_S[n].sizeX
|| 0-teki_S[n].sizeY > teki_S[n].Y || teki_S[n].Y > 480 + teki_S[n].sizeY)
teki_S[n].fulg = false;
teki_S[n].X += teki_S[n].idouX;
teki_S[n].Y += teki_S[n].idouY;
for(i=0; i<tama_kazu; i++)
if(atarisikaku(teki_S[n].X,teki_S[n].Y,teki_S[n].sizeX,teki_S[n].sizeY,
tama.X[i],tama.Y[i],tama.sizeX,tama.sizeY) == true
&& tama.boor[i] == true){
teki_S[n].HP--;
tama.boor[i] = false;
}
DrawGraph(teki_S[n].X,teki_S[n].Y,teki_S[n].Graph,true);
}
}
void menyu(void){
DrawGraph(title.X , title.Y , title.Graph , true);
DrawGraph(start.X , start.Y , start.Graph , true);
DrawGraph(stop.X , stop.Y , stop.Graph , true);
DrawGraph(start.X , start.Y , start.Graph , true);
DrawGraph(sentaku.X , sentaku.Y , sentaku.Graph , true);
/*フルスクリーン処理
ChangeWindowMode(false);*/
if(CheckHitKey(KEY_INPUT_DOWN)&& suitti == 0)
suitti = 1;
if(CheckHitKey(KEY_INPUT_UP)&& suitti == 1)
suitti = 0;
switch(suitti){
case 0 :
sentaku.Y = start.Y + start.sizeY / 2 - sentaku.sizeY / 2;
break;
case 1 :
sentaku.Y = stop.Y + stop.sizeY / 2 - sentaku.sizeY / 2;
break;
}
WaitTimer(10);
}
void men1(void){
//内容
//画面3 : 空白1
//画面の中には背景、自機
//空白の中には下から
//現スコア、ハイスコア、ボム、残機、タイトル
//自機の座標はX=画面の半分 Y=画面下
char sukoa[10],haisukoa[10];
sprintf(sukoa,"%d",score);
sprintf(haisukoa,"%d",highscore);
DrawExtendGraph(0,-haikei.sizeY,gamen.gamen34,haikei.Y,haikei.Graph,true);
DrawGraph(ziki.X,ziki.Y,ziki.Graph,true);
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -45,sukoa,(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -110,haisukoa,(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -65,"今スコア",(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -130,"ハイスコア",(255,255,255));
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60,bomS.Graph,true);
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60,zankiS.Graph,true);
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60 -20 -130,titleS.Graph,true);
mod++;
if(mod == 120)
mod = 0;
if(haikei.sizeY > 0 && mod % 3 == 0){
haikei.sizeY--;
haikei.Y++;
}
}
void syoki(void){
//必要分の初期設定のサブルーチン
//使用画像取得
ziki.Graph = LoadGraph("ziki.png");
ziki.Graph = LoadGraph("自機.png");
teki.Graph = LoadGraph("teki.jpg");
tama.Graph = LoadGraph("tama.png");
haikei.Graph = LoadGraph("背景.jpg");
title.Graph = LoadGraph("タイトル.jpg");
bomS.Graph = LoadGraph("tama.png");
zankiS.Graph = LoadGraph("tama.png");
titleS.Graph = LoadGraph("tama.png");
start.Graph = LoadGraph("スタート.bmp");
stop.Graph = LoadGraph("終わり.bmp");
sentaku.Graph = LoadGraph("やじるし.png");
//画像のサイズ取得
gamen.sizeX = 640;
gamen.sizeY = 480;
gamen.color = 32;
GetGraphSize(ziki.Graph,&ziki.sizeX,&ziki.sizeY);
for(i=0; i<500; i++)
GetGraphSize(teki.Graph,&teki.sizeX[i],&teki.sizeY[i]);
GetGraphSize(tama.Graph,&tama.sizeX,&tama.sizeY);
GetGraphSize(haikei.Graph,&haikei.sizeX,&haikei.sizeY);
GetGraphSize(title.Graph,&title.sizeX,&title.sizeY);
GetGraphSize(start.Graph,&start.sizeX,&start.sizeY);
GetGraphSize(stop.Graph,&stop.sizeX,&stop.sizeY);
GetGraphSize(sentaku.Graph,&sentaku.sizeX,&sentaku.sizeY);
//自由計算場(コメントで説明を書いてね)
gamen.gamen34 = gamen.sizeX * 3 / 4; //画面の3分の4の大きさの取得
haikei.Y = gamen.sizeY;
gamen.bairitu = gamen.gamen34 / haikei.sizeX;
//画像の座標取得
ziki.X = gamen.gamen34 / 2 - ziki.sizeX / 2;
ziki.Y = gamen.sizeY - ziki.sizeY - 10;
title.X = gamen.sizeX / 2 - title.sizeX / 2;
title.Y = gamen.sizeY / 4 - title.sizeY / 2;
start.X = gamen.sizeX / 2 - start.sizeX / 2;
start.Y = gamen.sizeY / 2;
stop.X = gamen.sizeX / 2 - stop.sizeX / 2;
stop.Y = start.Y + start.sizeY + 20;
sentaku.X = start.X - sentaku.sizeX - 10;
for(i=0;i>tama_kazu;i++){
tama.X[i] = ziki.X + ziki.sizeX / 2 - tama.sizeX / 2;
tama.Y[i] = ziki.Y + 15;
tama.boor[i] = 0;
}
//倍率
//内容
//画面3 : 空白1
//画面の中には背景、自機
//空白の中には下から
//現スコア、ハイスコア、ボム、残機、タイトル
//自機の座標はX=画面の半分 Y=一番下から登場時に+10
}
void player(void){
//自機の移動用サブルーチン
if(!CheckHitKey(KEY_INPUT_LSHIFT)){
if( CheckHitKey(KEY_INPUT_UP) == 1 &&
ziki.Y > 0){
ziki.Y -= 3;
}
if( CheckHitKey(KEY_INPUT_DOWN) == 1 &&
ziki.Y < gamen.sizeY - ziki.sizeY){
ziki.Y += 3;
}
if( CheckHitKey(KEY_INPUT_LEFT) == 1 &&
ziki.X > 0){
ziki.X -= 3;
}
if( CheckHitKey(KEY_INPUT_RIGHT) &&
ziki.X < gamen.gamen34 - ziki.sizeX){
ziki.X += 3;
}
}else if(CheckHitKey(KEY_INPUT_LSHIFT)){
if( CheckHitKey(KEY_INPUT_UP) == 1 &&
ziki.Y > 0){
ziki.Y--;
}
if( CheckHitKey(KEY_INPUT_DOWN) == 1 &&
ziki.Y < gamen.sizeY - ziki.sizeY){
ziki.Y++;
}
if( CheckHitKey(KEY_INPUT_LEFT) == 1 &&
ziki.X > 0){
ziki.X--;
}
if( CheckHitKey(KEY_INPUT_RIGHT) &&
ziki.X < gamen.gamen34 - ziki.sizeX){
ziki.X++;
}
}
}
void syotto(void){
// Zキーを押した場合は処理を分岐
if( CheckHitKey( KEY_INPUT_Z ) ){
// 画面上にでていない弾があるか、弾の数だけ繰り返して調べる
for( i = 0 ; i < tama_kazu ; i ++ ){
// 弾iが画面上にでていない場合はその弾を画面に出す
if( tama.boor[i] == 0 ){
// 弾iの位置をセット、位置はボール君の中心にする
tama.X[i] = ( ziki.X + ziki.sizeX / 2 - tama.sizeX / 2);
tama.Y[i] = ( ziki.Y + 15);
// 弾iは現時点を持って存在するので、存在状態を保持する変数に1を代入する
tama.boor[i] = 1 ;
// 一つ弾を出したので弾を出すループから抜けます
break ;
}
}
}
// 弾の数だけ弾を動かす処理を繰り返す
for( i = 0 ; i < tama_kazu ; i ++ )
{
// 自機の弾iの移動ルーチン( 存在状態を保持している変数の内容が1(存在する)の場合のみ行う )
if( tama.boor[i] == 1 ){
// 弾iを5ドット上に移動させる
tama.Y[i] -= 20 ;
// 画面外に出てしまった場合は存在状態を保持している変数に0(存在しない)を代入する
if( tama.Y[i] < 0 ){
tama.boor[i] = 0 ;
}
// 画面に弾iを描画する
DrawGraph( tama.X[i] , tama.Y[i] , tama.Graph , true ) ;
}
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(true);
SetGraphMode(gamen.sizeX , gamen.sizeY , gamen.color);
DxLib_Init(); // DXライブラリ初期化処理
syoki();
while(1){
if(CheckHitKey(KEY_INPUT_Z)&& suitti == 0)
break;
if(CheckHitKey(KEY_INPUT_Z)&& suitti == 1)
goto a;
ClearDrawScreen(); // 画面を消す
menyu();
}
while(1){
if(porse == false){
if(CheckHitKey(KEY_INPUT_RETURN)){
//Enter二回で強制終了
break;
}
if(CheckHitKey(KEY_INPUT_ESCAPE) && porse == false){
WaitTimer(100);
porse = true;
}
highscore = score;
//数値確認
printfDx("%d\n%d\n%d\n%d\n%d\n%d\n"
,haikei.sizeY , tasikame , teki_S[4].HP , teki_S[0].fulg , teki_S[1].fulg , teki_S[2].fulg);
ClearDrawScreen(); // 画面を消す
men1();
player();
syotto();
/*敵の出現座標は一面の初期値:haikei.sizeY(1525)から引いて計算する
例)haikei.sizeY == 1525 : 最初っから出てくる
haikei.sizeY == 775 : 一面が半分まで言ったら出てくる
haikei.sizeY == 0 : 最後で出てくる*/
teki_ugoki(1500,0,0,1,1,50,teki.Graph,50);
DrawGraph(ziki.X , ziki.Y, ziki.Graph ,true);
ScreenFlip(); //裏画面を表画面に反映
}
if( porse == true ){
ClearDrawScreen(); // 画面を消す
DrawString(240,240,"一時停止中",(255,255,255));
if(CheckHitKey(KEY_INPUT_ESCAPE) && porse == true){
WaitTimer(100);
porse = false;
}
ScreenFlip(); //裏画面を表画面に反映
}
}
a:;
DxLib_End(); // DXライブラリ終了処理
return 0;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 敵の出現及び消滅処理について質問したいことが・・・
最新のコードではpatan = false;にしているようですが、これではダメですか?
あと自機の座標を基準にしているようですが、前後に動くと何回も同じ座標を指しませんか? 大丈夫なら良いのですが。
デバッガでちゃんと追いかけきれていないなら、printfデバッグ法をおすすめします。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2
【補足】画像データがないので、動作は確認できておりません。
あと自機の座標を基準にしているようですが、前後に動くと何回も同じ座標を指しませんか? 大丈夫なら良いのですが。
デバッガでちゃんと追いかけきれていないなら、printfデバッグ法をおすすめします。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2
【補足】画像データがないので、動作は確認できておりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 敵の出現及び消滅処理について質問したいことが・・・
苦言になりますがコードが非常に読みにくいです。
menyu等のローマ字表示は止め、menuと誰が見ても判るように書くべきだと思います。
後々、自分で読み返しても解読が困難になると思います。
3回も呼ばれているのを考えてはどうかと書きましたが、何故3回呼ばれているか考えたでしょうか? このteki_ugoki関数を呼び出しているwhileループの中でここの条件式内の
数値が変化していないループがあるので3回呼ばれているのです。
今回提示いただいたコードではzahyoは1500固定なので、怪しいのはhaikei.sizeYの数値です。
この変数を増減させている箇所があるはずです。
men1関数内に怪しいウェイトありませんか。
*誤字修正
menyu等のローマ字表示は止め、menuと誰が見ても判るように書くべきだと思います。
後々、自分で読み返しても解読が困難になると思います。
3回も呼ばれているのを考えてはどうかと書きましたが、何故3回呼ばれているか考えたでしょうか? このteki_ugoki関数を呼び出しているwhileループの中でここの条件式内の
数値が変化していないループがあるので3回呼ばれているのです。
今回提示いただいたコードではzahyoは1500固定なので、怪しいのはhaikei.sizeYの数値です。
この変数を増減させている箇所があるはずです。
men1関数内に怪しいウェイトありませんか。
*誤字修正
Re: 敵の出現及び消滅処理について質問したいことが・・・
>>最新のコードではpatan = false;にしているようですが、これではダメですか?
・特に変化は見られませんでした、、、
>>あと自機の座標を基準にしているようですが、前後に動くと何回も同じ座標を指しませんか? 大丈夫なら良いのですが。
・前後に動く分には特に問題はありませんでした。
>>苦言になりますがコードが非常に読みにくいです。
menyu等のローマ字表示は止め、menuと誰が見ても判るように書くべきだと思います。
後々、自分で読み返しても解読が困難になると思います。
・これについては個人で制作していたものなので、気にかけていませんでした、これから修正していきたいと思います。
>>3回も呼ばれているのを考えてはどうかと書きましたが、何故3回呼ばれているか考えたでしょうか?
このteki_ugoki関数を呼び出しているwhileループの中でここの条件式内の
数値が変化していないループがあるので3回呼ばれているのです。
今回提示いただいたコードではzahyoは1500固定なので、怪しいのはhaikei.sizeYの数値です。
この変数を増減させている箇所があるはずです。
men1関数内に怪しいウェイトありませんか。
・この意見が気になり、調べてみたところ、見事に解決できました。
どうやら原因は、
の3で割った余りの時のみ動かしていた部分だったようです。
ご協力ありがとうございました。
・特に変化は見られませんでした、、、
>>あと自機の座標を基準にしているようですが、前後に動くと何回も同じ座標を指しませんか? 大丈夫なら良いのですが。
・前後に動く分には特に問題はありませんでした。
>>苦言になりますがコードが非常に読みにくいです。
menyu等のローマ字表示は止め、menuと誰が見ても判るように書くべきだと思います。
後々、自分で読み返しても解読が困難になると思います。
・これについては個人で制作していたものなので、気にかけていませんでした、これから修正していきたいと思います。
>>3回も呼ばれているのを考えてはどうかと書きましたが、何故3回呼ばれているか考えたでしょうか?
このteki_ugoki関数を呼び出しているwhileループの中でここの条件式内の
数値が変化していないループがあるので3回呼ばれているのです。
今回提示いただいたコードではzahyoは1500固定なので、怪しいのはhaikei.sizeYの数値です。
この変数を増減させている箇所があるはずです。
men1関数内に怪しいウェイトありませんか。
・この意見が気になり、調べてみたところ、見事に解決できました。
どうやら原因は、
void men1(void){
//内容
//画面3 : 空白1
//画面の中には背景、自機
//空白の中には下から
//現スコア、ハイスコア、ボム、残機、タイトル
//自機の座標はX=画面の半分 Y=画面下
char sukoa[10],haisukoa[10];
sprintf(sukoa,"%d",score);
sprintf(haisukoa,"%d",highscore);
DrawExtendGraph(0,-haikei.sizeY,gamen.gamen34,haikei.Y,haikei.Graph,true);
DrawGraph(ziki.X,ziki.Y,ziki.Graph,true);
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -45,sukoa,(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -110,haisukoa,(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -65,"今スコア",(255,255,255));
DrawString(gamen.sizeX - 140,gamen.sizeY -20 -130,"ハイスコア",(255,255,255));
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60,bomS.Graph,true);
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60,zankiS.Graph,true);
DrawGraph( gamen.sizeX - 140,gamen.sizeY -20 -130 -20 -60 -20 -60 -20 -130,titleS.Graph,true);
mod++;
if(mod == 120)
mod = 0;
if(haikei.sizeY > 0 && mod % 3 == 0){
haikei.sizeY--;
haikei.Y++;
}
}
ご協力ありがとうございました。