C言語 入門 STGの作り方

四日目 プレイヤーの表示と移動

初心者向けSTG作成入門

HOME/STGの作り方 目次/四日目 プレイヤーの表示と移動/

広告

↓2016年02月29日発売↓

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

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

プレイヤーの表示

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

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

struct PLAYER{
	double x, y;
	double draw_x, draw_y;
	int speed;
	int shot_type;
	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.power = 100;
	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 + 320;
	p1.draw_y = ((-1) * p1.y) + 240;
}

座標原点を中心にずらすという事は

画像(s-4-1)

座標(0,0)を指定した時に中心にくればいいのでx,y座標それぞれに中心の座標320と240を足してあげます。

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

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

画像(s-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 -320
/*右の限界*/
#define RIGHT_LIMIT 320
/*上の限界*/
#define TOP_LIMIT 240
/*下の限界*/
#define BOTTOM_LIMIT -240

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

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

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

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

中間ソース3

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

次回

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

□ページの先頭へ□

□HOME□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本

□ページの先頭へ□

□HOME□