Ios 动画数组不为精灵设置动画
我正在用SpriteKit用Swift制作一个简单的RPG。我写了一个角色类来帮助我处理所有的动画,我在动画方面遇到了一些问题 字符类:Ios 动画数组不为精灵设置动画,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我正在用SpriteKit用Swift制作一个简单的RPG。我写了一个角色类来帮助我处理所有的动画,我在动画方面遇到了一些问题 字符类: class Character: SKSpriteNode { var walkSouthArray = [SKTexture]() var walkNorthArray = [SKTexture]() var walkEastArray = [SKTexture]() var walkWestArray = [SKTextu
class Character: SKSpriteNode {
var walkSouthArray = [SKTexture]()
var walkNorthArray = [SKTexture]()
var walkEastArray = [SKTexture]()
var walkWestArray = [SKTexture]()
override init(texture: SKTexture?, color: UIColor, size: CGSize) {
super.init(texture: nil, color: UIColor.clear, size: CGSize(width: 100, height: 150))
self = CGSize(width: 100, height: 150)
self.position = CGPoint(x: 0, y: 0)
self.texture = SKTexture(imageNamed: "walk_south_1")
let northAtlas = SKTextureAtlas(named: "walk_north")
var northFrames:[SKTexture] = []
for index in 1 ... 8 {
let textureName = "walk_north_\(index)"
let texture = northAtlas.textureNamed(textureName)
northFrames.append(texture)
walkNorthArray = northFrames
}
let southAtlas = SKTextureAtlas(named: "walk_south")
var southFrames:[SKTexture] = []
for index in 1 ... 8 {
let textureName = "walk_south_\(index)"
let texture = southAtlas.textureNamed(textureName)
southFrames.append(texture)
walkSouthArray = southFrames
}
let eastAtlas = SKTextureAtlas(named: "walk_east")
var eastFrames:[SKTexture] = []
for index in 1 ... 8 {
let textureName = "walk_east_\(index)"
let texture = eastAtlas.textureNamed(textureName)
eastFrames.append(texture)
walkEastArray = eastFrames
}
let westAtlas = SKTextureAtlas(named: "walk_west")
var westFrames:[SKTexture] = []
for index in 1 ... 8 {
let textureName = "walk_\(index)"
let texture = westAtlas.textureNamed(textureName)
westFrames.append(texture)
walkWestArray = westFrames
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func walkNorth() {
self.run(SKAction.repeatForever(SKAction.animate(with: walkNorthArray, timePerFrame: 0.2)))
}
func walkSouth() {
self.run(SKAction.repeatForever(SKAction.animate(with: walkSouthArray, timePerFrame: 0.2)))
}
func walkEast() {
self.run(SKAction.repeatForever(SKAction.animate(with: walkEastArray, timePerFrame: 0.2)))
}
func walkWest() {
self.run(SKAction.repeatForever(SKAction.animate(with: walkWestArray, timePerFrame: 0.2)))
}
}
西行的框架还没有画出来
游戏场景类:
class GameScene: SKScene {
var v = CGVector()
var xJoystickDelta = CGFloat()
var yJoystickDelta = CGFloat()
var UINode = SKNode()
var WorldNode = SKNode()
var character = Character()
var DPad = SKSpriteNode()
var thumbNode = SKSpriteNode()
var isTracking:Bool = false
override func didMove(to view: SKView) {
DPad = SKSpriteNode(texture: SKTexture(imageNamed: "base"))
DPad.size = CGSize(width: 150, height: 150)
DPad.position = CGPoint(x: -200, y: -100)
DPad.zPosition = 3
UINode.addChild(DPad)
thumbNode = SKSpriteNode(texture: SKTexture(imageNamed: "stick"))
thumbNode.size = CGSize(width: 50, height: 50)
thumbNode.position = CGPoint(x: -200, y: -100)
thumbNode.zPosition = 4
UINode.addChild(thumbNode)
self.addChild(UINode)
self.addChild(character)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
if isTracking == false && DPad.contains(location) {
isTracking = true
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location: CGPoint = touch.location(in: self)
if isTracking == true {
v = CGVector(dx: location.x - DPad.position.x, dy: location.y - DPad.position.y)
let angle = atan2(v.dy, v.dx)
let deg = angle * CGFloat(180 / Double.pi)
let Length:CGFloat = DPad.frame.size.height / 2
let xDist: CGFloat = sin(angle - 1.57079633) * Length
let yDist: CGFloat = cos(angle - 1.57079633) * Length
xJoystickDelta = location.x - DPad.position.x
yJoystickDelta = location.y - DPad.position.y
if DPad.contains(location) {
thumbNode.position = location
} else {
thumbNode.position = CGPoint(x: DPad.position.x - xDist, y: DPad.position.y + yDist)
}
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
isTracking = false
thumbNode.run(SKAction.move(to: CGPoint(x: -200, y: -100), duration: 0.01))
xJoystickDelta = 0
yJoystickDelta = 0
}
override func update(_ currentTime: TimeInterval) {
// Called before each frame is rendered
if v.dx > abs(v.dy) {
// right
character.walkEast()
} else if v.dx < -abs(v.dy) {
// left
character.walkWest()
} else if v.dy > 0 {
// up
character.walkNorth()
} else if v.dy < 0 {
// down
character.walkSouth()
}
}
}
class游戏场景:SKScene{
var v=CGVector()
var xJoystickDelta=CGFloat()
var yJoystickDelta=CGFloat()
var UINode=SKNode()
var WorldNode=SKNode()
var character=character()
var DPad=SKSpriteNode()
var thumbNode=SKSpriteNode()
变量isTracking:Bool=false
覆盖func didMove(到视图:SKView){
DPad=SKSpriteNode(纹理:SKTexture(图像名称:“base”))
DPad.size=CGSize(宽:150,高:150)
DPad.position=CGPoint(x:-200,y:-100)
DPad.zPosition=3
UINode.addChild(DPad)
thumbNode=SKSpriteNode(纹理:SKTexture(图像名称:“stick”))
thumbNode.size=CGSize(宽:50,高:50)
thumbNode.position=CGPoint(x:-200,y:-100)
thumbNode.zPosition=4
UINode.addChild(拇指节点)
self.addChild(UINode)
self.addChild(字符)
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
如果isTracking==false&&DPad.contains(位置){
isTracking=true
}
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
接触{
让位置:CGPoint=touch.location(in:self)
如果isTracking==true{
v=CGVector(dx:location.x-DPad.position.x,dy:location.y-DPad.position.y)
让角度=atan2(v.dy,v.dx)
让deg=角度*CGFloat(180/Double.pi)
let Length:CGFloat=DPad.frame.size.height/2
设xDist:CGFloat=sin(角度-1.57079633)*长度
让yDist:CGFloat=cos(角度-1.57079633)*长度
xJoystickDelta=location.x-DPad.position.x
yJoystickDelta=location.y-DPad.position.y
如果DPad.contains(位置){
thumbNode.position=位置
}否则{
thumbNode.position=CGPoint(x:DPad.position.x-xDist,y:DPad.position.y+yDist)
}
}
}
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
isTracking=false
thumbNode.run(SKAction.move(到:CGPoint(x:-200,y:-100),持续时间:0.01))
xJoystickDelta=0
yJoystickDelta=0
}
覆盖函数更新(uCurrentTime:TimeInterval){
//在渲染每个帧之前调用
如果v.dx>abs(v.dy){
//对
character.walkEast()
}否则,如果v.dx<-abs(v.dy){
//左
character.walkWest()
}否则,如果v.dy>0{
//向上
character.walkNorth()
}否则,如果v.dy<0{
//向下
character.walkSouth()
}
}
}
它的设置是这样的,所以我所要做的就是调用动画的函数。当我称之为它们时,我得到的只是一张静止图像(地图集中的第一张图像)
据我所知,我的地图集设置正确:
我单击“+”按钮并选择“New Sprite Atlas”,然后将我的图像拖放到新文件夹中并重命名它。在更新周期中执行操作时务必小心 此操作以60 FPS的速度运行,这是大多数设备的默认速度,因此其中的任何命令都将以该速度启动 在您的特定情况下,您在每次更新时都会添加一个新的动画动作,因此就应用程序而言,它正在绘制动画,但您会继续向混合添加一个新的开始动画 由于您没有“X射线”视觉,因此无法通过最上面的动画层看到下面绘制的其他动画。(当然,这只是概念上的,系统并没有将层堆叠在彼此的顶部) 我建议您更改代码,以便只调用一次动画,并将其从更新周期中删除 我喜欢遵守的一条好规则是: 如果不是每帧都发生更改,则不要在更新函数中包含处理更改的代码 这意味着消除浪费时间的if-then检查,如
if v.dx>abs(v.dy)
,因为如果v.dx
v.dy
,则不需要检查每个帧,我们只需要在dx
或dy
更改时检查
在您的情况下,这发生在touchedMoved
事件期间
在此函数中更改v后,执行更新函数中的代码以运行动画
当然,您还需要删除其他移动动作,这样您就不会同时执行动作
您的代码应该如下所示:
class GameScene: SKScene {
enum Direction
{
case none
case up
case down
case left
case right
}
var charDir = Direction.none
var v = CGVector()
var xJoystickDelta = CGFloat()
var yJoystickDelta = CGFloat()
var UINode = SKNode()
var WorldNode = SKNode()
var character = Character()
var DPad = SKSpriteNode()
var thumbNode = SKSpriteNode()
var isTracking:Bool = false
override func didMove(to view: SKView) {
DPad = SKSpriteNode(texture: SKTexture(imageNamed: "base"))
DPad.size = CGSize(width: 150, height: 150)
DPad.position = CGPoint(x: -200, y: -100)
DPad.zPosition = 3
UINode.addChild(DPad)
thumbNode = SKSpriteNode(texture: SKTexture(imageNamed: "stick"))
thumbNode.size = CGSize(width: 50, height: 50)
thumbNode.position = CGPoint(x: -200, y: -100)
thumbNode.zPosition = 4
UINode.addChild(thumbNode)
self.addChild(UINode)
self.addChild(character)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location = touch.location(in: self)
if isTracking == false && DPad.contains(location) {
isTracking = true
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let location: CGPoint = touch.location(in: self)
if isTracking == true {
v = CGVector(dx: location.x - DPad.position.x, dy: location.y - DPad.position.y)
var newDirection = Direction.none
if v.dx > abs(v.dy) {
// right
newDirection = .right
} else if v.dx < -abs(v.dy) {
// left
newDirection = .left
} else if v.dy > 0 {
// up
newDirection = .up
} else if v.dy < 0 {
// down
newDirection = .down
}
if charDir != newDirection
{
charDir = newDirection
character.removeAllActions()
switch charDir{
case .right: character.walkEast()
case .left: character.walkWest()
case .up: character.walkNorth()
case .down: character.walkSouth()
default: break
}
}
let angle = atan2(v.dy, v.dx)
let deg = angle * CGFloat(180 / Double.pi)
let Length:CGFloat = DPad.frame.size.height / 2
let xDist: CGFloat = sin(angle - 1.57079633) * Length
let yDist: CGFloat = cos(angle - 1.57079633) * Length
xJoystickDelta = location.x - DPad.position.x
yJoystickDelta = location.y - DPad.position.y
if DPad.contains(location) {
thumbNode.position = location
} else {
thumbNode.position = CGPoint(x: DPad.position.x - xDist, y: DPad.position.y + yDist)
}
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
isTracking = false
thumbNode.run(SKAction.move(to: CGPoint(x: -200, y: -100), duration: 0.01))
xJoystickDelta = 0
yJoystickDelta = 0
}
override func update(_ currentTime: TimeInterval) {
}
}
class游戏场景:SKScene{
枚举方向
{
无案例
开箱
结案
案例左
案例权利
}
var charDir=Direction.none
var v=CGVector()
var xJoystickDelta=CGFloat()
var yJoystickDelta=CGFloat()
var UINode=SKNode()
var WorldNode=SKNode()
var character=character()
var DPad=SKSpriteNode()
var thumbNode=SKSpriteNode()
变量isTracking:Bool=false
覆盖func didMove(到视图:SKView){
DPad=SKSpriteNode(纹理:SKTexture(图像名称:“base”))
DPad.size=CGSize(宽:150,高:150)
DPad.position=CGPoint(x:-200,y:-100)
DPad.zPosition=3
UINode.addChild(DPad)
thumbNode=SKSpriteNode(纹理:SKTexture(图像名称:“stick”))
thumbNode.size=