我有四个简单的方法,四个按钮和一个对象。
- (IBAction)left:(id)sender{
object.center = CGPointMake(object.center.x - 5, object.center.y);
}
- (IBAction)right:(id)sender{
object.center = CGPointMake(object.center.x + 5, object.center.y);
}
- (IBAction)down:(id)sender{
object.center = CGPointMake(object.center.x, object.center.y + 5);
}
- (IBAction)up:(id)sender{
object.center = CGPointMake(object.center.x, object.center.y - 5);
}
当我按下按钮时,该方法执行一次。连续按下按钮时,它是相同的。 我必须做什么,当我连续按下按钮时,我的物体继续向左移动?
答案 0 :(得分:1)
正如@Maudicus所说,你可能需要对NSTimer
做一些事情才能获得连续的按键触发功能。我要使用的例子是在屏幕上移动一个对象(因为你想要这样做)。我已经使用了渐变移动,因为我不知道你是否正在编写一个基于网格的游戏,因此需要5个像素的移动。只需删除所有stepSize代码并将其设置为5,如果这就是你所做的。
写一个定时器回调函数,检查是否设置了BOOL
,如果是,则保持触发:
- (void)moveObjectLeft:(NSTimer *)timer
{
// check the total move offset and/or the X location of the object here
// if the object can't be moved further left then invalidate the timer
// you don't need to check whether the button is still being pressed
//[timer invalidate];
//return;
// the object moves gradually faster as you hold the button down for longer
NSNumber *moveOffset = (NSNumber *)[timer userInfo];
NSUInteger stepSize = 1;
if(moveOffset >= 40)
stepSize = 10;
else if(moveOffset >= 15)
stepSize = 5;
else if(moveOffset >= 5)
stepSize = 2;
// move the object
object.center = CGPointMake(object.center.x - stepSize, object.center.y);
// store the new total move offset for this press
moveOffset += stepSize;
[timer setUserInfo:moveOffset];
}
在当前班级.h
中创建一个计时器属性:
@property (nonatomic, retain) NSTimer *moveTimer;
在.m
:
@synthesize moveTimer;
按下按钮时创建计时器对象。在touchesBegan:withEvent:
中执行此操作并检查它是Touch Down事件,或将Interface Builder中的Touch Down事件连接到IBAction
方法。
NSNumber *moveOffset = [NSNumber numberWithUnsignedInt:0];
self.moveTimer =
[NSTimer
scheduledTimerWithTimeInterval:0.2
target:self
selector:@selector(moveObject:)
userInfo:moveOffset
repeats:YES];
当按钮被释放时(再次使用上述方法之一,touchesEnded:withEvent:
用于Touch Up Inside或甚至可能是Touch Up Outside,或其他IBAction
),外部使计时器无效:
[self.moveTimer invalidate];
self.moveTimer = nil;
答案 1 :(得分:0)
当按钮发出其mousedown事件时,开始移动。当按钮发出鼠标事件时,停止移动。
小心;如果可以同时按下多个按钮,这可能会很有趣。
答案 2 :(得分:0)
我认为您需要安排计时器并重复检查按钮状态的方法。
//假设计时器设置为测试按钮状态,每隔x秒触发controlLoop
-(void)controlsLoop
{
if (leftButton.state == UIControlStateSelected || leftButton.state == UIControlStateHighlighted) {
}
}
我之前从未这样做过,所以玩得开心玩得开心。 我通常在Cocos2d中实现你想要的控制,
实施这些方法可能更好
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
设置您想要移动对象的方向,并且还有一个触发实际移动的计时器。