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
}
现在调整大小很流畅,正如用户在实际游戏中所期望的那样。
在我的 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
}
现在调整大小很流畅,正如用户在实际游戏中所期望的那样。