美文网首页ARKIT
SpriteKit(5) - 交互(Node触摸)

SpriteKit(5) - 交互(Node触摸)

作者: li_礼光 | 来源:发表于2017-07-28 18:41 被阅读86次

实现简单的用户交互,控制节点操作

import SpriteKit
import GameplayKit

class GameTouch: SKScene {
    
    var backgroundNode : SKSpriteNode!
    var zombieNode : SKSpriteNode!
    
    
    //点击屏幕牵动zombie行走,
    //1.获取点击的点的坐标
    //2.判断点击的点的坐标和zombie的锚点的位置
    //3.用2的两个坐标要计算得到,旋转角度,距离,移动速度.
    
    let duration : TimeInterval = 1
    
    override func didMove(to view: SKView) {
        setupNode()
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        //获取当前点击的点的坐标
        let touchs = touches as NSSet
        let touch : AnyObject = touchs.anyObject() as AnyObject
        let locationPoint = touch.location(in: self)
        self.zombieNode.zRotation = zombieRotate(nodePoint: self.zombieNode.position, touchPoint: locationPoint)
        //将zombie移动到当前的点
        ZombieMoveToPoint(node: self.zombieNode, point: locationPoint)
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        //获取当前点击的点的坐标
        let touchs = touches as NSSet
        let touch : AnyObject = touchs.anyObject() as AnyObject
        let locationPoint = touch.location(in: self)
        self.zombieNode.zRotation = zombieRotate(nodePoint: self.zombieNode.position, touchPoint: locationPoint)
        //将zombie移动到当前的点
        ZombieMoveToPoint(node: self.zombieNode, point: locationPoint)
    }
}


extension GameTouch {
    
    func setupNode() {
        
        self.backgroundNode = SKSpriteNode(imageNamed: "background1")
        backgroundNode.name = "backgroundNode"
        backgroundNode.position = CGPoint.zero
        backgroundNode.anchorPoint = CGPoint.zero
        self.addChild(backgroundNode)
        
        self.zombieNode = SKSpriteNode(imageNamed: "zombie1.png")
        zombieNode.name = "zombie"
        zombieNode.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
        zombieRun(node: zombieNode)
        self.addChild(zombieNode)
        
    }
    
    
    func zombieRun(node : SKSpriteNode) {
        let step1 = SKTexture(imageNamed: "zombie1.png")
        let step2 = SKTexture(imageNamed: "zombie2.png")
        let step3 = SKTexture(imageNamed: "zombie3.png")
        let step4 = SKTexture(imageNamed: "zombie4.png")
        let step5 = SKTexture(imageNamed: "zombie3.png")
        let step6 = SKTexture(imageNamed: "zombie2.png")
        let stepArray = [step1,step2,step3,step4,step5,step6]
        let runRightAction = SKAction.animate(with: stepArray, timePerFrame: 0.15)
        let runForever = SKAction.repeatForever(runRightAction)
        node.run(runForever)
    }
    
    func ZombieMoveToPoint(node : SKSpriteNode ,point : CGPoint) {
        let move = SKAction.move(to: point, duration: duration)
        node.run(move)
    }
    
    func zombieRotate(nodePoint : CGPoint, touchPoint : CGPoint) -> CGFloat {
        //获取到当前点击的点的坐标之后, 计算两者之间的距离
        let dx = touchPoint.x - nodePoint.x
        let dy = touchPoint.y - nodePoint.y
        
        if (dx > 0 && dy > 0) { //第一象限
            return atan(dy/dx)
        }else if (dx < 0 && dy > 0){//第二象限
            return atan(dx/(-dy)) + CGFloat.pi * 0.5
        }else if (dx < 0 && dy < 0){//第三象限
            return atan(dy/dx) + CGFloat.pi
        }else {//第四象限
            return CGFloat.pi * 2 - atan((-dy)/dx)
        }
    }
}

zombie.gif

这里面用了一些三角函数的简单只是去控制角度.

zombie旋转的处理 :
  • 我的做法和原书教材有点不一样,我以x正方向为固定参考点.方便求角度
  • 锚点与触摸的点,两点之间可以求x和y的差值.然后用这两个差值可以求出两点之间的角度.
  • 对比四个不同坐标象限的特点.然后做一些逻辑判断.
三角函数.png

相关文章

  • SpriteKit(5) - 交互(Node触摸)

    实现简单的用户交互,控制节点操作 这里面用了一些三角函数的简单只是去控制角度. zombie旋转的处理 : 我的做...

  • SpriteKit(5) - 交互(Node重力感应)

    因为这里是横屏操作,所以考虑好重力感应的x,y,z和node位置

  • SpriteKit(5) - 交互(Scene手势)

    常用的手势识别器 轻拍 捏 滑动 旋转 移动 长按 初始化 事件方法

  • SKNode

    场景内容外观或布局是由一个个node组成的。 Base Nodes 根node SpriteKit中的每个屏幕元素...

  • SceneKit

    概述 SceneKit是用来构建3D场景的框架,且可以与Core Animation和SpriteKit无缝交互。...

  • nodeJS基础

    Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互...

  • node.js(五)

    Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互...

  • Cocos2D-JS 中触摸事件的吞没和向“下”传递

    触摸事件的吞没 当给一个 Node 对象加入一个触摸 EventListener 时,要想让这个 Node 吞没这...

  • 触摸不交互

    NSSet : 集合,同样是保存一组数据,不过集合中的对象没有顺序 通过anyObject访问对象 集合的好处...

  • Android多点触摸交互处理

    触摸操作是安卓最基本的交互方法,掌握多点触摸的开发可增强应用交互体验。首先需要了解触摸事件的侦听和传递,同...

网友评论

  • li_礼光:素材可以自行找些,也可以用一个纯色的node,这里只是为了熟悉

本文标题:SpriteKit(5) - 交互(Node触摸)

本文链接:https://www.haomeiwen.com/subject/rnlflxtx.html