ios - 如何在触摸并移出节点(按钮)边界时停止精灵的移动
问题描述
我正在开发一个简单的跑步者游戏,我只有 3 个 shapenodes 一个玩家节点,它只是一个 shapenode(redbox,30 x 30),左/右按钮基本上是两个 shapenodes。
我设法设置标志并增加播放器节点的位置 X 并使用touchesBegan方法中的按钮左右移动它并停止touchesEnded方法中的移动一切正常。
问题是,如果我触摸让我们说右键,玩家会按预期向右移动。但是,如果我在任何方向上触摸并将手指移出按钮边界,只要我再次触摸该按钮,播放器就会不断移动,然后它就会停止。否则它会继续移动,另一个按钮也不会停止它。
当我移动手指时,我使用touchesMoved方法停止播放器的移动,但这并不能解决问题,因为即使我的手指轻微抖动,touchesMoved方法也会触发最轻微的触摸移动。我希望当我的手指离开按钮而不是按钮时调用touchesMoved方法。
当触摸并移出节点(按钮)边界时,如何停止精灵的移动?
解决方案
我正在运行此代码:
类游戏场景: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()
}
当我触摸左或右按钮时,播放器开始按预期移动,但问题是当播放器移动时让我们说如果我触摸跳转按钮,播放器会暂停移动它应该移动的地方并用简单的话跳跃我可以不能同时移动和跳跃
推荐阅读
- javascript - 是否可以从 Cloudflare 工作人员重定向脚本中排除搜索机器人(如 Google)?
- mongodb - 对象数据转换的mongodb数组
- jquery - 本地运行光滑滑块失败
- angular - 如何扩展角度原理图属性?
- azure-devops-server-2019 - 作为 Visual Studio Enterprise 订阅者,我能否在不购买额外许可证的情况下在本地(生产)运行 DevOps Server 2019?
- ios - 在 ChildByAutoId 下从 Firebase 检索数据并添加到数组 - Xcode - Swift
- ms-access - 访问 - 字符串到日期 - 日期 + 时间
- python - python kivy - on_press 被执行两次
- mysql - 用 SQL 编写查询以显示过去担任销售代表的员工的当前工作的详细信息
- powershell - PowerShell:Get-Item 与 Get-ChildItem 输出类型