如何停止角色在触摸并移出节点(按钮)边界时的移动



我正在开发一个简单的跑步游戏,我只有 3 个 shapenodes 一个玩家节点,它只是一个形状节点(红框,30 x 30),左/右按钮基本上是两个形状节点。

我已经设法设置标志并增加玩家节点的位置 X 并使用触摸中的按钮左右移动它开始方法并在触摸中停止移动结束方法一切正常。

问题是,如果我触摸右键,播放器会按预期向右移动。但是,如果我触摸并将手指移出按钮边界,只要我再次触摸该按钮,玩家就会停止。否则它会继续移动,另一个按钮也不会停止它。

当我移动手指时,我使用 touchesMoving 方法来停止玩家的移动,但这并不能解决问题,因为即使我的手指轻微颤抖,touchesMoved方法也会以最轻微的触摸移动触发。我希望当我的手指从按钮上移开而不是在按钮上时调用touchesMoved方法。

如何停止角色在被触摸并移出节点(按钮)边界时的移动?

您有 3 个触摸事件:

  • 触摸开始了;检查用户点击是否在一个移动按钮上(如果是 - 移动播放器,如果不是 - 返回)
  • touchesMoved;检查用户点击是否仍在移动按钮的边界内(如果是 - 继续移动玩家,如果不是 - 停止移动)
  • 触摸结束;停止玩家移动

您可以通过检查用户手指是否在按钮区域上来解决问题。

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
{
// nothing here
let touch = touches.first
let position_in_scene = touch!.location(in: self)
check_button(position: position_in_scene)
}
func check_button(position : CGPoint)
{
if right_button.contains(position)
{
// the tap was inside button boundaries
player.move_left()
}
else
{
// the tap was outside button boundaries
player.stop()
}
}

我正在运行以下代码:

类游戏场景:SKScene {

var player = SKSpriteNode()
var left = SKSpriteNode()
var right = SKSpriteNode()
var jumpbtn = SKSpriteNode()
var leftbtnPressed = false
var rightbtnPressed = false
var jump = false
var hSpeed: CGFloat = 2.0

override func didMove(to view: SKView) {
let border = SKPhysicsBody(edgeLoopFrom: self.frame)
border.friction = 0
self.physicsBody = border
jumpbtn = self.childNode(withName: "jumpbtn") as! SKSpriteNode
player = self.childNode(withName: "r1") as! SKSpriteNode
left = self.childNode(withName: "leftbtn") as! SKSpriteNode
right = childNode(withName: "rightbtn") as! SKSpriteNode

}//didmove to view

func moveRight(){
player.position = CGPoint(x: player.position.x + hSpeed, y: player.position.y)
}
func moveLeft (){
player.position = CGPoint(x: player.position.x - hSpeed, y: player.position.y)
}
func movement (){
if rightbtnPressed == true {
moveRight()
}
if leftbtnPressed == true {
moveLeft()
}
}//movement

func CheckButton(position : CGPoint) {
if right.contains(position){
rightbtnPressed = true
}
if left.contains(position) {
leftbtnPressed = true
}
else {
leftbtnPressed = false
rightbtnPressed = false
}
}// checkbutton

func jumping (){
if jump == true {
player.physicsBody?.applyImpulse(CGVector(dx:0, dy: 5.0))
}
}// jumping

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let positionINScene = touch.location(in: self)
let touchednode = self.atPoint(positionINScene).name
if touchednode == "rightbtn"{
rightbtnPressed = true
}
if touchednode == "leftbtn"{
leftbtnPressed = true
}
if touchednode == "jumpbtn"{
jump = true
jumping()  
}  
}
}//touchesbegan

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
let positionInScene = touch?.location(in: self)
CheckButton(position: positionInScene!)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
let positionINScene = touch.location(in: self)
let touchednode = self.atPoint(positionINScene)
if touchednode.name == "rightbtn"{
rightbtnPressed = false
}
if touchednode.name == "leftbtn"{
leftbtnPressed = false
}
if touchednode.name == "jumpbtn" {
jump = false
}
}
}//touchesEnded
override func update(_ currentTime: TimeInterval) {
movement()
}

当我触摸左键或右键时,玩家开始按预期移动,但问题是当玩家移动时,如果我触摸跳跃按钮,玩家会暂停移动到它应该移动和跳跃的地方 简单来说,我不能同时移动和跳跃

最新更新