2015-03-20 21 views
6

Tôi đang tạo trò chơi phổ dụng cho tất cả các thiết bị iOS ở chế độ dọc bằng Swift. Trong GameViewController tôi là tạo ra khung cảnh như thế này:Vị trí SkSpriteNode trong trò chơi phổ quát

let scene = GameScene(size:CGSize(width: 1536, height: 2048)) 
scene.scaleMode = .AspectFill 

Hình nền có độ phân giải 1536x2048, và như vậy với scaleMode trên trên iPad được hiển thị ở kích thước đầy đủ của nó, trên iPhone 6 1152x2048 được hiển thị với bên tỉa. Hoạt động hoàn toàn tốt trên tất cả các thiết bị và chỉ cần một hình nền. Vấn đề là nếu tôi gọi cho size.width hoặc self.frame.size.width, nó luôn trả về 1536, ngay cả khi vùng hiển thị thực tế là v.d. 1152.

Làm cách nào tôi có thể đặt vị trí của SkSpriteNode liên quan đến khu vực hiển thị, sao cho nó sẽ là ví dụ 50x50 từ góc trên mọi thiết bị?

Trả lời

10

Làm thế nào tôi có thể thiết lập SkSpriteNode của vị trí tương đối với vùng hiển thị, vì vậy rằng nó sẽ được cho ví dụ 50x50 từ góc trên mọi thiết bị?

"Khu vực hiển thị" chỉ đơn giản là chế độ xem.

Vì vậy, bạn có thể làm cho vị trí của bạn liên quan đến các xem, và không phải là cảnh. Tôi thực sự làm điều này rất nhiều trong trò chơi của mình, đó là phổ biến và chạy trên cả OS X và iOS.

Trong trường hợp của tôi, tôi thường làm điều này cho giao diện người dùng, vì vậy tôi có thể có cảnh được chia tỷ lệ nhưng tôi muốn đặt một số vị trí không liên quan đến cảnh được thu nhỏ nhưng liên quan đến khu vực hiển thị (tức là chế độ xem).

Để thực hiện việc này, bạn có thể viết chức năng chuyển đổi tọa độ xem sang tọa độ cảnh tương ứng.

Đây là chức năng của tôi mà tôi sử dụng. Lưu ý rằng tôi trừ vị trí y mong muốn của tôi từ độ cao của chế độ xem để tôi có thể xử lý (0,0) như dưới cùng bên trái như bộ ghi-ma thay vì trên cùng bên trái như UIKit.

func convert(point: CGPoint)->CGPoint { 
    return self.view!.convertPoint(CGPoint(x: point.x, y:self.view!.frame.height-point.y), toScene:self) 
} 

Dưới đây là một ví dụ của việc sử dụng chức năng này:

self.node.position = convert(CGPoint(x: 50, y: 50)) 

này sẽ luôn luôn buộc các vị trí của các nút để có mặt tại (50,50) so với view (phần nhìn thấy được của màn hình) bất kể cảnh của bạn được thu nhỏ và thu nhỏ như thế nào.

+0

Vì vậy, bạn đang sử dụng chức năng này trong GameViewController và đó cũng là nơi bạn đang thêm giao diện người dùng? –

+0

@shargath Rất tiếc, bạn nên nói chế độ xem chứ không phải sceneView. Tôi sẽ chỉnh sửa nó ngay bây giờ. Tôi đang sử dụng phương pháp này trong lớp cảnh.Và giao diện người dùng của tôi được thực hiện hoàn toàn bằng bộ phụ kiện. –

+0

Tuyệt vời, bởi vì tôi đã làm toàn bộ giao diện người dùng của tôi cũng trong spriteKit nên lớp cảnh làm việc cho tôi :) –

1

Tôi không nghĩ đây thực sự là cách tiếp cận tốt nhất. Bạn nên tạo GameScene dựa trên kích thước của SKView

let scene = GameScene(size: self.skView.bounds.size) 

Tôi không nghĩ bạn nên đặt một kích thước phổ dụng cho mọi thiết bị. Bạn cần cho phép thiết bị đặt kích thước cảnh dựa trên độ phân giải của màn hình. Sau đó, bạn cần tạo các hình ảnh khác nhau dựa trên thiết bị. 2x, 3x, 2x ~ ipad vv ..

Hướng dẫn này là một nơi tốt để bắt đầu: http://www.raywenderlich.com/49695/sprite-kit-tutorial-making-a-universal-app-part-1

+1

Thực ra, cách tiếp cận mà tôi đã sử dụng là trong cuốn sách trò chơi iOS của raywenderlich.com theo hướng dẫn ... –

Các vấn đề liên quan