我的游戏中有一个虚拟控制板。如果我按住方向按钮之一,播放器将朝正确的方向移动并显示正确的图像和动画。但是,如果我将手指从一个控件滑到另一个控件(从右到下),则播放器将向下移动,但是图像和动画不会改变,直到我抬起手指为止。下面是我处理触摸的代码:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in (touches as! Set<UITouch>) {
let location = touch.location(in: cameraNode)
if upRect.contains(location) {
moveXDirection = 0
moveYDirection = 1
isIdle = false
playerSprite.walkUpPlayer()
} else if rightRect.contains(location) {
moveXDirection = 1
moveYDirection = 0
isIdle = false
playerSprite.walkLRPlayer()
} else if downRect.contains(location) {
moveXDirection = 0
moveYDirection = -1
isIdle = false
playerSprite.walkDownPlayer()
} else if leftRect.contains(location) {
moveXDirection = -1
moveYDirection = 0
isIdle = false
playerSprite.walkLRPlayer()
}
if !isIdle && moveXDirection != 0 {
playerSprite.xScale = moveXDirection
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in (touches as! Set<UITouch>) {
let location = touch.location(in: cameraNode)
if upRect.contains(location) {
moveXDirection = 0
moveYDirection = 1
isIdle = false
} else if rightRect.contains(location) {
moveXDirection = 1
moveYDirection = 0
isIdle = false
} else if downRect.contains(location) {
moveXDirection = 0
moveYDirection = -1
isIdle = false
} else if leftRect.contains(location) {
moveXDirection = -1
moveYDirection = 0
isIdle = false
}
if !isIdle && moveXDirection != 0 {
playerSprite.xScale = moveXDirection
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
idlePlayer()
}
我更改播放器动画的代码是:
func idlePlayer() {
removeAllActions()
}
func walkLRPlayer() {
removeAllActions()
run(SKAction.repeatForever(walkLRAnimation!))
}
func walkUpPlayer() {
removeAllActions()
run(SKAction.repeatForever(walkUpAnimation!))
}
func walkDownPlayer() {
removeAllActions()
run(SKAction.repeatForever(walkDownAnimation!))
}
任何建议将不胜感激。
答案 0 :(得分:0)
您的播放器从touchesBegan
中的一个方向开始,然后在touchesEnded
上停止。问题在于您不处理touchesMoves
上的方向更改。
让我们创建一个全局变量,该变量将告诉我们是否改变了方向。
var previous_direction : Int = -1 // idle state
在触摸功能上,添加previous_direction
行为。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in (touches as! Set<UITouch>) {
// we start with previous_direction being the start direction
if upRect.contains(location) {
previous_direction = 0 // up
} else if rightRect.contains(location) {
previous_direction = 1 // right
} else if downRect.contains(location) {
previous_direction = 2 // down
} else if leftRect.contains(location) {
previous_direction = 3 // left
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in (touches as! Set<UITouch>) {
// we create a current_direction also
var current_direction : Int = -1
// get current_direction
if upRect.contains(location) {
current_direction = 0 // up
} else if rightRect.contains(location) {
current_direction = 1 // right
} else if downRect.contains(location) {
current_direction = 2 // down
} else if leftRect.contains(location) {
current_direction = 0 // left
}
// now we compare if the current_direction is different from previous_direction
if current_direction != previous_direction
{
player.removeAllActions()
// attribute new direction
if current_direction == 0 {
playerSprite.walkUpPlayer()
} else if current_direction == 1 {
walkLRPlayer.walkLRPlayer()
} else if current_direction == 2 {
walkLRPlayer.walkDownPlayer()
} else if current_direction == 3 {
walkLRPlayer.walkLRPlayer() }
// we prepare previous_direction for the next time he enters this function
previous_direction = current_direction
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// reset previous_direction
previous_direction = - 1 // idle state
}