在我的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中创建这样的控件?
答案 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
}
现在调整大小很顺利,就像用户在真实游戏中所期望的一样。