C++ ゲーム作りの為の勉強2 書いて覚えるための初心者自己中記事
表示された何かをキーボードで動かしたい。
全然わからないけど、GetKeyState関数を使ったらキーボードに反応した。
if (GetKeyState('D') < 0)
~~~~~~~~
翌日
~~~~~~~~
とりあえず、ビーム出して標的を破壊してみたかったから作ってみた。
ビームと標的(ブロック)はdeque を利用。
ビームはクラスを作ってそれをdeque に入れて処理、ビームが消えるタイミングでdeque の要素も削除。
標的はテンプレートクラスpair を使って標的の有る座標をpair<int,int>に登録、それをdeque に座標の数だけ入れた。
ビームが標的のいる座標に当たったら、ビーム、・標的両方消す。dequeの要素も消す。
画面左上にビームと標的のdeque要素数が出ていて、要素が作られたり消されたりがわかる。
deque の要素を操作するためにイテレータを使ったんだけど、for文の中で条件に合うdequeの要素を削除していこうとすると、イテレータがダメになる。
for文で回すたびにイテレータでbegin()とend() 取得し直すようにした。
//天井まで行っていたら、または壁を壊したら要素削除 if (!ray->empty()) { Iterator e = ray->end(); for (Iterator f = ray->begin(); f < e ; ++f) { if (f->wallatack) { //壁破壊爆発消火 setCursorPos(f->x, f->y); std::cout << ' '; } if (f->y == 0 || f->wallatack ) { ray->erase(f); if (!ray->empty()) {//要素が残ってたらイテレータ取得しなおし f = ray->begin(); e = ray->end(); } else {//要素が無い場合breakしないと++fでエラーになるっぽい break; } } } }
ビームのクラス
class Ray { public: Ray(const int& x, const int& y); public: static void rayShot(const int& x, const int& y, std::deque<Ray>* ray, std::deque<std::pair<int, int>>* wall); private: int x;//ビームX座標 int y;//ビームY座標 char r = '!';//ビーム本体 bool wallatack = false;//標的に当たったビームのフラグ };
dequeは使えた。
次は別の何かを使って、使い方を覚えよう。
ここまで。