坦克类定义及相关函数
#include <SFML/Graphics.hpp> #define TANK_WEIGHT 50 #define TANK_HEIGHT 50 #define TANK_VELOCITY sf::Vector2f(0.0,-1.0) #define TO_RADIAN * 3.1415926f / 180 class Tank : public sf::RectangleShape { public: Tank() :RectangleShape(sf::Vector2f(TANK_WEIGHT, TANK_HEIGHT)) { this->setPosition(400, 570); this->setOrigin(TANK_WEIGHT / 2, TANK_HEIGHT / 2); this->velocity = TANK_VELOCITY; } public: void forward(); void stop_forward(); void back(); void stop_back(); void clockwise(); void stop_clockwise(); void anti_clockwise(); void stop_anti_clockwise(); void speedup(); void stop_speedup(); public: //sf::Vector2f intersects(Obstacle &); //Bullet fire();float getRadius(); void update(sf::Time elapsed, float width, float height); private: float tank_speed = 200.f; bool forwarding = false; bool backing = false; bool clockwising = false; bool anti_clockwising = false; sf::Vector2f velocity; };
团队使用sfml框架,Tank类继承自sf::Vector2f,新添属性tank_speed,forwarding,backing,clockwising,anti_clockwising,velocity。键盘响应世间来实现改变坦克属性的值。
void move_tank(sf::Event &event, Tank &tank) { if (event.type == sf::Event::KeyPressed) { switch (event.key.code) { case sf::Keyboard::Up: tank.forward(); break; case sf::Keyboard::Down: tank.back(); break; case sf::Keyboard::Left: tank.clockwise(); break; case sf::Keyboard::Right: tank.anti_clockwise(); break; case sf::Keyboard::Space: tank.speedup(); break; default: break; } } if (event.type == sf::Event::KeyReleased) { switch (event.key.code) { case sf::Keyboard::Up: tank.stop_forward(); break; case sf::Keyboard::Down: tank.stop_back(); case sf::Keyboard::Left: tank.stop_clockwise(); break; case sf::Keyboard::Right: tank.stop_anti_clockwise(); break; case sf::Keyboard::Space: tank.stop_speedup(); break; default: break; } } }
使用void update(sf::Time elapsed, float width, float height)函数来计算下一次刷新的坐标位置(X,Y)和坦克的朝向姿态即坦克的速度矢量方向。
犯得一些低级但耗费了时间的错误:window.display()函数位置不对导致窗口无显示;switch语句中的一个case少写了case语句,导致按下DOWN键相当于同时按下DOWN和LEFT键;图片后缀名写错,VS报无法打开PDB什么很高级的错误,查了一圈也没解决,出去转悠了一圈回来一眼看到就解决了,所以打开文件的操作一定要写错误检测,当然能考虑到出错的地方都应该想办法增加健壮性。
存在问题:坦克与边界碰撞偷懒近似成圆用半径算的,这会导致坦克沿x轴或沿y轴走到边界时扔距离边界有距离时就认为到达边界(因为半径比长或宽的一半都大)。