広告
↓発売日:2018年09月22日↓
新品価格 |
今回はプレイヤーを表示・移動させてみましょう。
プレイヤーの構造体になります。
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; }
原点を中央にずらすという事は
この場合は(x220,y240)が中央の座標でy座標は上がプラス方向になるのでx,y座標それぞれに中心の座標220と240を足してあげます。
そしてy座標のプラスとマイナスの方向が逆になるように「-1」をかけてあげます。
結果座標原点を中央にする事ができます。
こんな感じです。
あとはその計算した「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)
そのキーコードの場所を調べるとそのキーがどのように押されているかがある程度わかるので(すごい勢いでインクリメントされていればずっと押され続けているなど)それに応じた処理を加えればいいワケです。
よく使いそうなキーコードを上げときます。
「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」
「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; }
これで移動範囲を制限する事ができますね。
ここまでの中間ソースになります。
次回はプレイヤーにショットを打たせてみましょう。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |