C++ ⇒ VBA 書いて覚えるための初心者自己中記事

C++ ⇒ VBA 勉強の履歴を付けるというかノート代わりに使ってます

C++ ゲーム作りの為の勉強2 書いて覚えるための初心者自己中記事

表示された何かをキーボードで動かしたい。

全然わからないけど、GetKeyState関数を使ったらキーボードに反応した。

 

if (GetKeyState('D') < 0) 

 

~~~~~~~~

翌日

~~~~~~~~

 

とりあえず、ビーム出して標的を破壊してみたかったから作ってみた。

f:id:maid-pink:20171004094134p:plain

 

ビームと標的(ブロック)は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は使えた。

次は別の何かを使って、使い方を覚えよう。

 

ここまで。