2015-01-30 15 views
9

Vì vậy, về cơ bản trong trò chơi của tôi, tôi cần phải quăng hoặc ném một vật thể. Cho đến nay tôi có một sprite, Nó có thể được kéo nhưng nó không thể được ném. ý tưởng trò chơi là để ném một sprite va chạm với một sprite khác. Tôi muốn các sprite mà chúng tôi sẽ gọi testNode, Để di chuyển như thế nào mà người dùng đã ném nólàm thế nào để ném SKSpriteNode?

có nghĩa là, khi tôi phát hành các sprite tôi muốn nó tiếp tục theo hướng mà tôi di chuyển nó. Tôi đã dành thời gian cố gắng để làm việc này nhưng tôi không thể. Tôi đang sử dụng SpriteKit cho iOS 8+. Nếu có ai có thể giúp làm ơn.

Có một video tôi đã xem nhưng đó là với GameSalad, đó là một câu chuyện khác. Bạn có thể có một cái nhìn

https://www.youtube.com/watch?v=nn3lWa5jUGE

(Reply nếu bạn có thể cần phải tiếp xúc hơn nữa)

import Foundation; 
import SpriteKit; 

class Level:SKScene { 

TestNode:Test? //Test is a class I made 

//Removed the update and touches began due to it being irrelevant to what I need help with. 

    override func didMoveToView(view: SKView){ 
    testNode = Fruit(imageNamed: "apple_idle") 
    testNode?.position = CGPointMake(60, 294) 
    testNode?.xScale = 0.5 
    testNode?.yScale = 0.5 
    self.addChild(testNode!) 
    } 
    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 

    var nodeTouched = SKNode() 
    var currentNodeTouched = SKNode() 

    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 

     nodeTouched = self.nodeAtPoint(location) 
     testNode?.position = location 
    } 
} 

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { 

    var touch: UITouch = touches.anyObject() as UITouch 
    var location: CGPoint = touch.locationInNode(self) as CGPoint 


} 

Trả lời

20

Dưới đây là một ví dụ nhanh tôi đã viết di chuyển một sprite với liên lạc bằng cách mô phỏng vận tốc của nó trong vòng lặp trò chơi như trái ngược với việc thiết lập vị trí trực tiếp. Điều này làm cho sprite động hơn (tức là bạn có thể "ném" nó, và để nó tương tác với các vật thể vật lý khác khi bạn kéo sprite). Không có tính toán góc là cần thiết, tôi chỉ đơn giản là tính toán vận tốc cần thiết để di chuyển các sprite đến vị trí cảm ứng trong một khoảng thời gian. Trong trường hợp này, tôi đặt thời gian là 1/60 để chuyển động được áp dụng ngay lập tức để đối tượng xuất hiện rất nhạy.

import SpriteKit 
class GameScene: SKScene { 
    var sprite: SKSpriteNode! 
    var touchPoint: CGPoint = CGPoint() 
    var touching: Bool = false 
    override func didMoveToView(view: SKView) { 
     self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
     sprite = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 50, height: 50)) 
     sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size) 
     sprite.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0) 
     self.addChild(sprite) 
    } 
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
     let touch = touches.first as! UITouch 
     let location = touch.locationInNode(self) 
     if sprite.frame.contains(location) { 
      touchPoint = location 
      touching = true 
     } 
    } 
    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { 
     let touch = touches.first as! UITouch 
     let location = touch.locationInNode(self) 
     touchPoint = location 
    } 
    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
     touching = false 
    } 

    override func update(currentTime: CFTimeInterval) { 
     if touching { 
      let dt:CGFloat = 1.0/60.0 
      let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y) 
      let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt) 
      sprite.physicsBody!.velocity=velocity 
     } 
    } 
} 

enter image description here

Bạn có thể tinh chỉnh các phyiscs tính toán chính mình để có được hiệu quả mong muốn bạn đang tìm kiếm. Nhưng mã này là đủ để giúp bạn bắt đầu. Một số cải tiến tôi có thể nghĩ là có thể giới hạn vận tốc để đối tượng không thể di chuyển quá nhanh khi được thả ra. Thêm một sự chậm trễ để kéo cảm ứng để di chuyển các sprite nhưng sau đó vô tình dừng ngắn ở cuối tiếp tục ném đối tượng.

+1

Cảm ơn bạn nhiều điều này làm việc hoàn hảo bạn không biết bao nhiêu tôi cần điều này! –

+1

@ Jesster2k10 Tuyệt vời, vui vì nó hoạt động. Ngoài ra vui lòng đánh dấu câu trả lời là được chấp nhận nếu bạn cảm thấy nó đã trả lời câu hỏi của bạn. Nếu bạn cần thêm trợ giúp, hãy cho tôi biết. –

+0

Tôi đã đánh dấu là đã được chấp nhận! vấn đề duy nhất của tôi là nếu bạn chạm vào bất cứ nơi nào trên màn hình, Sprite sẽ được chuyển đến đó. Tôi không thực sự muốn điều đó xảy ra. Tôi chỉ muốn di chuyển nó nếu sprite đang được chạm vào. đây là giải thích thêm. https://www.dropbox.com/s/evkzetluuucld8k/Apple.mov?dl=0 –

2

Nếu bạn đang kéo ma, sau đó điều này không nên quá khắt khe . có vẻ như bạn cần thêm một số vật lý vào trò chơi của mình.

thêm video này vào testNode sau khi bạn đặt yScale

testNode.physicsBody = SKPhysicsBody(rectangleOfSize: testNode.size) 

bây giờ chạy các trò chơi. bạn sẽ thấy dropNode thả xuống dưới cùng của màn hình. Bạn không muốn điều đó xảy ra, vì vậy chúng tôi sẽ làm cho biên giới của màn hình hoạt động như một cơ thể vật lý.

Thêm này ở đầu didMoveToView

self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 

Điều này sẽ làm cho các cạnh của màn hình chứa testNode của bạn. bạn sẽ có thể nhặt nó lên và thả nó ngay bây giờ

bạn có thể phải tinh chỉnh công thức này một chút để thực sự ném các sprite xung quanh.

bạn có thể phải so sánh vị trí liên lạc cuối cùng của mình với vị trí chạm hiện tại của bạn, lấy góc giữa các vị trí đó và áp dụng xung vào sprite.

+0

Geez, Không mong đợi phản ứng nhanh như vậy. Tôi sẽ thử nó –

+0

cũng có nghĩa là gì bởi "Tinh chỉnh với công thức này?" –

+0

Tôi có nghĩa là bạn sẽ phải viết nhiều mã hơn và thực hiện nhiều nghiên cứu hơn nhưng điều này sẽ giúp bạn bắt đầu – hamobi

0

Đây là Swift 3.0/4.0 phiên bản của câu trả lời

class GameScene: SKScene { 
var sprite: SKSpriteNode! 
var touchPoint: CGPoint = CGPoint() 
var touching: Bool = false 
override func didMove(to view: SKView) { 
    let physicsFrame = CGRect(x: 0, y: 50, width: self.frame.size.width, height: self.frame.size.height - 100) 
    self.physicsBody = SKPhysicsBody.init(edgeLoopFrom: physicsFrame) 
    sprite = SKSpriteNode(color: UIColor.red, size: CGSize(width: 50, height: 50)) 
    sprite.physicsBody = SKPhysicsBody.init(rectangleOf: sprite.size) 
    sprite.position = CGPoint(x: self.size.width/2.0, y: self.size.height/2.0) 
    self.addChild(sprite) 
} 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first! 
    let location = touch.location(in:self) 
    if sprite.frame.contains(location) { 
     touchPoint = location 
     touching = true 
    } 
} 
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let touch = touches.first! 
    let location = touch.location(in: self) 
    touchPoint = location 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    touching = false 
} 
override func update(_ currentTime: TimeInterval) { 
    if touching { 
     let dt:CGFloat = 1.0/60.0 
     let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y) 
     let velocity = CGVector(dx: distance.dx/dt, dy: distance.dy/dt) 
     sprite.physicsBody!.velocity=velocity 
    } 
}} 
Các vấn đề liên quan