画像(logo)

HOME/[C言語DXライブラリ]STGの作り方 目次/四日目 プレイヤーの表示と移動

広告

[C言語 DXライブラリ STGの作り方]
四日目 プレイヤーの表示と移動

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

目次へ戻る

プレイヤーの表示

今回はプレイヤーを表示・移動させてみましょう。

プレイヤーの構造体になります。

struct PLAYER{
	double x, y;
	double draw_x, draw_y;
	int speed;
	int shot_type;
	int bomb;
	int power;
	int life;
	double range;
};

struct PLAYER p1;

何やら変数がたくさんありますが最初はただ表示するだけなので使う変数は

double x, y;
double draw_x, draw_y;
int speed;

これだけです。

残りはまた使用する時に説明いたします。

変数「x,y」は直接プレイヤーの座標になります。

変数「draw_x,draw_y」は原点中央表示に合わせて計算しなおした座標になります。

変数「speed」は移動スピードになります。

初期化します。

void my_init_player(){
	p1.x = 0;
	p1.y = -200;
	p1.draw_x = 0;
	p1.draw_y = 0;
	p1.speed = 4;
	p1.shot_type = 0;
	p1.bomb = 1;
	p1.power = 1;
	p1.life = 3;
	p1.range = 10;
}

プレイヤーの構造体を初期化する為の「my_init_player()」です。

とりあえず初期座標「x0,y-200」と移動スピードは「p1.speed = 4;」と一度に「4」ピクセル移動させる事にしました。

残りは今は無視しといてください。

では先に原点中央表示のための関数「my_to_center()」とそこで計算した座標を使ってプレイヤーを表示する「my_draw_player()」を見てみましょう。

void my_to_center(){
	p1.draw_x = p1.x + 220;
	p1.draw_y = ((-1) * p1.y) + 240;
}

原点を中央にずらすという事は

画像(cdxs_4_1)

この場合は(x220,y240)が中央の座標でy座標は上がプラス方向になるのでx,y座標それぞれに中心の座標220と240を足してあげます。

そしてy座標のプラスとマイナスの方向が逆になるように「-1」をかけてあげます。

結果座標原点を中央にする事ができます。

画像(cdxs_4_2)

こんな感じです。

あとはその計算した「p1.draw_x」「p1.draw_y」を使って表示するだけです。

「my_draw_player()」です。

void my_draw_player(){
	DrawFormatString(p1.draw_x, p1.draw_y, Color_White, "P[%d][%d]", (int)p1.x, (int)p1.y);
}

関数「DrawFormatString」は前回説明しましたね。関数「printf」同じく「%d」などで変数の値を表示できるのでなんとなく今回はプレイヤーの座標を表示させてます。

double型の変数を「%d」でそのまま表示するとおかしな値が表示されるので「(int)p1.x」とキャストします。

広告

プレイヤーの移動

ではプレイヤーの表示ができたトコロで今度は移動させてみます。

キー入力の関数「my_get_key()」とプレイヤー移動の「my_move_player()」を見てみましょう。

int my_get_key(){
	char keys[256];
	GetHitKeyStateAll(keys);
	for (int i = 0; i < 256; i++){
		if (keys[i] != 0){
			key[i]++;
		}
		else{
			key[i] = 0;
		}
	}
	return 0;
}

void my_move_player(){
	if (key[KEY_INPUT_RIGHT] >= 1){
		p1.x += p1.speed;
	}
	if (key[KEY_INPUT_DOWN] >= 1){
		p1.y -= p1.speed;
	}
	if (key[KEY_INPUT_LEFT] >= 1){
		p1.x -= p1.speed;
	}
	if (key[KEY_INPUT_UP] >= 1){
		p1.y += p1.speed;
	}
}

まずは「my_get_key()」を見てみましょう。

前回も少し説明しましたが、まず全てのキーの入力状態を

GetHitKeyStateAll(keys);

こちらの関数によって配列「keys」に保存します。

配列「keys」は

char keys[256];

と宣言されていますね。

つまり256種類全てのキーの入力状態をいったんここに保存するワケです。

そしてこの関数はキーの入力があったトコロは0以外の値になるので

for (int i = 0; i < 256; i++){
	if (keys[i] != 0){
		key[i]++;
	}
	else{
		key[i] = 0;
	}
}

入力があったトコロはインクリメントして256種類丸ごとグローバル変数「key」に保存しなおします。

こうする事によってあとは

if (key[キーコード] >= 1)

そのキーコードの場所を調べるとそのキーがどのように押されているかがある程度わかるので(すごい勢いでインクリメントされていればずっと押され続けているなど)それに応じた処理を加えればいいワケです。

よく使いそうなキーコードを上げときます。

a〜z

「KEY_INPUT_A 〜 KEY_INPUT_Z」

矢印キー

「KEY_INPUT_RIGHT」

「KEY_INPUT_DOWN」

「KEY_INPUT_LEFT」

「KEY_INPUT_UP」

数字キー(テンキーとは別です)

「KEY_INPUT_0 〜 KEY_INPUT_9」

テンキーの数字

「KEY_INPUT_NUMPAD0 〜 KEY_INPUT_NUMPAD9」

テンキーの*

「KEY_INPUT_MULTIPLY」

テンキーの+

「KEY_INPUT_ADD」

テンキーの-

「KEY_INPUT_SUBTRACT」

テンキーの.

「KEY_INPUT_DECIMAL」

テンキーの/

「KEY_INPUT_DIVIDE」

テンキーのエンターキー

「KEY_INPUT_NUMPADENTER」

エンターキー

「KEY_INPUT_RETURN」

スペースキー

「KEY_INPUT_SPACE」

バックスペースキー

「KEY_INPUT_BACK」

エスケープキー

「KEY_INPUT_SPACE」

タブキー

「KEY_INPUT_TAB」

右シフトキー

「KEY_INPUT_RSHIFT」

左シフトキー

「KEY_INPUT_LSHIFT」

f1〜f12

「KEY_INPUT_F1 〜 KEY_INPUT_F12」

他のキーに関しては「gethitkeystateall リファレンス」などで検索してみてください。

続けて「my_move_player()」を見てみます。

if (key[KEY_INPUT_RIGHT] >= 1){
	p1.x += p1.speed;
}

見ればなんとなくわかると思いますが

「KEY_INPUT_RIGHT」

は矢印キーの右で、それが「1以上」なので押されていれば押されているだけ「p1.speed」分移動させてあげるだけですね。

他の方向も同じように動かします。

これでプレイヤーの表示と移動ができました!

移動範囲

プレイヤーを移動させる事はできましたがこのままではどこまでも移動してしまうので、移動できる範囲を決めます。

移動範囲などは後ほど変更されるかもしれないので定数化しておきます。

/*左の限界*/
#define LEFT_LIMIT -220
/*右の限界*/
#define RIGHT_LIMIT 220
/*上の限界*/
#define TOP_LIMIT 240
/*下の限界*/
#define BOTTOM_LIMIT -240

あとは条件を重ねる「&&」を使って先ほどのプログラムに条件を加えるだけです。

if (key[KEY_INPUT_RIGHT] >= 1 && p1.x < RIGHT_LIMIT){
	p1.x += p1.speed;
}

これで移動範囲を制限する事ができますね。

ここまでの中間ソースになります。

中間ソース3

次回はプレイヤーにショットを打たせてみましょう。

次回

五日目 プレイヤーのショット

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2017年06月16日発売↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/5/1 13:15時点)