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