단일 SKAction
을 사용하여 동일한 유형의 복수 SKSpriteNode
을 애니메이션화하려고합니다.새 SKSprideNodes를 화면 밖으로 추가하고 애니메이션을 기존 객체와 동기화하는 방법은 무엇입니까?
내가 뭘하고 싶은지, 화면에 동일한 유형의 SKSpriteNode
4 개를 표시하는 것입니다. 그런 다음 버튼을 누를 때 모두 애니메이션을 적용하고 왼쪽으로 이동하십시오. 처음으로 SKSpriteNode
이 화면을 벗어나면 오른쪽의 화면 위치에서 다른 SKSpriteNode
을 추가하고이 SKAction
루프에 추가하려고합니다.
아래 이미지는 내가 무엇을했는지 자세히 보여줍니다.
SKSpriteNode
년대를 표시하고 배열에 추가 할 수 있었다.
var squareBox = SKSpriteNode()
func addSquares(size:CGSize){
for var i = 0; i < 4; i++ {
// Create a new sprite node from an image
squareBox = SKSpriteNode(imageNamed: "noBox")
// Square pysics settings
squareBox.physicsBody = SKPhysicsBody(rectangleOfSize: self.squareBox.frame.size)
squareBox.physicsBody!.dynamic = false
squareBox.physicsBody!.categoryBitMask = squareBoxCategory
squareBox.physicsBody!.contactTestBitMask = leftEdgeCategory | edgeCategory
// SquareBox positioning on X
var xPos = size.width/5 + squareBox.size.height/2
var xPosInt = Int(xPos) * (i + 1)
xPos = CGFloat(xPosInt)
var yPos = size.height/2 + (squareBox.size.height/2)
squareBox.position = CGPointMake(xPos - squareBox.size.height/2, yPos)
self.addChild(squareBox)
squareArray.append(squareBox)
}
}
나는 그 같은 종류의 네 SKSpriteNode
년대 애니메이션을하는 올바른 방법인지 잘 모르겠지만, 버튼을 누를 때 모두가 원하는대로 왼쪽으로 이동하는 것처럼 보인다.
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
self.nodeAtPoint(location)
if self.nodeAtPoint(location) == self.button {
let move = SKAction.moveByX(-size.width/5 - squareBox.size.height/2, y: 0, duration: 1)
print("button clicked!")
for box in squareArray {
box.runAction(move)
}
}
}
}
는 내가 처음
SKSpriteNode
화면을 나갈 때 정의 할 수있는 화면의 왼쪽 가장자리에 보이지 않는 1 픽셀의 라인을 만들었습니다. 이 방법
func addLeftEdge(size:CGSize){
let leftEdge = SKNode()
leftEdge.physicsBody = SKPhysicsBody(edgeFromPoint: CGPointMake(1, 1), toPoint: CGPointMake(1, size.height))
leftEdge.physicsBody!.categoryBitMask = leftEdgeCategory
self.addChild(leftEdge)
}
문제는 그 나는 그들이 1 픽셀의 라인을 터치하면 didBeginContact
에 응답하지 않는 그들을 애니메이션 배열의 SKSpriteNode
년대. 결국
func didBeginContact(contact: SKPhysicsContact) {
println("contact!")
}
나는 왼쪽으로 이동하는 데 몇 초 동안 화면에
Force
SKSpriteNode
모든 년대를 적용 할 수 있도록 원하는 시간들이 될 때까지 모든 정류장을 통해 힘의 속도를 내려. 내 생각은 동일한 유형의 4 개의 객체를 만들어 화면에 추가 + 배열
var squareArray = [SKSpriteNode]()
에 추가하는 것이 었습니다. 그런 다음 첫 번째
SKSpriteNode
이 화면에서 나가면 배열에서 제거하고 마지막에 다시 추가하여 오른쪽 화면에서 벗어나게하여 원활한 애니메이션으로 이동합니다.
나는 전체적인 접근 방식이 잘못되었다고 생각합니다.
위에서 설명한대로 목표를 달성하기 위해 SKSpriteNode
을 여러 개 움직이는 것이 가장 좋은 방법이 무엇인지 알려주십시오. 나는 올바른 길을 가고 있는가?
도와주세요. 감사합니다.
이leftEdge.physicsBody.Dynamic=YES; //This allows it to enter onContact
leftEdge.physicsBody.collisionBitMask=0; //Disables edge from being moved by collision
leftEdge.physicsBody.AffectedByGravity=NO; //Prevents any in game gravity from moving the edge
이것은 당신이이 할 수 있습니다 : 당신은 둘 다 동적으로 원하기 때문에 접촉을 감지하기 위해
각 객체 (선, 사각형, 프레임 가장자리)에 대한 범주 비트 마스크를 생성하고 이에 따라 collisionBitMasks를 설정하여 문제를 해결할 수있었습니다. 힌트를 가져 주셔서 감사합니다! – Omen
문제 없음. 나열된 규칙은 계속 적용됩니다. 코드에 비트 마스크를 포함시키지 않았으므로 올바른 것으로 간주했습니다. 다행히 대답을 찾았습니다. – meisenman
도움 주셔서 감사합니다. 같은 것을하기위한 또 다른 옵션이 있음을 아는 것은 항상 좋은 일입니다. 건배! – Omen