坦克类定义及相关函数

#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轴走到边界时扔距离边界有距离时就认为到达边界(因为半径比长或宽的一半都大)。

 
时间: 2024-10-11 08:22:43

坦克类定义及相关函数的相关文章

javascript类定义小结

网上可以找到各种各样的javascript定义类的方法: 1.ECMAScript 定义类或对象 2.Javascript定义类(class)的三种方法 我想整理出一个“简洁”的类定义模板,实现代码的模块化. 一.命名空间 //根命名空间 var Root; if(!Root) Root={}; ... //二级命名空间 if(!Root.SecondNS) Root.SecondNS={}; 诸如此类. 二.类定义 通过定义类,实现代码的模块化    <script> //#region 类

Obj-C 语言学习 笔记(II)类定义与实现

Obj-C的类定义,与C++一样,头文件和实现文件分开. 注:本文中的例子采用Mitch Fisher, Gary Bennett, Brad Lees所编<Objective-C 初学者指南>一书中的例子.本人编译的环境为Xcode 7. 不知是否因为苹果公司在推swift,个人在.h文件里写东西的时候coding辅助跟不上.在Swift中,类的声明和实现被归在同一个.swift文件中. 头文件中类的声明 - 成员变量部分 // // RadioStation.h // RadioStati

c++类定义和类实现

预备知识: c++中我们cpp文件和.h文件的区别是,cpp文件是需要编译的文件,成为一个独立的编译单元,而h文件从来是不需要编译,只是用于预处理. 通常我们在cpp文件中,完成函数的实现,然后在h中则是对于函数的声明,由于默认情况下,全局变量和全局函数存储类型都是extern类型的,所以我们不需要显示的使用extern 这样,我们其他的cpp文件,只要#include .h文件,则在cpp中实现的函数,就能在其他cpp中使用,因为我们已经用.h文件,完成了extern函数声明的操作. c++类

JS类定义方式

// 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : function(v) { this.v1 = v; } }; obj1.set_v1('hello1'); alert(obj1.get_v1()); // 方法2 定义函数对象 var Obj = function() { var v1 = ""; this.get_v1 = function(

php 类中定义全局变量|php类定义变量|php类定义常量

PHP 预定义超全局数组/变量 => http://www.q3060.com/list3/list117/23295.html PHP预定义变量 - PHP 超级全局变量 => http://www.q3060.com/list3/list117/23278.html php怎么定义全局变量 => http://www.q3060.com/list3/list117/22852.html php 的全局变量与局部变量 => http://www.q3060.com/list3/l

Js 类定义的几种方式

提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for Web Developers)这本书中描述的还算比较详细.我们看看JavaScript中定义类的各种方法. 1.工厂方式 javaScript中创建自己的类和对象,我们应该是必须掌握的,我们都知道javaScript中对象的属性可以在对象创建后动态定义,比如下面的代码: <script type=&q

C++ 类定义

C++ 类定义 定义一个类,本质上是定义一个数据类型的蓝图.这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作. 类定义是以关键字 class 开头,后跟类的名称.类的主体是包含在一对花括号中.类定义后必须跟着一个分号或一个声明列表.例如,我们使用关键字 class 定义 Box 数据类型,如下所示: class Box { public: double length;   // Length of a box dou

C++:成员函数实现在类定义中与在类定义外的区别

//a.cpp class A{ public: int fun(int x){ return (x*x+1000); } }; void tt() { } //b.cpp class A{ public: int fun(int x); }; void tt(); int yy() { tt(); A a; return a.fun(3); } 将它们分别编译后再链接:显示链接错误,因为b.cpp(b.o)中找不到A::fun(int)的引用. 将以上的a.cpp改为如下所示:class A{

定义一个长方形类,定义 求周长和面积的方法实例

/* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: import必须出现在所有的class前面.*/ import java.util.Scanner; class ChangFangXing { //长方形的长 private int length; //长方形的宽 private int width; public ChangFangXing(){} //