ゲームのマス目移動を実現するには

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

トピックに返信する


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

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

トピックのレビュー
   

展開ビュー トピックのレビュー: ゲームのマス目移動を実現するには

Re: ゲームのマス目移動を実現するには

#4

by 若葉マークぺらひこ » 7年前

後日実装できました。
前ゲームプログラミングの館を参考にしました。
ありがとうございました!

Re: ゲームのマス目移動を実現するには

#3

by 若葉マークぺらひこ » 7年前

なるほど!
フラグなら何とか分かりそうなので頑張ってみます。
ありがとうございます!

Re: ゲームのマス目移動を実現するには

#2

by みけCAT » 7年前

とりあえず
若葉マークぺらひこ さんが書きました:下と右しか動きません。上や左を入力しても無反応です。
若葉マークぺらひこ さんが書きました:

コード:

	else if (x % 32 != 0 && x % 32 < 0) {
		x--;
	}
	if (Key[KEY_INPUT_UP] >= 1) { // 上キーが押されていたら
		y--;                       // 上へ移動
	}
	else if (y % 32 != 0 && y % 32 < 0) {
		y--;
	}
正の数を正の数で割った余りは負にはなりません。
移動方向を表すフラグが必要そうですね。

ゲームのマス目移動を実現するには

#1

by 若葉マークぺらひこ » 7年前

自分は先日ようやくDXライブラリを動かすことが出来た者です。
現在、RPGに近い移動方式のアクション(見下ろし視点時代のゼルダに近いものです、具体的には4つの剣のようなものです)を作ろうとしているのですが、1マス移動させるという行程が上手くできません。
現在は新・ゲームプログラミングの館を参考に以下のようなコードを書いているのですが、下と右しか動きません。上や左を入力しても無反応です。
また、画像を分割して表示することは出来たのですが、それを切り替えながら表示する(歩いているように見せる)ことが出来ません。
どうすればマス移動させることが出来るでしょうか?
また、マスを最初に設定する?やり方があるそうですが、その方がいいのでしょうか?

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

			  // キーの入力状態を更新する
int gpUpdateKey() {
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i<256; i++) {
		if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int x = 320, y = 240;
int Handle;

void gpCalc() {
	if (Key[KEY_INPUT_RIGHT] >= 1) { // 右キーが押されていたら
		x++;                       // 右へ移動
	}
	else if (x % 32 != 0 && x % 32 > 0) {
		x++;
	}
	if (Key[KEY_INPUT_DOWN] >= 1) { // 下キーが押されていたら
		y++;                       // 下へ移動
	}
	else if (y % 32 != 0 && y % 32 > 0) {
		y++;
	}
	if (Key[KEY_INPUT_LEFT] >= 1) { // 左キーが押されていたら
		x--;                       // 左へ移動
	}
	else if (x % 32 != 0 && x % 32 < 0) {
		x--;
	}
	if (Key[KEY_INPUT_UP] >= 1) { // 上キーが押されていたら
		y--;                       // 上へ移動
	}
	else if (y % 32 != 0 && y % 32 < 0) {
		y--;
	}
}

void gpDraw() {
	DrawRotaGraph(x, y, 1.0, 0.0, Handle, TRUE);
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

	int Image[16];//16個の画像を格納する配列
	LoadDivGraph("画像/キャラクタ10.png", 16, 4, 4, 32, 32, Image);//画像を16個に分割してImage配列に保存

	int Green = GetColor(0, 255, 0);

	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新)
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0) {

		DrawGraph(0, 0, Image[0], TRUE);
		DrawGraph(0, 100, Image[10], TRUE);

     //座標表示装置
		DrawFormatString(0, 0, Green, "座標[%d,%d]", x, y); // 文字を描画する

		gpCalc();
		gpDraw();
	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

ページトップ