sprite的响应速度慢.xScale

时间:2016-02-02 22:19:04

标签: swift sprite-kit uipangesturerecognizer

在我的SpriteKit游戏中,我希望根据用户垂直拖动来调整我的精灵(下面名为“manta”)的大小。向上拖动应该使精灵更大,而向下拖动应该收缩它。

我已经实施了UIPanGestureRecognizer,而在rec.state == .Changed中,我的代码如下:

let deltaY = startPoint.y - currentPoint.y
newScale = mantaCurrentScale + ((deltaY / dragHeight ) * mantaScaleDiff )
if (newScale <= mantaMaxScale) && (newScale >= mantaMinScale) {
    manta.xScale = newScale
    manta.yScale = newScale
    mantaCurrentScale = newScale
}

它有效,但不可靠,调整大小的响应速度缓慢,在实时游戏中无法使用。

是否有任何我不知道的SprikeKit技巧,优先考虑这个过程,或者有更好的替代UIPanGestureRecognizer来在SpriteKit中创建这样的控件?

3 个答案:

答案 0 :(得分:0)

我个人不会使用手势识别器,因为如果你能知道触摸点,这会更容易。

以下是您可能会发现有效的sudo代码示例。所有这些功能都可以在SKScene内部覆盖,并且可以轻松找到位置。

var dragging:boolean = false

TouchesBegan()
{
   if (fingerHasClickedSquare == true)
   {dragging=true}
   else
   {dragging=false}
}

TouchesEnded()
{
    dragging = false
}

TouchesMoved() 
{
   if (dragging == true)
   {
      manta.size.width = (fingerPosition.x - squarePosition.x) * 2 //this either needs to be *2 or /2 or *1 I dont remember which
   }
}

如果您需要进一步的帮助,请将其转换为真正的快速代码this主题,其中显示了获取触摸位置所需的一些代码行以及触摸它的节点。

答案 1 :(得分:0)

避免UIPanGestureRecognizer你可以这样做

#import "GameScene.h"

@implementation GameScene
{
    CGPoint startPoint;
    CGPoint endPoint;
    SKSpriteNode *node;
}
-(void)didMoveToView:(SKView *)view {


    node=[SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(200, 200)];
    node.position = CGPointMake(CGRectGetMidX(self.frame),
                                CGRectGetMidY(self.frame));

    [self addChild:node];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    startPoint=location;
    //store location of first touch
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    endPoint=location;
    CGFloat yDist = (endPoint.y - startPoint.y);
    if(yDist<-50)
    {
        yDist=-50;
    }
    if(node.xScale <0.25)
    {
        node.xScale=0.25;
        node.yScale=0.25;
    }
    node.xScale=1.0+yDist/100.0;
    node.yScale=1.0+yDist/100.0;

}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
}

@end

答案 2 :(得分:0)

不要轻视其他人的答案。我正在回答我自己的问题,因为我面临的问题是通过使用不同的技术解决的,而其他人可能面临同样的问题。

我遇到的迟缓是因为我正在使用的<=>=运算符导致调整大小受到限制。

我必须在rec.Changed中实现此代码,以确保将manta调整为最小或最大尺寸,即使平底锅大于此要求的大小。:

if manta.newSize < manta.minSize {
    manta.newSize = manta.minSize
} else if manta.newSize > manta.maxSize {
    manta.newSize = manta.maxSize
}

现在调整大小很顺利,就像用户在真实游戏中所期望的一样。