二つのif文が重複してしまう。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 二つのif文が重複してしまう。

Re: 二つのif文が重複してしまう。

#22

by Ouxiy » 4年前

ありがとうございます。

Re: 二つのif文が重複してしまう。

#21

by usao » 4年前

オフトピック
「基礎から学べ」と言われるのは,
この人の文章を読んだときに
「具体的どう誤解しているのか明確にはわからんけど,どこか大前提の部分にとんでもない勘違いをしているなこれは」という感想を持つからであろう.

「認識」の側が実はまともなのだ!ということであれば,毎回「書き方」にきちんと注意を払うべき.
読み手が意味を取り違えるような文章を書かないように.

Re: 二つのif文が重複してしまう。

#20

by usao » 4年前

オフトピック
> 認識の違いというか、条件の書き方が悪かったです。

なんというか,この人の場合,「認識」と「書き方」のどちら側に問題があるのか読み手に判断付かない度合がすごいというか…

頭の中では「A」だと考えているのにそれを文章に起こすと何故か「A」ではなく「A’」と書いてしまうのか,
それとも,最初から「A’」だと考えているから文章にも「A’」と書いているのか,
どっちなのか(それともどちらでもない何かなのか)が判断付かない.

そのせいか,【「処理の流れ」をどう捉えて(誤解して)いるのか?】がうまく伝わってこない,というか,その時々でそこらへんの認識が変わっていて一貫していないようにすら見える.
例えば,

int main()
{
A();
B();
...
}
とか書いた場合に,
【まずA()の処理が開始されてそれが完全に終わった後でB()の処理が開始される,ということが把握できておらず,
まるでA()とB()が{独立に,並列に,勝手に}動作するかのように捉えているんじゃないか?】
と見える時もあれば,逆に,
【A()の処理が終わってからB()の処理が始まるまでの間に「かなりの時間が置かれる」と考えているのでは?】と見える時もある.

if( A>=5 ){ 処理1 }
という条件をどこかに書いたならば【変数Aの値がどこかで5以上の値に変わった瞬間におもむろに自動的に処理1が始まるのだと思っているのでは?】と見えるときもあるし,
【変数の値を if( A>=5 ) とか条件チェックした瞬間に,当該変数の値が自動的に初期値にでも戻るかのような認識でいるのでは?】と見えるときもある.

Re: 二つのif文が重複してしまう。

#19

by Ouxiy » 4年前

スルーしていたわけではありません。
気づかなくてすいません。
認識の違いというか、条件の書き方が悪かったです。

Re: 二つのif文が重複してしまう。

#18

by usao » 4年前

オフトピック
> スルーしてるのは、なぜですか ?

一度,「基礎からやれ」と言ったので嫌われているのでしょう.
それ系の話が何故かとても嫌いみたいです.

まぁ「俺は基礎は学ばない!」という強い意志を貫く独自のスタイルも有りだとは思います.

Re: 二つのif文が重複してしまう。

#17

by あたっしゅ » 4年前

usao さんの

>> 再びキーAを押すことで
>
>ひょっとして,このあたりの認識が間違っているのではなかろうか.

をスルーしてるのは、なぜですか ?

Re: 二つのif文が重複してしまう。

#16

by あたっしゅ » 4年前

基礎である 「else」 や 「if のネスト」が、わかってるかどうか尋ねました。

Re: 二つのif文が重複してしまう。

#15

by usao » 4年前

オフトピック
> 再びキーAを押すことで

ひょっとして,このあたりの認識が間違っているのではなかろうか.

Re: 二つのif文が重複してしまう。

#14

by dic » 4年前

Ouxiy さんが書きました:
4年前
何がどう馬鹿なのでしょうか?
よければこの馬鹿にわかりやすく教えてください。
もしできないなら解答でないものとして通報します。
どう馬鹿なのか私には説明できません。
馬鹿なのは私なのでしょう。
ご気分を害したならばお詫び申し上げます。

Re: 二つのif文が重複してしまう。

#13

by Ouxiy » 4年前

自信がないですが、countは30です。
理由は最初のif文で

コード:

count3

コード:

40
になり、敵が

コード:

enemyImage == enemyGHandle[5]
の状態で再びキーAを押すことで

コード:

count3 - 10
が実行され、

コード:

40-10
より

コード:

count

コード:

30
となるためです。
間違っていたら正しい答えを教えてください。


ちなみに、私事なのですが、お気付きかと思いますが今現在DXライブラリを使ってPCで出来るゲームを作製しています。そこでプログラムを書いている際に疑問や解決策がわからない際に頼ってもいいでしょうか。
私はツイッターをやっているので個人的に困った際に質問したいです!もちろん無料とは言いません。それ相応の対価を払わせて頂きたく思います。どうか自分でコードを書きながらも詰まってしまうことがあるので、考えて頂けると大変うれしいです。

Re: 二つのif文が重複してしまう。

#12

by かめのこのこのこ » 4年前

よろしい (閻魔様みたいに低い声で赤丸を描いた紙を見せながら...ってもう東京フレンドパークが終わって数年経つのか...

...冗談はここまでにして、ならば、#1の問題の if 文で条件分岐に絡んでいるところだけを取り出して...

コード:

if (lock) {

	if (Key[KEY_INPUT_A] == 1 && count <= 50) {  //殴る//(lock){}の中に書くとロックする度にcountが0になるので意味がない
					
		lock = 0;//lock = 1の時の「lock!!」の描画を消すためにlockの値を0に変更。
		enemyImage = enemyGHandle[5];//攻撃を食らうと右向きになるようにする
		count = count - 10;//キーAを押すたびに10だけ引く
		count3 = count;
	}
}
			
if (Key[KEY_INPUT_A] == 1 && enemyImage == enemyGHandle[5])//敵が右向きの時に続けてAを押すと連続攻撃ができる//相手がenemyImage == enemyGHandle[5]状態の時に他の攻撃もできるように他のキーも&&すればいい
{
	count = count3 - 10;
}
で最初が

コード:

lock = 1, count = 50, Key[KEY_INPUT_A] = 1
だったらこの一連の処理が終わったら count はいくつでしょうか?

Re: 二つのif文が重複してしまう。

#11

by Ouxiy » 4年前

コード:

# include <stdio.h>
int main() { 
  int lock = 1;
  int count = 0;

  if (lock == 1) {
    if (count == 0) { ロックが1でかつカウンターが0の時、出力されるのはロックは0、カウンターは30である。
      lock = 0;
      count = 30;
    }
    if (count > 0) { そのあと、出力で出てきたカウンター30が条件に当てはまるため、-1されてカウンターは29
      count--;      になると思ったのですが違うでしょうか。
    }
  }
  
  printf("%d", count); // ★
  return 0;
}

Re: 二つのif文が重複してしまう。

#10

by Ouxiy » 4年前

どうもありがとうございます。
自信はないですが答えは29です。

Re: 二つのif文が重複してしまう。

#9

by かめのこのこのこ » 4年前

さて突然ですが逆質問と。
(どこに私たちと Ouxiy さんの間に認識の違いがあるか探っていきたいのでしばしお付き合いをお願いいたします..)

コード:

# include <stdio.h>
int main() { 
  int lock = 1;
  int count = 0;

  if (lock == 1) {
    if (count == 0) {
      lock = 0;
      count = 30;
    }
    if (count > 0) {
      count--;
    }
  }
  
  printf("%d", count); // ★
  return 0;
}
[問題] ★の地点で count はいくつになっているでしょうか? (または標準出力に出力されるのは?)
(1) 30
(2) 29
(3) 0

Re: 二つのif文が重複してしまう。

#8

by Ouxiy » 4年前

何がどう馬鹿なのでしょうか?
よければこの馬鹿にわかりやすく教えてください。
もしできないなら解答でないものとして通報します。

Re: 二つのif文が重複してしまう。

#7

by dic » 4年前

== 規約違反があったため管理人が削除しました ==

Re: 二つのif文が重複してしまう。

#6

by Ouxiy » 4年前

以下のように行いました。一応理にかなっていると思うのですがうまくいきませんでした。
一つ目のifもなぜか重複してしまい50から20ずつ引かれてしまいます。なぜでしょうか。

コード:

int count2 = 1;
            //playerY != enemyYよりY座標が異なる場合を表す、Y座標が異なる場合はlockの値は0になる。要はロックが解除されてしまう。
            if (lock) {

                if (Key[KEY_INPUT_A] == 1 && count <= 50&& count2 == 1) {  //殴る//(lock){}の中に書くとロックする度にcountが0になるので意味がない
                    //count++;  ここにcount書くとifの条件よりcountが0の時の下のlockやplayerX = enemyX - 1など条件になるため、++でcountが1になったらロックできても攻撃できないんだ
                    //ここのcountの情報がそのまま下の描画関数に渡されるだけ。
                    //if (count >= 0 && ++count > 40) {//countが0から15になるまでを一フレームで表しただけでは?ようはcountを0~1にするのに15フレームかかっただけでは?いや、単純にここにフレームは働いていないなので++count > 40と書いて39回行うはずがフレームが働かないので1しか上がっていないので一回しか攻撃が出来ないのだ


                    lock = 0;//lock = 1の時の「lock!!」の描画を消すためにlockの値を0に変更。
                    lockonMove = 0;//アタックする時 ロックオンの画像が消えるように値を0にする。
                    preplayerX = playerX; // 元の位置を保持
                    playerX = enemyX - 1; // 俺は敵の眼前へ
                    after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
                    enemyImage = enemyGHandle[5];//攻撃を食らうと右向きになるようにする
                    count = count - 10;//キーAを押すたびに10だけ引く
                    count3 = count;
                    count2 = count2 - 1;//ここで0になる、Aを繰り返してcount2が—1になったとしてもcount2<=0より二つ目のifの条件に合うので二つ目のifが実行できるはず、、、。
                }
            }

            if (Key[KEY_INPUT_A] == 1 && enemyImage == enemyGHandle[5]&&count2<=0)//敵が右向きの時に続けてAを押すと連続攻撃ができる//相手がenemyImage == enemyGHandle[5]状態の時に他の攻撃もできるように他のキーも&&すればいい
            {
                count = count3 - 10;
                playerX = enemyX - 1; // 俺は敵の眼前へ
                after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
            }

Re: 二つのif文が重複してしまう。

#5

by Ouxiy » 4年前

一つ目もわかります。
ですが、二つのプログラムと今回の問題の関係性がわかりません。

Re: 二つのif文が重複してしまう。

#4

by Ouxiy » 4年前

二つ目の画像のifはifの文が真のとき、中括弧内のifへ進み、そのifが偽の場合、elseの方へ進みます。
正しいでしょうか?

Re: 二つのif文が重複してしまう。

#3

by あたっしゅ » 4年前

コード:

if( 条件 ) {
    処理A();
} else {
    処理B();
}
は、わかりますか ?

コード:

if( 条件C ) {
    if( 条件D ) {
        処理E();
    } else {
        処理F();
    }
}
は、どうでしょう ?

Re: 二つのif文が重複してしまう。

#2

by Ouxiy » 4年前

こちらのサイトとマルチポストしています。解決しだいどちらかでベストアンサーを決めさせて頂きます。
https://teratail.com/questions/213060?modal=q-comp

二つのif文が重複してしまう。

#1

by Ouxiy » 4年前

以下のプログラムはRキーでロックオンしてAキーでアタックして、敵の画像が右横を向いた際にさらにキーAを押すと連続的に攻撃出るようにしたいのですが、最初のif文の条件と引っかかってしまい、二つ目のifと同時に条件が起こってしまい、50から30となってしまいます。
どうすれば二つ目の条件が二つ目の条件と被らずに連続攻撃が出来るでしょうか?

また、

コード:

if (lock) {

				if (Key[KEY_INPUT_A] == 1 && count <= 50) {  //殴る//(lock){}の中に書くとロックする度にcountが0になるので意味がない
					//count++;  ここにcount書くとifの条件よりcountが0の時の下のlockやplayerX = enemyX - 1など条件になるため、++でcountが1になったらロックできても攻撃できないんだ
					//ここのcountの情報がそのまま下の描画関数に渡されるだけ。
					//if (count >= 0 && ++count > 40) {//countが0から15になるまでを一フレームで表しただけでは?ようはcountを0~1にするのに15フレームかかっただけでは?いや、単純にここにフレームは働いていないなので++count > 40と書いて39回行うはずがフレームが働かないので1しか上がっていないので一回しか攻撃が出来ないのだ


					lock = 0;//lock = 1の時の「lock!!」の描画を消すためにlockの値を0に変更。
					lockonMove = 0;//アタックする時 ロックオンの画像が消えるように値を0にする。
					preplayerX = playerX; // 元の位置を保持
					playerX = enemyX - 1; // 俺は敵の眼前へ
					after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
					enemyImage = enemyGHandle[5];//攻撃を食らうと右向きになるようにする
					count = count - 10;//キーAを押すたびに10だけ引く
					count3 = count;

				}
			}
			if (Key[KEY_INPUT_A] == 1 && enemyImage == enemyGHandle[5])//敵が右向きの時に続けてAを押すと連続攻撃ができる//相手がenemyImage == enemyGHandle[5]状態の時に他の攻撃もできるように他のキーも&&すればいい
			{
				count = count3 - 10;
				playerX = enemyX - 1; // 俺は敵の眼前へ
				after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
			}
			

以下は全体のコードです。

コード:

#include "DxLib.h"

int Key[256];

int gpUpdateKey()
{
	char tmpKey[256];
	GetHitKeyStateAll(tmpKey);
	for (int i = 0; i < 256; i++)
		(tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++;
	return 0;
}

int stage[4][7][2];  // 盤上のマスの格子点の座標
int pos[3][6][2];    // キャラ描画座標

void init_stage()  // stage と pos を初期化する
{
	for (int j = 0; j < 7; j++) {
		int w = (j - 3) * 100, h = 300;
		for (int i = 4; --i >= 0; ) {
			stage[i][j][0] = w + 400, stage[i][j][1] = h - 100;
			w = w * 9 / 10, h = h * 9 / 10;
		}
	}
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 6; j++) {
			pos[i][j][0] = (stage[i][j][0] + stage[i + 1][j + 1][0]) / 2 - 25;
			pos[i][j][1] = (stage[i][j][1] + stage[i + 1][j + 1][1]) / 2 - 65;
		}
}

int White;
int function_status;//戦闘画面中は1とするための変数function_statusの定義



int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	SetGraphMode(780, 680, 32);         // ウィンドウの大きさを指定
	ChangeWindowMode(TRUE);             // 全画面ではなくウインドウを使用
	if (DxLib_Init() == -1) return -1;  // DXライブラリ初期化処理
	SetDrawScreen(DX_SCREEN_BACK);      // 裏画面を使用する設定

	init_stage(); // stage, pos の初期化

	int enemyX = 4, enemyY = 1;   // 敵の位置
	int playerX = 1, playerY = 1;  // 俺の位置

	int enemyMove = 0;   // 敵の移動状態
	  // 俺の移動状態//1~21で右に振り向きのプログラム①が終わり、22になったら足踏みする②を実行するようにする。
	int playerMove = 1;

	int lockonMove = 0;
	int lockonHandle[3];

	function_status = 1;//最初は1にして戦闘画面状態にする。


	int lock = 0;  // ロック状態

	int enemyGHandle[12];   // 敵のグラフィックハンドル格納用配列
	int playerGHandle[12];  // 俺のグラフィックハンドル格納用配列
			// 0-2:後ろ向き、3-5:右向き、6-8:前向き、9-11:左向き
	LoadDivGraph("charall.png", 12, 3, 4, 49, 66, enemyGHandle);
	LoadDivGraph("charall.png", 12, 3, 4, 49, 66, playerGHandle);
	LoadDivGraph("lockon.bmp", 3, 3, 1, 23, 23, lockonHandle);

	int enemyImage = enemyGHandle[11];    // 敵 左向き
	int playerImage = playerGHandle[4];   // 俺 右向き
	int lockImge = lockonHandle[3];
	int preplayerX;
	int after = 0;
	unsigned int count = 50;
	int count2=50;
	int count3 ;
	int slow;

	const int MOVE_INTERVAL = 1000; // 何ミリ秒ごとに移動処理をするか
	int nextMoveTime = GetNowCount() + MOVE_INTERVAL; // 次回移動処理をする時刻
	int stopCount = 0; // 動かないのがあと何回か



	while (ProcessMessage() == 0) {
		gpUpdateKey();  // キーの入力状態を取得
		if (Key[KEY_INPUT_X] == 1) { //キーXを押すとfunction_statusは0になる
			function_status = 0;
		}

		if (Key[KEY_INPUT_Y] == 1) { //キーYを押すとfunction_statusは1になる
			function_status = 1;//戦闘画面に戻す
		}

		else {//戦闘画面中は1とする
			//gpUpdateKey();  // キーの入力状態を取得 上のifで既にgpUpdateKey();があり、elseはif以外の情報は引き継ぐので再びgpUpdateKey();書く必要はなかった。
			// 俺の移動
			if (Key[KEY_INPUT_RIGHT] == 1 && playerX < 2) { //キーを入力する以外にも押した後に早く画像を切り替えて足踏みするようにするために初期値にも1はあるがキーにもplayerMove=1を書いたり、キーを押したらどうしたいかをするためにplayerX++を書いている。
				playerMove = 1;  playerX++; playerImage = playerGHandle[2];
			} //playerMove = 1;があると下に書いたplayerMoveより足踏みするplayerMoveが無いと初期値の1でそのまま足踏みするので遅く反応するのでは?
			if (Key[KEY_INPUT_LEFT] == 1 && playerX > 0) {//キーにplayerMove=1を書くと初期値の1よりも早くキーに書いたplayerMoveの1が行くため早く足踏みに行くため、止まってから足踏みに行くまでの間にある向きを変える画像playerGHandle[2]が一瞬であるため、向きを変えるのが早く見えるのでは?足踏みを速く来るようにしたため。
				playerMove = 1; playerX--; playerImage = playerGHandle[9];//まあ、足踏みさせなくても、ただ書くだけでも方向を十分早く変えれる
			}
			if (Key[KEY_INPUT_UP] == 1 && playerY > 0) {
				playerMove = 1; playerY--; playerImage = playerGHandle[2];
			}
			if (Key[KEY_INPUT_DOWN] == 1 && playerY < 2) {
				playerMove = 1; playerY++; playerImage = playerGHandle[8];
			}


			//Rが一度押された上でフレームを利用してループさせるためにif文を新しく外に書いたのだ。
			if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) {
				DrawGraph(pos[enemyY][enemyX][0], pos[enemyY][enemyX][1],//多分ここはいらない下に描画するための関数を書くため
					lockImge, FALSE);   // ロックマークの描画
				lock = 1;//Key[KEY_INPUT_R] == 1 && playerY == enemyYの時、lockを1にする。lockを「何フレーム目の時」でも値を1として置いたため、条件式lockの入力キーAに呼び出せる。
				lockonMove = 1;
			}
			if (lockonMove > 0) {//lockonMoveが0より大きいならば++lockonMoveをする、
				++lockonMove;
			}
			if (lockonMove == 10) {
				lockImge = lockonHandle[0];//情報lockonMove == 10やlockonHandle[0]を引き継いで下に書いた描画関数に入るため、ここには関数に入れる情報だけ入るのだ。
				//その時の情報lockonMove == 10やlockonHandle[0]以外の引き継がれたとうかその時の敵の座標なども関数に入る。関数が求めるものが入るので、関数に必要なものを揃える。
			}
			else if (lockonMove == 20) {
				lockImge = lockonHandle[1];

			}
			else if (lockonMove == 30) {
				lockImge = lockonHandle[2];


			}
			else if (lockonMove == 40) {
				lockImge = lockonHandle[1];
				lockonMove = 1;
			}

			if (playerY != enemyY) {
				lock = 0;
				lockonMove = 0;//敵が移動した場合ロックオンの画像が消えるようにlockonMoveを0にする。
			}

			int cheak;
			//playerY != enemyYよりY座標が異なる場合を表す、Y座標が異なる場合はlockの値は0になる。要はロックが解除されてしまう。
			if (lock) {

				if (Key[KEY_INPUT_A] == 1 && count <= 50) {  //殴る//(lock){}の中に書くとロックする度にcountが0になるので意味がない
					//count++;  ここにcount書くとifの条件よりcountが0の時の下のlockやplayerX = enemyX - 1など条件になるため、++でcountが1になったらロックできても攻撃できないんだ
					//ここのcountの情報がそのまま下の描画関数に渡されるだけ。
					//if (count >= 0 && ++count > 40) {//countが0から15になるまでを一フレームで表しただけでは?ようはcountを0~1にするのに15フレームかかっただけでは?いや、単純にここにフレームは働いていないなので++count > 40と書いて39回行うはずがフレームが働かないので1しか上がっていないので一回しか攻撃が出来ないのだ


					lock = 0;//lock = 1の時の「lock!!」の描画を消すためにlockの値を0に変更。
					lockonMove = 0;//アタックする時 ロックオンの画像が消えるように値を0にする。
					preplayerX = playerX; // 元の位置を保持
					playerX = enemyX - 1; // 俺は敵の眼前へ
					after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
					enemyImage = enemyGHandle[5];//攻撃を食らうと右向きになるようにする
					count = count - 10;//キーAを押すたびに10だけ引く
					count3 = count;

				}
			}
			if (Key[KEY_INPUT_A] == 1 && enemyImage == enemyGHandle[5])//敵が右向きの時に続けてAを押すと連続攻撃ができる//相手がenemyImage == enemyGHandle[5]状態の時に他の攻撃もできるように他のキーも&&すればいい
			{
				count = count3 - 10;
				playerX = enemyX - 1; // 俺は敵の眼前へ
				after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
			}
			
			
			if (count == 0)
			{
			    slow = 1;

			}
			if (slow > 0 && ++slow > 20) {
				count = 50;
				slow = 0;
			}

			

			if (after > 0 && ++after > 15) {//afterが1より大きい時++afterが働き15より大きくなったら、
				///ifの中にifを書いてしまうとその前のifを否定してしまうためデータが引き継げない。なので別のif文として書いた。←多分違う
				playerX = preplayerX;//preplayerXの座標をplayerXに代入する。
				playerImage = playerGHandle[4];
				after = 0;//アタック解除

			}

			// 敵の移動
			int t = GetNowCount();
			if (t >= nextMoveTime) { // 指定の時間が経ったら(1sごとに)
				nextMoveTime = t + MOVE_INTERVAL; // 次回移動処理をする時刻
				if (stopCount > 0) { // 停止中のとき
					stopCount--; // 止まっている残り時間(回数)を減らす
				}
				else { // 普通の状態のとき
					if (GetRand(99) < 10) { // たまに(10%の確率で)
						stopCount = GetRand(4); // 数秒間(1~5秒間)その場に止まる
					}
					else { // 9マス上のいずれかのパネルに移動させる
						int cy = enemyY, cx = enemyX;
						do {
							enemyY = GetRand(2);
							enemyX = GetRand(2) + 3;
						} while (enemyX == cx && enemyY == cy ||
							enemyX == playerX && enemyY == playerY);
						enemyImage = enemyGHandle[10];
						enemyMove = 1;
					}
				}
			}

			if (playerMove > 0) {//1フレームで処理を終わらせるためifの後はelse ifを使った。//フレームがあってもplayerMove++を書かないと1ずつ上がらない。playerMove++をフレームの60回ループするするところに書くことで以下のように書いて足踏みしている画像が描けた。
				playerMove++;//60フレームの中で、このifで条件(playerMove > 0)が真であるためplayerMove++を「フレーム」と「条件式」により繰り返しplayerMove++して、
				if (playerMove == 10)//以前の文を否定しないelse ifが次にあるためplayerMoveの情報を引き継ぎplayerMove == 20となるまで繰り返しplayerMove++をした。次にもelse ifがあるので同様、、、
				{
					playerImage = playerGHandle[4];
				}
				else if (playerMove == 20)//条件式として書くため=は==と書いた。//else ifによりplayerMoveが20を超えて(20の場合を否定し)30の場合を表す。
				{
					playerImage = playerGHandle[5];
				}
				else if (playerMove == 40)//30まで上がったものが40に上がった時、playerGHandle[4]になる。if文の連続では文法のルールで前の文を否定するため連続的に画像が流れず足踏みできない、なのでelse ifにしたのだ。
				{
					playerImage = playerGHandle[4];
				}
				else if (playerMove == 60 * 4) {//下に書いているように60フレームないに納めないといけないため、50まで上がったところで終わっている。
					playerImage = playerGHandle[3];//上に書いてることには誤りがある、60フレームで1sなだけ、超えてもいい。
					playerMove = 1;//
				}

			}


			//ループ内に書いたenemyMoveについてenemyMoveが0より大きくて40を超えたら{}の中身を実行。
			if (enemyMove > 0 && ++enemyMove > 40) {//pcが60フレームで一周するためenemyMoveが61以上だとenemyGHandle[8]が反映されず元のままで移動が終わる。なのでenemyMoveは60以下でなくてはならない
				enemyMove = 0; enemyImage = enemyGHandle[11];//60になる前に画像11を描画するようにしなければならないため、60より小さい40フレームにした。
			}
		}

		//これより以下は描画するためのプログラム
		ClearDrawScreen();  // 裏画面を



		//if (function_status == 0) {//function_status = 0の時はメニュー画面でfunction_statusが1の時は戦闘画面とした。
	//キーXを押すとfunction_statusを0とするように書いた
		if (function_status == 0) {
			White = GetColor(255, 255, 255);                    //色の取得
			DrawString(100, 140, "メニュー画面 (xをプッシュ)", White);
			//攻撃手段を選んでいる最中は0とする
			ScreenFlip();  // 裏画面を表画面に反映
		}

		else {// ステージの描画
			int stageColor = GetColor(160, 64, 64);
			for (int i = 0; i < 4; i++)
				DrawLine(stage[i][0][0], stage[i][0][1],
					stage[i][6][0], stage[i][6][1], stageColor, 5);
			for (int j = 0; j < 7; j++)
				DrawLine(stage[0][j][0], stage[0][j][1],
					stage[3][j][0], stage[3][j][1], stageColor, 5);

			DrawGraph(pos[enemyY][enemyX][0], pos[enemyY][enemyX][1],
				enemyImage, true);   // 敵キャラの描画

			DrawGraph(pos[playerY][playerX][0], pos[playerY][playerX][1],
				playerImage, true);  // 俺キャラの描画
			if (lock == 1) {
				DrawGraph(pos[enemyY][enemyX][0], pos[enemyY][enemyX][1],
					lockImge, FALSE);//ロックマーク中だけ描画するようにした。
			}//ロックマークの描画
			if (lock) DrawFormatString(100, 200, GetColor(255, 255, 255), "LOCK");//ループ内に書くと条件式lockのによりlockの値を0にしてもずっと表示されるため、必要な時に表示するようにここに書いた

			DrawFormatString(50, 300, GetColor(255, 0, 0), "殴る%d/%d", count, count2);//殴った回数をカウントを表示するための関数
		}
		ScreenFlip();  // 裏画面を表画面に反映
	}


	DxLib_End();  // DXライブラリ使用の終了処理
	return 0;  // ソフトの終了 

}

ページトップ