sprite.xScale 的响应速度慢

Slow responsiveness of sprite.xScale

在我的 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 中创建这样的控件?

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

这是您可能会发现有用的 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
   }
}

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

避免 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

不要低估这里其他同胞的回答。我正在为我自己的问题写一个答案,因为我所面临的问题已通过使用不同的技术得到解决,而其他人可能也面临同样的问题。

我遇到的迟缓是由于我使用的 <=>= 运算符限制了调整大小。

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

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

现在调整大小很流畅,正如用户在实际游戏中所期望的那样。