Ios 如何让角色自动无限地来回滑动?

Ios 如何让角色自动无限地来回滑动?,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我是一个ubernoob开发一个使用SpriteKit从头开始的游戏,我试图制作一个角色,在屏幕两侧来回滑动(在横向模式下),直到检测到与另一个节点(稍后我将添加)发生碰撞为止。想想乒乓球,想想球拍是如何左右移动的,除非我希望这种移动是完全自动的/无限的 旁注:我计划在触摸屏幕时让这个角色跳跃,但继续前后移动。idk,如果这对您的方法有影响 好吧,这个答案并不完美,但它现在对我有效,所以: 基本上,你触摸屏幕产生一个盒子,当桨碰到盒子时,一些东西发生了(它停止移动): 导入SpriteKit /

我是一个ubernoob开发一个使用SpriteKit从头开始的游戏,我试图制作一个角色,在屏幕两侧来回滑动(在横向模式下),直到检测到与另一个节点(稍后我将添加)发生碰撞为止。想想乒乓球,想想球拍是如何左右移动的,除非我希望这种移动是完全自动的/无限的


旁注:我计划在触摸屏幕时让这个角色跳跃,但继续前后移动。idk,如果这对您的方法有影响

好吧,这个答案并不完美,但它现在对我有效,所以:

基本上,你触摸屏幕产生一个盒子,当桨碰到盒子时,一些东西发生了(它停止移动):

导入SpriteKit
//常数!
类游戏场景:SKScene,SKPhysicContactDelegate{
//有点复杂,但基本上我们希望在所有屏幕尺寸上都有一个恒定的速度
var sliderSpeed:CGFloat{return self.size.width/3}
var slider=SKSpriteNode()
var sliderVelocity=CGFloat(0)
var sliderIsContacted=false
让boxMask=UInt32(2)
设sliderMask=UInt32(4)
//用于接触滑块
func产卵箱(位置:CGPoint){
设rect=CGRect(原点:CGPoint.zero,大小:CGSize(宽:45,高:45))
设shape=SKShapeNode(rect:rect)
shape.fillColor=.green
shape.position=pos
设pb=SKPhysicsBody(矩形:矩形尺寸)
pb.categoryBitMask=boxMask
pb.contactTestBitMask=滑块掩码
shape.physicsBody=pb
addChild(形状)
}
func setupSlider(){
sliderVelocity=滑块速度
设rect=CGRect(原点:CGPoint.zero,大小:CGSize(宽:45,高:10))
设shape=SKShapeNode(rect:rect)
shape.fillColor=.blue
设pb=SKPhysicsBody(矩形:矩形尺寸)
pb.categoryBitMask=滑块掩码
pb.contactTestBitMask=boxMask
pb.velocity.dx=slidevercity//将滑块向右移动!
//有点复杂,但基本上我们想要一个spritenode,而不是shapenode:
滑块=SKSpriteNode(纹理:视图!。纹理(来源:形状))
slider.physicsBody=pb
添加子对象(滑块)
}
func setupWorld(){
设pb=SKPhysicsBody(edgeLoopFrom:frame)
pb.categoryBitMask=UInt32(0)
self.physicsBody=pb
physicsWorld.contactDelegate=self
physicsWorld.gravity=CGVector.zero
}
覆盖func didMove(到视图:SKView){
setupSlider()
setupWorld()
}
}
//游戏循环:
扩展游戏场景{
//触摸开始于iOS:
重写func mouseDown(带有事件:NSEvent){
let location=event.location(in:self)
产卵箱(位于:位置)
}
覆盖函数更新(uCurrentTime:TimeInterval){
让sliderPB=slider.physicsBody!
让halfWidth=slider.size.width/2
//当滑块到达最右侧边界时,将其向左移动:
如果sliderPB.velocity.dx>0{
if slider.position.x>=(frame.maxX-halfWidth){
sliderVelocity=-sliderSpeed
}
}
//当滑块到达最左侧边界时向右移动滑块:
否则{

如果slider.position.x不是一个免费的编码服务。告诉我们你到目前为止尝试了什么,没有人会从头开始为你写代码。@DávidPásztor不是真的,我一直这样做,Ubernoobs没有代码可以从他们正在做的bc开始;)我指责教程网站bvc tghey只展示如何做特定的事情,而没有教他们如何应用回到你自己的游戏
import SpriteKit

// constants!

class GameScene: SKScene, SKPhysicsContactDelegate {

  // A little complicated, but basically we want to have a constant speed across all screen sizes
  var sliderSpeed: CGFloat { return self.size.width / 3 }

  var slider = SKSpriteNode()
  var sliderVelocity = CGFloat(0)
  var sliderIsContacted = false

  let boxMask = UInt32(2)
  let sliderMask = UInt32(4)

  // For use to contact slider
  func spawnBox(at pos: CGPoint) {
    let rect = CGRect(origin: CGPoint.zero, size: CGSize(width: 45, height: 45))
    let shape = SKShapeNode(rect: rect)
    shape.fillColor = .green
    shape.position = pos

    let pb = SKPhysicsBody(rectangleOf: rect.size)
    pb.categoryBitMask = boxMask
    pb.contactTestBitMask = sliderMask
    shape.physicsBody = pb

    addChild(shape)
  }

  func setupSlider() {
    sliderVelocity = sliderSpeed

    let rect = CGRect(origin: CGPoint.zero, size: CGSize(width: 45, height: 10))
    let shape = SKShapeNode(rect: rect)
    shape.fillColor = .blue

    let pb = SKPhysicsBody(rectangleOf: rect.size)
    pb.categoryBitMask = sliderMask
    pb.contactTestBitMask = boxMask
    pb.velocity.dx = sliderVelocity // moves our slider to the right!

    // A little complicated, but basically we want to have a spritenode, not a shapenode:
    slider = SKSpriteNode(texture: view!.texture(from: shape))
    slider.physicsBody = pb
    addChild(slider)
  }

  func setupWorld() {
    let pb = SKPhysicsBody(edgeLoopFrom: frame)
    pb.categoryBitMask = UInt32(0)
    self.physicsBody = pb

    physicsWorld.contactDelegate = self
    physicsWorld.gravity = CGVector.zero
  }


  override func didMove(to view: SKView) {
    setupSlider()
    setupWorld()
  }
}

// Game loop:
extension GameScene {

  // touchesBegan in iOS:
  override func mouseDown(with event: NSEvent) {
    let location = event.location(in: self)
    spawnBox(at: location)
  }

  override func update(_ currentTime: TimeInterval) {
    let sliderPB = slider.physicsBody!
    let halfWidth = slider.size.width/2

    // move slider left when it reaches far right border:
    if sliderPB.velocity.dx > 0 {
      if slider.position.x >= (frame.maxX - halfWidth) {
        sliderVelocity = -sliderSpeed
      }
    }
      // move slider right when it reaches far left border:
    else {
      if slider.position.x <= (frame.minX + halfWidth) {
        sliderVelocity = sliderSpeed
      }
    }

    // Keep slider at constant rate:
    if sliderIsContacted == false {
      sliderPB.velocity.dx = sliderVelocity
    }
  }
  func didBegin(_ contact: SKPhysicsContact) {
    if contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask == sliderMask + boxMask {

      sliderIsContacted = true
      slider.physicsBody!.velocity.dx = 0 // stop slider
    }
  }
}