操作手势的实现

手势有两部分组成,一个是操作类,另一个是手势的容器类

手势操作

class Operator {
public:
	Operator();
	float _residueTime;//每个操作之间的间隔
	unsigned int _setp;//改手势包括多少个动作
	bool _isEnd;//手势是否操作成功

	void reset();//重置
};
Operator::Operator() {
	this->_residueTime = 0;
	this->_setp = 1;
	this->_isEnd = false;
}
void Operator::reset() {
	this->_residueTime = 0;
	this->_setp = 1;
	this->_isEnd = false;
}

如果要实现一个“上下左上右下左”的操作时可由以下方式实现

首先实现基本的上下左右操作的判断

之前说过,手柄操作的最大值是-1和1

那么按以下方式上下左右的定义


bool Gesture::up() {//上
	if(this->_curPoint.x > -0.2 && this->_curPoint.x < 0.2 && this->_curPoint.y > 0.8) {
		return true;
	}
	return false;
}
bool Gesture::down() {//下
	if(this->_curPoint.x > -0.2 && this->_curPoint.x < 0.2 && this->_curPoint.y < -0.8) {
		return true;
	}
	return false;
}
bool Gesture::left() {//左
	if(this->_curPoint.y < 0.2 && this->_curPoint.y > -0.2 && this->_curPoint.x < -0.8) {
		return true;
	}
	return false;
}
bool Gesture::right() {//右
	if(this->_curPoint.y < 0.2 && this->_curPoint.y > -0.2 && this->_curPoint.x > 0.8) {
		return true;
	}
	return false;
}

定义完了基本操作后就可以组合以上的操作了

bool Gesture::overturnUp(float delta) {
	// up down left up right down
	if(this->_overtumOperatorUp->_setp == 1) {//up
		if(this->up()) {
			this->_overtumOperatorUp->_setp = 2;
			this->_overtumOperatorUp->_residueTime = this->_interval;
		}
	}else if(this->_overtumOperatorUp->_setp == 2) {//down
		this->_overtumOperatorUp->_residueTime = this->_overtumOperatorUp->_residueTime - delta;
		if(this->_overtumOperatorUp->_residueTime <= 0) {
			this->_overtumOperatorUp->reset();
			return this->_overtumOperatorUp->_isEnd;
		}
		if(this->down()) {
			this->_overtumOperatorUp->_setp = 3;
			this->_overtumOperatorUp->_residueTime = this->_interval;
		}
	}else if(this->_overtumOperatorUp->_setp == 3) {//left
		this->_overtumOperatorUp->_residueTime = this->_overtumOperatorUp->_residueTime - delta;
		if(this->_overtumOperatorUp->_residueTime <= 0) {
			this->_overtumOperatorUp->reset();
			return this->_overtumOperatorUp->_isEnd;
		}
		if(this->left()) {
			this->_overtumOperatorUp->_setp = 4;
			this->_overtumOperatorUp->_residueTime = this->_interval;
		}
	}else if(this->_overtumOperatorUp->_setp == 4) {//up
		this->_overtumOperatorUp->_residueTime = this->_overtumOperatorUp->_residueTime - delta;
		if(this->_overtumOperatorUp->_residueTime <= 0) {
			this->_overtumOperatorUp->reset();
			return this->_overtumOperatorUp->_isEnd;
		}
		if(this->up()) {
			this->_overtumOperatorUp->_setp = 5;
			this->_overtumOperatorUp->_residueTime = this->_interval;
		}
	}else if(this->_overtumOperatorUp->_setp == 5) {//right
		this->_overtumOperatorUp->_residueTime = this->_overtumOperatorUp->_residueTime - delta;
		if(this->_overtumOperatorUp->_residueTime <= 0) {
			this->_overtumOperatorUp->reset();
			return this->_overtumOperatorUp->_isEnd;
		}
		if(this->right()) {
			this->_overtumOperatorUp->_setp = 6;
			this->_overtumOperatorUp->_residueTime = this->_interval;
		}
	}else if(this->_overtumOperatorUp->_setp == 6) {//down
		this->_overtumOperatorUp->_residueTime = this->_overtumOperatorUp->_residueTime - delta;
		if(this->_overtumOperatorUp->_residueTime <= 0) {
			this->_overtumOperatorUp->reset();
			return this->_overtumOperatorUp->_isEnd;
		}
		if(this->down()) {
			this->_overtumOperatorUp->_setp = 7;
			this->_overtumOperatorUp->_residueTime = this->_interval;
			this->_overtumOperatorUp->_isEnd = true;
		}
	}else {
		this->_overtumOperatorUp->reset();
	}
	return this->_overtumOperatorUp->_isEnd;
}

这样就可以实现上下左上右下左的判断了。

其中this->_internal是操作的时间间隔,如0.5秒,然后赋给_residueTime。

_residueTime逐步减少,当小于0时,则认定下一个操作失败,重置整个操作,否则判断下一个操作,_residueTime再次变为0.5,重复以上过程

直至步长等于该手势的步长,将_isEnd置为true,操作完成。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值