/ / Sprite Kit kamera sima mozgás késéssel - ios, gyors, kamera, sprite-készlet

Sprite Kit kamera sima mozgás késleltetéssel - ios, gyors, kamera, sprite-kit

Szóval, a kamerával mozoghatok a lejátszóval, de nem működik úgy, ahogyan szükségem van rá. Szóhatárokat állítottam be:

func keepPlayerInBounds() {
if player.position.x < frame.minX + player.size.width/2 {
player.position.x = frame.minX + player.size.width/2
}

if player.position.x > frame.maxX + player.size.width/2 {
player.position.x = frame.maxX + player.size.width/2
}
}

Szükségem van tehát a fényképezőgép max és min X értékére, hogy max. Legyen, és az X játékos pozícióját összekeverjük a worldNode-ban. A késleltetéssel sima mozgatással mozog, amikor a játékos jobbra vagy balra mozog. Megpróbáltam beállítani:

override func didFinishUpdate()
cam.position.x = player.position.x
}

Vagy:

override func didFinishUpdate() {
let move = SKAction.moveTo(x: player.position.x, duration: 0.5)
cam.run(move)
}

De ez több fejfájást okoz, mint amire szükség van.

A kérdés az, hogy hogyan állítsuk be a bal és jobb max pozíciót a kamerához, és késleltessük hibákat. Majdnem három hetet töltök, hogy megtaláljam a választ, de még mindig semmi. Kösz!

válaszok:

1 a válasz № 1

Egy egyszerűbb módja annak, hogy a játékot határok között tartsuk, hogy fizikai testet állítsunk a játékosnak, és egy fizikai testet a határok számára.

var player: SKSpriteNode! //player variable
var map: SKSpriteNode! //this simple node called map is a variable that represents the bounds area, for the example i made it the size of the scene (inside GameScene.sks)

override func didMove(to view: SKView) {
player = childNode(withName: "player") as! SKSpriteNode // initializing the player from the scene file.
player.physicsBody = SKPhysicsBody(rectangleOf: player.size) // initializing player physics body(in this example the player is a simple rectangle).

map = childNode(withName: "map") as! SKSpriteNode // initializing the map from the scene file.
map.physicsBody = SKPhysicsBody(edgeLoopFrom: map.frame) // instead of assigning a physics body to the scene it self, we created the map variable and assign the physics body to it, the edgeLoopFrom physics body  is a static volume-less body, so the player will not be able to pass through.

setupCamera() // for the second part of your question we create this method and call it right here in viewDidLoad().
}

a kamera pozíciójának frissítése a frissítési () módszerben nem elegendő, ha egyszerűen hozzá kell adnia a fényképezőgép korlátait. (Hozzáadtam a kamerát a jelenetfájlhoz is)

func setupCamera() {
guard let camera = camera, let view = view else { return } // make sure we have a camera and a view or else return

let zeroDistance = SKRange(constantValue: 0)
let playerConstraint = SKConstraint.distance(zeroDistance,
to: player) // as the name suggest this is a simple constraint for the player node.
//next part of the method will assign a second constraint to the camera which will prevent the camera from showing the dark area of the scene in case the player will go to the edge. you don"t have to add this part but it is recommended.
let xInset = min(view.bounds.width/2 * camera.xScale,
map.frame.width/2)
let yInset = min(view.bounds.height/2 * camera.yScale,
map.frame.height/2)

let constraintRect = map.frame.insetBy(dx: xInset,
dy: yInset)

let xRange = SKRange(lowerLimit: constraintRect.minX,
upperLimit: constraintRect.maxX)
let yRange = SKRange(lowerLimit: constraintRect.minY,
upperLimit: constraintRect.maxY)

let edgeConstraint = SKConstraint.positionX(xRange, y: yRange)
edgeConstraint.referenceNode = map

camera.constraints = [playerConstraint, edgeConstraint] //finally we add the constraints we created to the camera, notice that the edge constraint goes last because it has a higher priority.
}

Kapcsolódó kérdések


Hozzászólások (0)

Hozzászólni