Iphone 检测同时按下按钮和其他手势、晃动和倾斜-Cocos2d&;苹果手机
我正在用cocos2d为iPhone编写一个应用程序,其中有4个精灵是按钮。我希望允许并响应以下内容(允许用户在超时前3秒应用其输入): --单按钮按下(我有这个部分的工作)。 --同时按下1个以上的按钮(每个组合将有不同的响应)。 --来自每个按钮精灵的轻弹/轻扫手势。 --摇晃iPhone。 --上下左右倾斜iphone(从横向模式)Iphone 检测同时按下按钮和其他手势、晃动和倾斜-Cocos2d&;苹果手机,iphone,cocos2d-iphone,touch,gesture-recognition,simultaneous,Iphone,Cocos2d Iphone,Touch,Gesture Recognition,Simultaneous,我正在用cocos2d为iPhone编写一个应用程序,其中有4个精灵是按钮。我希望允许并响应以下内容(允许用户在超时前3秒应用其输入): --单按钮按下(我有这个部分的工作)。 --同时按下1个以上的按钮(每个组合将有不同的响应)。 --来自每个按钮精灵的轻弹/轻扫手势。 --摇晃iPhone。 --上下左右倾斜iphone(从横向模式) 如能深入了解不同的方法,将不胜感激。B) 以下是我如何实现这一点的,以防其他人尝试这样做(我尝试添加摇晃/手势/倾斜部分,但只是同时按下按钮,目前我仅将其限制
如能深入了解不同的方法,将不胜感激。B) 以下是我如何实现这一点的,以防其他人尝试这样做(我尝试添加摇晃/手势/倾斜部分,但只是同时按下按钮,目前我仅将其限制为2按钮组合,但我可以轻松扩展逻辑来处理3和4按钮组合) spuButton.h(一个CCSprite子类) HelloWorldScene.m(只是我的勾号:方法,以防止我的其他函数混淆示例)
-(无效)勾选:(ccTime)dt{
如果([[u otherControlsArray objectAtIndex:0]被按下]){
[[u otherControlsArray objectAtIndex:0]设置被按下:否];
[self-removeChild:[\u otherControlsArray对象索引:0]清理:是];
[self addChild:[u otherControlsArray objectAtIndex:1];
NSLog(“播放”);
_gameHasNotBeenPlayedYet=否;
Snarfle_s_PowerUPAppDelegate*delegate=[[UIApplication sharedApplication]delegate];
[delegate makeNotPaused];
[自我博弈逻辑];
}
如果(_gamehasnobeenplayet){
回来
}
如果(_buttonPressedAndReleased>0){//响应释放的按钮并重置
NSLog(@“按钮按下并释放-->%d”,u按钮按下并释放);
如果([自检按钮:_按钮按下并释放]);
_按钮压力=0;
_buttonsPressedAndReleased=0;
回来
}
如果(_buttonpressed4)break;//按下并标识了多个按钮
}
}
//现在我们知道哪些按钮被按下了,现在检查它们是否被释放
//如果按下了多个按钮,则禁用其他两个
//此外,如果按下了多个按钮,其中一个被释放,则禁用已释放的按钮,但保持点亮
开关(按下按钮){
案例1://红色
如果([[[u fourButtonsArray objectAtIndex:0]未按下])\u buttonsPressedReleased=1;
打破
案例2://蓝色
如果([[[u fourButtonsArray objectAtIndex:1]未按下])\u buttonsPressedReleased=2;
打破
案例3://绿色
如果([[[u fourButtonsArray objectAtIndex:2]未按下])\u buttonsPressedReleased=3;
打破
案例4://黄色
如果([[[u fourButtonsArray objectAtIndex:3]未按下])\u buttonsPressedReleased=4;
打破
案例5://红色和蓝色
如果([[[u-fourButtonsArray objectAtIndex:0]未按下])和([[u-fourButtonsArray objectAtIndex:1]未按下])\u-ButtonSpresseandReleased=5;
否则{
如果([[\u fourButtonsArray对象索引:0]未按下]){
[[u fourButtonsArray objectAtIndex:0]makeDisabled];
[[u fourButtonsArray objectAtIndex:0]makeLit];
}
如果([[[u fourButtonsArray objectAtIndex:1]未按下]){
[[u fourButtonsArray对象索引:1]makeDisabled];
[[u fourButtonsArray objectAtIndex:1]makeLit];
}
}
打破
案例6://红色和绿色
如果([[[u-fourButtonsArray-objectAtIndex:0]未按下])和([[u-fourButtonsArray-objectAtIndex:2]未按下])\u-ButtonSpresseandReleased=6;
否则{
如果([[\u fourButtonsArray对象索引:0]未按下]){
[[u fourButtonsArray objectAtIndex:0]makeDisabled];
[[u fourButtonsArray objectAtIndex:0]makeLit];
}
如果([[u fourButtonsArray objectAtIndex:2]未按下]){
[[u fourbuttonArray对象索引:2]makeDisabled];
[[u fourButtonsArray objectAtIndex:2]makeLit];
}
}
打破
案例7://红色和黄色
如果([[u fourButtonsArray objectAtIndex:0]未按下])和([[u fourButtonsArray objectAtIndex:3]未按下])\u buttonpresseandreleased=7;
否则{
如果([[\u fourButtonsArray对象索引:0]未按下]){
[[u fourButtonsArray objectAtIndex:0]makeDisabled];
[[u fourButtonsArray objectAtIndex:0]makeLit];
}
如果([[[u fourButtonsArray objectAtIndex:3]未按下]){
[[u fourbuttonArray对象索引:3]makeDisabled];
[[u fourButtonsArray objectAtIndex:3]makeLit];
}
}
打破
案例8://蓝色和绿色
如果([[u-fourButtonsArray-objectAtIndex:1]未按下])和([[u-fourButtonsArray-objectAtIndex:2]未按下])\u-buttonpresseandreleased=8;
否则{
如果([[[u fourButtonsArray objectAtIndex:1]未按下]){
[[u fourButtonsArray对象索引:1]makeDisabled];
[[u fourButtonsArray objectAtIndex:1]makeLit];
}
如果([[u fourButtonsArray objectAtIndex:2]未按下]){
[[u fourbuttonArray对象索引:2]makeDisabled];
[[u fourButtonsArray objectAtIndex:2]makeLit];
}
}
打破
案例9://蓝色和黄色
如果([[u fourButtonsArray objectAtIndex:1]未按下]&([[u fourButtonsArray objectAtInde]
#import <Foundation/Foundation.h>
#import "cocos2d.h"
typedef enum tagButtonState {
kButtonStatePressed,
kButtonStateNotPressed
} ButtonState;
typedef enum tagButtonStatus {
kButtonStatusEnabled,
kButtonStatusDisabled
} ButtonStatus;
@interface spuButton : CCSprite <CCTargetedTouchDelegate> {
@private
ButtonState buttonState;
CCTexture2D *buttonNormal;
CCTexture2D *buttonLit;
ButtonStatus buttonStatus;
}
@property(nonatomic, readonly) CGRect rect;
+ (id)spuButtonWithTexture:(CCTexture2D *)normalTexture;
- (void)setNormalTexture:(CCTexture2D *)normalTexture;
- (void)setLitTexture:(CCTexture2D *)litTexture;
- (BOOL)isPressed;
- (BOOL)isNotPressed;
- (void)makeDisabled;
- (void)makeEnabled;
- (BOOL)isEnabled;
- (BOOL)isDisabled;
- (void)makeLit;
- (void)makeNormal;
- (void)dealloc;
@end
#import "spuButton.h"
#import "cocos2d.h"
@implementation spuButton
- (CGRect)rect {
CGSize s = [self.texture contentSize];
return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}
+ (id)spuButtonWithTexture:(CCTexture2D *)normalTexture {
return [[[self alloc] initWithTexture:normalTexture] autorelease];
}
- (void)setNormalTexture:(CCTexture2D *)normalTexture {
buttonNormal = normalTexture;
}
- (void)setLitTexture:(CCTexture2D *)litTexture {
buttonLit = litTexture;
}
- (BOOL)isPressed {
if (buttonState== kButtonStateNotPressed) return NO;
if (buttonState== kButtonStatePressed) return YES;
return NO;
}
- (BOOL)isNotPressed {
if (buttonState== kButtonStateNotPressed) return YES;
if (buttonState== kButtonStatePressed) return NO;
return YES;
}
- (void)makeDisabled {
buttonStatus = kButtonStatusDisabled;
buttonState= kButtonStateNotPressed;
[self makeNormal];
}
- (void)makeEnabled {
buttonStatus = kButtonStatusEnabled;
buttonState= kButtonStateNotPressed;
[self makeNormal];
}
- (BOOL)isEnabled {
if (buttonStatus== kButtonStatusDisabled) return NO;
if (buttonStatus== kButtonStatusEnabled) return YES;
return NO;
}
- (BOOL)isDisabled {
if (buttonStatus== kButtonStatusEnabled) return NO;
if (buttonStatus== kButtonStatusDisabled) return YES;
return YES;
}
- (void)makeLit {
[self setTexture:buttonLit];
}
- (void)makeNormal {
[self setTexture:buttonNormal];
}
- (id)initWithTexture:(CCTexture2D *)aTexture {
if ((self = [super initWithTexture:aTexture]) ) {
buttonState = kButtonStateNotPressed;
buttonStatus = kButtonStatusEnabled;
}
return self;
}
- (void)onEnter {
if (buttonStatus == kButtonStatusDisabled) return;
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];
[super onEnter];
}
- (void)onExit {
if (buttonStatus == kButtonStatusDisabled) return;
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
[super onExit];
}
- (BOOL)containsTouchLocation:(UITouch *)touch {
return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
}
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
if (buttonStatus == kButtonStatusDisabled) return NO;
if (buttonState== kButtonStatePressed) return NO;
if ( ![self containsTouchLocation:touch] ) return NO;
buttonState= kButtonStatePressed;
[self makeLit];
return YES;
}
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
// If it weren't for the TouchDispatcher, you would need to keep a reference
// to the touch from touchBegan and check that the current touch is the same
// as that one.
// Actually, it would be even more complicated since in the Cocos dispatcher
// you get NSSets instead of 1 UITouch, so you'd need to loop through the set
// in each touchXXX method.
if (buttonStatus == kButtonStatusDisabled) return;
if ([self containsTouchLocation:touch]) return;
buttonState= kButtonStateNotPressed;
[self makeNormal];
}
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
if (buttonStatus == kButtonStatusDisabled) return;
buttonState= kButtonStateNotPressed;
[self makeNormal];
}
- (void)dealloc {
[buttonNormal release];
[buttonLit release];
[super dealloc];
}
@end
-(void)tick:(ccTime)dt {
if ([[_otherControlsArray objectAtIndex:0] wasPressed]) {
[[_otherControlsArray objectAtIndex:0] setWasPressed:NO];
[self removeChild:[_otherControlsArray objectAtIndex:0] cleanup:YES];
[self addChild:[_otherControlsArray objectAtIndex:1]];
NSLog(@"Play");
_gameHasNotBeenPlayedYet = NO;
Snarfle_s_PowerUPAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate makeNotPaused];
[self gameLogic];
}
if (_gameHasNotBeenPlayedYet) {
return;
}
if (_buttonsPressedAndReleased > 0) { //respond to button(s) released and reset
NSLog(@"Buttons Pressed and Released-->%d",_buttonsPressedAndReleased);
if ([self checkButtons:_buttonsPressedAndReleased]);
_buttonsPressed = 0;
_buttonsPressedAndReleased = 0;
return;
}
if (_buttonsPressed <= 4) { // two buttons have not already been pressed
for (spuButton *aButton in _fourButtonsArray) {
if ([aButton isNotPressed]) continue; //this button is not pressed
if (_buttonsPressed == 0) { //this button is pressed and no other buttons have been pressed
_buttonsPressed = aButton.tag;
continue;
}
//this button is pressed while another has been pressed
//figure out which two buttons have been pressed
if (_buttonsPressed == 1) { //red plus another
switch (aButton.tag) {
case 2: //blue
_buttonsPressed = 5;
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
break;
case 3: //green
_buttonsPressed = 6;
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
break;
case 4: //yellow
_buttonsPressed = 7;
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
break;
default:
_buttonsPressed = 1;
break;
}
}
if (_buttonsPressed == 2) { //blue plus another
switch (aButton.tag) {
case 1: //red
_buttonsPressed = 5;
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
break;
case 3: //green
_buttonsPressed = 8;
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
break;
case 4: //yellow
_buttonsPressed = 9;
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
break;
default:
_buttonsPressed = 2;
break;
}
}
if (_buttonsPressed == 3) { //green plus another
switch (aButton.tag) {
case 1: //red
_buttonsPressed = 6;
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
break;
case 2: //blue
_buttonsPressed = 8;
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
break;
case 4: //yellow
_buttonsPressed = 10;
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
break;
default:
_buttonsPressed = 3;
break;
}
}
if (_buttonsPressed == 4) { //yellow plus another
switch (aButton.tag) {
case 1: //red
_buttonsPressed = 7;
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
break;
case 2: //blue
_buttonsPressed = 9;
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
break;
case 3: //green
_buttonsPressed = 10;
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
break;
default:
_buttonsPressed = 4;
break;
}
}
if (_buttonsPressed > 4) break; //more than one has been pressed and identified
}
}
//now we know what buttons have been pressed now check to see if they have been released
//if more than one has been pressed disable the other two
//also if more than one has been pressed and one of them gets released disable the released one but keep it lit
switch (_buttonsPressed) {
case 1: //red
if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) _buttonsPressedAndReleased = 1;
break;
case 2: //blue
if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) _buttonsPressedAndReleased = 2;
break;
case 3: //green
if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) _buttonsPressedAndReleased = 3;
break;
case 4: //yellow
if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) _buttonsPressedAndReleased = 4;
break;
case 5: //red & blue
if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:1] isNotPressed])) _buttonsPressedAndReleased = 5;
else {
if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:0] makeLit];
}
if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
[[_fourButtonsArray objectAtIndex:1] makeLit];
}
}
break;
case 6: //red & green
if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:2] isNotPressed])) _buttonsPressedAndReleased = 6;
else {
if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:0] makeLit];
}
if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
[[_fourButtonsArray objectAtIndex:2] makeLit];
}
}
break;
case 7: //red & yellow
if (([[_fourButtonsArray objectAtIndex:0] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:3] isNotPressed])) _buttonsPressedAndReleased = 7;
else {
if ([[_fourButtonsArray objectAtIndex:0] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:0] makeDisabled];
[[_fourButtonsArray objectAtIndex:0] makeLit];
}
if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeLit];
}
}
break;
case 8: //blue & green
if (([[_fourButtonsArray objectAtIndex:1] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:2] isNotPressed])) _buttonsPressedAndReleased = 8;
else {
if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
[[_fourButtonsArray objectAtIndex:1] makeLit];
}
if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
[[_fourButtonsArray objectAtIndex:2] makeLit];
}
}
break;
case 9: //blue & yellow
if (([[_fourButtonsArray objectAtIndex:1] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:3] isNotPressed])) _buttonsPressedAndReleased = 9;
else {
if ([[_fourButtonsArray objectAtIndex:1] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:1] makeDisabled];
[[_fourButtonsArray objectAtIndex:1] makeLit];
}
if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeLit];
}
}
break;
case 10: //green & yellow
if (([[_fourButtonsArray objectAtIndex:2] isNotPressed]) && ([[_fourButtonsArray objectAtIndex:3] isNotPressed])) _buttonsPressedAndReleased = 10;
else {
if ([[_fourButtonsArray objectAtIndex:2] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:2] makeDisabled];
[[_fourButtonsArray objectAtIndex:2] makeLit];
}
if ([[_fourButtonsArray objectAtIndex:3] isNotPressed]) {
[[_fourButtonsArray objectAtIndex:3] makeDisabled];
[[_fourButtonsArray objectAtIndex:3] makeLit];
}
}
break;
default:
_buttonsPressedAndReleased = 0;
break;
}
}