Ios 在Swift中放大和缩小SKSpriteNode
首先,我已经看到并尝试实现类似问题的其他答案,并且。问题是我去年开始用Swift为iOS编程,但(遗憾的是)我没有首先学习ObjC(是的,它现在在我的待办事项清单上)。;-) 所以请看一看,看看你是否能帮我找到解决办法 我可以很容易地收缩以缩放整个场景。我还可以通过使用其他UI手势(即滑动)和SKActions来上/下缩放SKSpiteNode 基于此,我将SKAction应用于UIPinchGestureRecognitor,它可以完美地放大,但我无法让它缩小 我错过了什么 以下是我的示例项目代码:Ios 在Swift中放大和缩小SKSpriteNode,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,首先,我已经看到并尝试实现类似问题的其他答案,并且。问题是我去年开始用Swift为iOS编程,但(遗憾的是)我没有首先学习ObjC(是的,它现在在我的待办事项清单上)。;-) 所以请看一看,看看你是否能帮我找到解决办法 我可以很容易地收缩以缩放整个场景。我还可以通过使用其他UI手势(即滑动)和SKActions来上/下缩放SKSpiteNode 基于此,我将SKAction应用于UIPinchGestureRecognitor,它可以完美地放大,但我无法让它缩小 我错过了什么 以下是我的示例项目
class GameScene: SKScene {
var board = SKSpriteNode(color: SKColor.yellowColor(), size: CGSizeMake(200, 200))
func pinched(sender:UIPinchGestureRecognizer){
println("pinched \(sender)")
// the line below scales the entire scene
//sender.view!.transform = CGAffineTransformScale(sender.view!.transform, sender.scale, sender.scale)
sender.scale = 1.01
// line below scales just the SKSpriteNode
// But it has no effect unless I increase the scaling to >1
var zoomBoard = SKAction.scaleBy(sender.scale, duration: 0)
board.runAction(zoomBoard)
}
// line below scales just the SKSpriteNode
func swipedUp(sender:UISwipeGestureRecognizer){
println("swiped up")
var zoomBoard = SKAction.scaleBy(1.1, duration: 0)
board.runAction(zoomBoard)
}
// I thought perhaps the line below would scale down the SKSpriteNode
// But it has no effect at all
func swipedDown(sender:UISwipeGestureRecognizer){
println("swiped down")
var zoomBoard = SKAction.scaleBy(0.9, duration: 0)
board.runAction(zoomBoard)
}
override func didMoveToView(view: SKView) {
self.addChild(board)
let pinch:UIPinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: Selector("pinched:"))
view.addGestureRecognizer(pinch)
let swipeUp:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedUp:"))
swipeUp.direction = .Up
view.addGestureRecognizer(swipeUp)
let swipeDown:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: Selector("swipedDown:"))
swipeDown.direction = .Down
view.addGestureRecognizer(swipeDown)
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
// should I be using this function instead?
}
class游戏场景:SKScene{
var板=SKSpriteNode(颜色:SKColor.yellowColor(),尺寸:CGSizeMake(200200))
func pinched(发送方:UIPinchGestureRecognitor){
println(“挤压\(发送方)”)
//下面的线缩放整个场景
//sender.view!.transform=CGAffineTransformScale(sender.view!.transform,sender.scale,sender.scale)
sender.scale=1.01
//下面的线仅缩放SKSpriteNode
//但它没有效果,除非我将缩放比例增加到>1
var zoomBoard=SKAction.scaleBy(sender.scale,持续时间:0)
董事会运行(zoomBoard)
}
//下面的线仅缩放SKSpriteNode
func swipedUp(发送方:UISwipegestureRecognitor){
println(“刷起”)
var zoomBoard=SKAction.scaleBy(1.1,持续时间:0)
董事会运行(zoomBoard)
}
//我想下面的这条线可能会缩小SKSpriteNode的范围
//但它毫无效果
func swipedDown(发送方:UISwipegestureRecognitor){
println(“向下滑动”)
var zoomBoard=SKAction.scaleBy(0.9,持续时间:0)
董事会运行(zoomBoard)
}
覆盖func didMoveToView(视图:SKView){
self.addChild(板)
让pinch:uipinchgestrerecognizer=uipinchgestrerecognizer(目标:self,动作:选择器(“pinch:”)
view.AddGestureRecognitor(夹点)
让swipeUp:UISwipedGestureRecognizer=UISwipedGestureRecognizer(目标:self,操作:选择器(“swipedUp:”)
swipeUp.direction=.Up
view.AddGestureRecognitor(swipeUp)
让swipedDown:UISwipedGestureRecognizer=UISwipedGestureRecognizer(目标:self,操作:选择器(“swipedDown:”)
swipeDown.direction=.Down
view.AddGestureRecognitor(swipeDown)
}
覆盖func touchesBegined(触摸:设置,withEvent事件:UIEvent){
//我应该改用这个函数吗?
}
多亏@sangony的帮助,我终于完成了这项工作。我想我应该发布工作代码,以防其他人想在Swift中看到它
var board = SKSpriteNode(color: SKColor.yellowColor(), size: CGSizeMake(200, 200))
var previousScale = CGFloat(1.0)
func pinched(sender:UIPinchGestureRecognizer){
if sender.scale > previousScale {
previousScale = sender.scale
if(board.size.height < 800) {
var zoomIn = SKAction.scaleBy(1.05, duration:0)
board.runAction(zoomIn)
}
}
if sender.scale < previousScale {
previousScale = sender.scale
if(board.size.height > 200) {
var zoomOut = SKAction.scaleBy(0.95, duration:0)
board.runAction(zoomOut)
}
}
var board=SKSpriteNode(颜色:SKColor.yellowColor(),大小:CGSizeMake(200200))
var previousScale=CGFloat(1.0)
func pinched(发送方:UIPinchGestureRecognitor){
如果sender.scale>previousScale{
previousScale=sender.scale
如果(板尺寸高度<800){
var zoomIn=SKAction.scaleBy(1.05,持续时间:0)
板。运行操作(缩放)
}
}
如果sender.scale<先前的scale{
previousScale=sender.scale
如果(板尺寸高度>200){
var zoomOut=SKAction.scaleBy(0.95,持续时间:0)
董事会运行(zoomOut)
}
}
我尝试了你的代码(在Objective C中),并使用pinch将其放大和缩小。我认为你的代码没有任何问题,但你可能没有考虑比例因子,因为它们被放置在不断变化的精灵大小上
您可以轻松地放大或缩小到需要多个收缩手势才能将节点恢复到可管理的大小。我建议您使用单步放大过程,而不是直接将缩放属性用于缩放因子。您还应该对缩放大小设置最大/最小限制
要使用step过程,您需要创建一个CGFloat ivarpreviousScale
来存储上一个刻度值,以确定当前收缩是放大还是缩小。然后将新传递的sender.scale
与ivar进行比较,并根据比较结果进行放大或缩小
达到最小和最大缩放限制后,应用最小和最大缩放限制以停止缩放
下面的代码在Obj-C中,但我相信您可以了解其要点:
首先声明ivar浮点值float previousScale;
- (void)handlePinch:(UIPinchGestureRecognizer *)sender {
NSLog(@"pinchScale:%f",sender.scale);
if(sender.scale > previousScale) {
previousScale = sender.scale;
// only scale up if the node height is less than 200
if(node0.size.height < 200) {
// step up the scale factor by 0.05
[node0 runAction:[SKAction scaleBy:1.05 duration:0]];
}
}
if(sender.scale < previousScale) {
previousScale = sender.scale;
// only scale down if the node height is greater than 20
if(node0.size.height > 20) {
// step down the scale factor by 0.05
[node0 runAction:[SKAction scaleBy:0.95 duration:0]];
}
}
}
-(void)handlePinch:(UIPinchGestureRecognitor*)发送方{
NSLog(@“pinchScale:%f”,发送方.scale);
如果(sender.scale>previousScale){
previousScale=sender.scale;
//仅当节点高度小于200时才放大
如果(节点0.size.height<200){
//将比例因子增加0.05
[node0运行操作:[SKAction scaleBy:1.05持续时间:0]];
}
}
if(发送器刻度<先前刻度){
previousScale=sender.scale;
//仅当节点高度大于20时才缩小
如果(节点0.size.height>20){
//将比例因子降低0.05
[节点0运行操作:[SKAction scaleBy:0.95持续时间:0]];
}
}
}
What!?它对你的工作方式是什么?嗯……我刚刚加载了它,然后在我的iPad上再次尝试,当我捏(将两个手指向对方移动)时,它会像应该的那样放大。但是当我松开捏(将两个手指向对方移动)时它仍然在放大。这可能是一个bug吗?谢谢你的最小/最大比例,我本来打算添加它,并从触摸点而不是当前的角落进行缩放。我会尝试调整你的代码,看看我得到了什么。谢谢!!有可能你在转换它时潜意识中更正了它ObjC;-)从而更正了我的fa吗ult代码。@Freedlun-我刚刚再次查看了你的压缩代码,我看到你正在使用命令“sender.scale=1.01”对send.scale进行硬编码。因此,实际上你忽略了传递的实际值,并将其设置为1.01。将该行取出,它应该会工作。非常感谢你!我在我所有的工作中都忽略了这段代码