ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ouxiy
記事: 169
登録日時: 4ヶ月前

ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#1

投稿記事 by Ouxiy » 3ヶ月前

コード:

#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 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];
	int lockImge = lockonHandle[3];



	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 preplayerX;
	int after = 0;
	

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

	while (ProcessMessage() == 0) {
		
		gpUpdateKey();  // キーの入力状態を取得

		// 俺の移動
		if (Key[KEY_INPUT_RIGHT] == 1 && playerX < 2) {
			playerMove = 1; playerX++; playerImage = playerGHandle[4];
		}
		if (Key[KEY_INPUT_LEFT] == 1 && playerX > 0) {
			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];
		}

		if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) {
			lock = 1;//Key[KEY_INPUT_R] == 1 && playerY == enemyYの時、lockを1にする。lockを「何フレーム目の時」でも値を1として置いたため、条件式lockの入力キーAに呼び出せる。
			lockonMove = 1;

		}
			if (lockonMove > 0) {
				++lockonMove;
			}
			if (lockonMove == 10) {
				lockImge = 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にする。
		}
			
		
		//playerY != enemyYよりY座標が異なる場合を表す、Y座標が異なる場合はlockの値は0になる。要はロックが解除されてしまう。
		if (lock) {

			if (Key[KEY_INPUT_A] == 1) {  // アタック
				lock = 0;//lock = 1の時の「lock!!」の描画を消すためにlockの値を0に変更。
				lockonMove = 0;//アタックする時 ロックオンの画像が消えるように値を0にする。
				preplayerX = playerX; // 元の位置を保持
				playerX = enemyX - 1; // 俺は敵の眼前へ
				after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
			}
		}
			if (after > 0 && ++after > 15) {//afterが1より大きい時++afterが働き20より大きくなったら、
				//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 == 20)//以前の文を否定しないelse ifが次にあるためplayerMoveの情報を引き継ぎplayerMove == 20となるまで繰り返しplayerMove++をした。次にもelse ifがあるので同様、、、
			{
				playerImage = playerGHandle[4];
			}
			else if (playerMove == 30)//条件式として書くため=は==と書いた。//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();  // 裏画面をクリア

		// ステージの描画
		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[enemyY][enemyX][0], pos[enemyY][enemyX][1],
			lockImge, FALSE);   // 敵キャラの描画
		DrawGraph(pos[playerY][playerX][0], pos[playerY][playerX][1],
			playerImage, true);  // 俺キャラの描画
		
		if (lock) DrawFormatString(100, 200, GetColor(255, 255, 255), "LOCK");//ループ内に書くと条件式lockのによりlockの値を0にしてもずっと表示されるため、必要な時に表示するようにここに書いた
		ScreenFlip();  // 裏画面を表画面に反映
	}

	DxLib_End();  // DXライブラリ使用の終了処理
	return 0;  // ソフトの終了 
}
行いたいこと:if文を使ってロックオンしている最中だけ相手の真ん中に載せました画像ロックオンマークを上書きしたいです。

行ったこと:if文で実際に書いてみたのですが、ロックオンが外れたあともずっと描画されます。
以下のように相手の位置が切り替わった際に、かつ相手にアタックした際にはlockonMove = 0と書いたのですが、うまく機能しません。


アバター
usao
記事: 1566
登録日時: 6年前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#3

投稿記事 by usao » 3ヶ月前

オフトピック
ゲームっぽく例えると,
【LV2あたりの敵を相手に半死半生な実力であれば,LV10の敵に挑んで勝てるわけがありませんぜ】って感じです.

仮にFizzBuzzが難易度LV2で,今あなたがやろうとしていることがLV10なのだとしたら,
まずはLV10の事柄にまともに挑戦できるようになることが必要です.
少なくとも処理がどう流れていくのかのイメージも掴めない状態の人が取り組むべき内容ではありません

(1) まずLV2を余裕でこなせるようにLV1あたりから「普通に」勉強する
(2) LV2~LV9の難易度の事柄としばらく戦って,LV10に取り組める実力を養う

というステップを経ることが必要不可欠です.
前記「しばらく戦って」の期間が,数日程度で済むのか2週間程度は要するのかそれとも半年以上かかるのかはその人次第でしょうけど,ともかくまずは1から勉強してください.ごくごく普通の勉強をしてください

どこぞで出題されたFizzBuzzのちょっとした改変問題くらいは当たり前のようにクリアできるようになる必要があります.あれから結構時が経っていますが,自力で労なくクリアできるようになりましたか?

LV1あたりの質問を各所にひたすら投稿しまくることが趣味なのかもしれませんが,正直,そういうのは割と邪魔なんです.
本当にCなりC++なりを用いて何かを作ることが目的なのであれば,とりあえず「C言語 入門」とかでググって出てくるようなページで基礎の基礎から学ぶと良いかと存じます.マジで.本当に.

Ouxiy
記事: 169
登録日時: 4ヶ月前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#4

投稿記事 by Ouxiy » 3ヶ月前

そうですね。邪魔で悪かったですね。
あなたに言われなくても基礎勉強しながら作ってますよ。
無料サイトにも限界はあるので、お金を払って勉強した方がいいかもしれませんが。

アバター
usao
記事: 1566
登録日時: 6年前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#5

投稿記事 by usao » 3ヶ月前

オフトピック
> あなたに言われなくても基礎勉強しながら作ってますよ。

おそらく,あなたが勉強しているという「基礎」よりももっと手前の段階の基礎(前提的な事柄)を最初に学ぶ必要があるのだと思いますよ.
例えば,

コード:

int main()
{  //ここで A,B,C はそれぞれ何らかの処理である
 A;
 B;
 C;
}
のように書いたら3つの処理{A,B,C}がどの順序で処理されるのか,とかそこらへんのとこから話が書いてあるような場所を見つけて読むと良いでしょう.

「邪魔」という言葉が気に入らないのでしょうが,
このような前提レベルの話を把握していない相手にいくら回答したところで内容が理解されないわけなので,
 質問→回答→解決したねよかったね
というやりとりの形がそもそも成立しないのです.
せっかく回答された内容が毎度全く生かされないなら,一体何のために質問しているのでしょう?
そういった不毛な内容のトピックが乱立されればその分だけ他の人のトピックは過去ログ方向へと急速に流されていってしまうことにもなるわけですから,総合的に「邪魔」という言葉で表現するのが妥当ではないかと思います.

(他の場所では,あなたを直接排除しようという強硬な動きも見られたようですが)
私は別にあなたを排除したいわけではありません.
ただ,順序を経る必要があるのではないかと言っているだけです.

例えば,
+とか-とかの記号の意味だとか,括弧の中を先に計算するとかいうルールすら知らない相手が延々と「過度に数学的な話しようぜ!」と言ってきたらどう思います?
その話をする前に,まずは四則演算を学んでほしいとは思いません?

Ouxiy
記事: 169
登録日時: 4ヶ月前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#6

投稿記事 by Ouxiy » 3ヶ月前

そうですか。他のサイトにおいては、私自身が基礎を勉強しても抜けてしまい、それを叩いて面白がる器の小さい悪外な連中がいるだけですのでお構いなく。
基礎勉強を繰り返し勉強したほうがいいかもしれません。
貴方の言いたいことはよくわかりました。今後、基礎を勉強して今の問題がどうなるかわかりませんが、以前のようにここで不毛な問題はしないようにします。

Noir

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#7

投稿記事 by Noir » 3ヶ月前

オフトピック
邪魔になるほど質問は上がってないかと思います。
それも質問者を排除していった結果ではないでしょうか。排除するつもりは無くても結界いなくなればそれは排除ですからね。
質問する人がいなくなったらこの掲示板は何の為に存在するのでしょうか。
初心者を正しく導いてあげてこその先駆者だと思います。

アバター
usao
記事: 1566
登録日時: 6年前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#8

投稿記事 by usao » 3ヶ月前

オフトピック
> Noir氏

異なる 考え方/意見 は尊重しますので,
あなたが先駆者として導くというのならば,そのようにすればよろしいかと存じます.

#私の意図は既述の通り(他所のような)排除ではなく,あなたが言うところの「導き」です.
相手の理解状況を推測した結果として「まずはもっと基礎をちゃんと学んでください」というのも正しい助言だと私は考えます.

Noir

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#9

投稿記事 by Noir » 3ヶ月前

オフトピック
私は先駆者ではありませんのでここから消えます。
ありがとうございました。

かずま

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#10

投稿記事 by かずま » 3ヶ月前

修正は非常に簡単です。修正箇所は 1行だけ
・ロックオンしている最中だけ: 8文字追加
・真ん中にロックオンマーク: 6文字追加

私は、インデントのおかしなプログラムが大嫌いなので、
二つのプログラムの違いに関して。のトピックで、
正しいインデントのプログラムが追加されれば、
上記の修正方法をお教えます。
また、無駄に空行を 5行も入れる理由も教えてください。

Ouxiy
記事: 169
登録日時: 4ヶ月前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#11

投稿記事 by Ouxiy » 3ヶ月前

かずまさん、返信遅くなりすいませんでした。
インデントを整えるように努めているのですが、うまい人の真似をしても綺麗にならなくて、すいません。
無駄に空行を 5行も入れる理由も教えてください。
文章と文章の間の空間が開いたほうが見やすいと考え入れていました。

ロックオンに関しては真ん中以外の問題は解決できました。

コード:

#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 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];
	int lockImge = lockonHandle[3];

	
	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 preplayerX;
	int after = 0;
	

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

	while (ProcessMessage() == 0) {
		
		gpUpdateKey();  // キーの入力状態を取得

		// 俺の移動
		if (Key[KEY_INPUT_RIGHT] == 1 && playerX < 2) {
			playerMove = 1; playerX++; playerImage = playerGHandle[4];
		}
		if (Key[KEY_INPUT_LEFT] == 1 && playerX > 0) {
			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];
		}

		//if (Key[KEY_INPUT_R] == 1 && playerY == enemyY) {
		    //lock = 1;//Key[KEY_INPUT_R] == 1 && playerY == enemyYの時、lockを1にする。lockを「何フレーム目の時」でも値を1として置いたため、条件式lockの入力キーAに呼び出せる。
			//lockonMove = 1;

			//if (lockonMove > 0) {
				//++lockonMove;
			//}
			//if (lockonMove == 10) {
				//lockImge = 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文を書くのはいいが、if文の中にif文を書くと(Key[KEY_INPUT_R] == 1 && playerY == enemyY) の条件が常に成り立っていないと成り立たないので意味がない。
		//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];

		}
		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にする。
		}
			
		
		//playerY != enemyYよりY座標が異なる場合を表す、Y座標が異なる場合はlockの値は0になる。要はロックが解除されてしまう。
		if (lock) {

			if (Key[KEY_INPUT_A] == 1) {  // アタック
				lock = 0;//lock = 1の時の「lock!!」の描画を消すためにlockの値を0に変更。
				lockonMove = 0;//アタックする時 ロックオンの画像が消えるように値を0にする。
				preplayerX = playerX; // 元の位置を保持
				playerX = enemyX - 1; // 俺は敵の眼前へ
				after = 1;//アタック状態 ここまでをアタックとしてafter = 1と置いた。
			}
		}
			if (after > 0 && ++after > 15) {//afterが1より大きい時++afterが働き20より大きくなったら、
				//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 == 20)//以前の文を否定しないelse ifが次にあるためplayerMoveの情報を引き継ぎplayerMove == 20となるまで繰り返しplayerMove++をした。次にもelse ifがあるので同様、、、
			{
				playerImage = playerGHandle[4];
			}
			else if (playerMove == 30)//条件式として書くため=は==と書いた。//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();  // 裏画面をクリア

		// ステージの描画
		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にしてもずっと表示されるため、必要な時に表示するようにここに書いた
		ScreenFlip();  // 裏画面を表画面に反映

		
	}

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

Ouxiy
記事: 169
登録日時: 4ヶ月前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#12

投稿記事 by Ouxiy » 3ヶ月前

Noirさんのご意見、ありがとうございました。
基礎を勉強しながら、ゲーム作製に取り掛からせて頂いています。

Ouxiy
記事: 169
登録日時: 4ヶ月前

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#13

投稿記事 by Ouxiy » 2ヶ月前

あのカズマさん、
・真ん中にロックオンマーク: 6文字追加
とのことですが、どうやってのでしょうか?
真ん中に描画するような関数などあるのでしょうか。

dic
記事: 582
登録日時: 9年前
住所: 宮崎県

Re: ロックオンしている最中だけ相手の真ん中にロックオンマークを重ねたい。

#14

投稿記事 by dic » 2ヶ月前

私もusaoさんに同意見です。
usaoさんには私のようなものと同じで失礼かもしれませんが。


>>Ouxiyさん
あなたはレベル不足です。
無理です。
基礎から勉強してください。

数学的能力も足りないし、コミュニケーション能力も不足しています。
残念ですが、あきらめてください。
私にとっては迷惑です。

返信

“C言語何でも質問掲示板” へ戻る