2016-01-18 11 views
9

Tôi muốn tạo cảnh quan ứng dụngphổ, để các nút sprite tỷ lệ tương ứng với bất kỳ kích thước chế độ xem nào đang chạy ứng dụng. Tôi muốn một giải pháp hoàn toàn có lập trình vì tôi không thích IB.Ứng dụng thiết bị phổ dụng iOS với SpriteKit, cách chia tỷ lệ các nút cho tất cả các chế độ xem?

Trò chơi của tôi khá đơn giản và tôi không cần cuộn hoặc thu phóng bất kỳ loại nào, vì vậy toàn bộ trò chơi sẽ luôn có mặt và chiếm toàn bộ lượt xem.

Có thể những gì tôi đang tìm kiếm là thay đổi kích cỡ của cảnh để luôn phù hợp với chế độ xem không? Nếu vậy, bạn có thể giải thích điều này hoàn toàn vì tôi đã cố gắng thay đổi phần này của bộ điều khiển quan điểm của tôi

if let scene = GameScene(fileNamed:"GameScene") 

là phương pháp xây dựng mà phải mất kích thước như một tham số nhưng Xcode không thích điều đó.


Những điều tôi đã cố gắng

  1. Sử dụng các phần phân đoạn của self.view.bounds.width/chiều cao. Điều này thường làm cho tất cả các iPhone trông tốt, nhưng trên iPad kéo dài và nghiêng các nút và hộp biên giới xung quanh xemw.
  2. Thay đổi scaleMode trong tất cả bốn loại. Tôi muốn giữ cho thực hành tốt và cảm thấy như .AspectFill (mặc định) là một trong những tôi nên làm cho ứng dụng của tôi làm việc với, nhưng mở để gợi ý. Chú thích; Tôi không muốn các cạnh màu đen trên bất kỳ thiết bị nào, chỉ toàn bộ màn hình được hiển thị/được tỷ lệ tương ứng.
  3. Áp dụng các ràng buộc có lập trình. Bây giờ tôi là khá mới này và không hiểu ràng buộc hoàn toàn, nhưng không có hướng dẫn tôi đã nhìn thấy ngay cả từ RayWenderlich nói về ràng buộc trên các nút vì vậy tôi đã không delve sâu trong này.
  4. Sử dụng phương pháp như thế này để chuyển đổi điểm giữa các chế độ xem. Điều này thực sự làm việc khá tốt cho việc định vị điểm của các nút, và nếu có thể tôi muốn phương pháp này hoạt động, nhưng sau đó tôi vẫn có vấn đề về kích thước của các nút. Ngoài ra khi tôi xây dựng cho iPad với phương pháp này xem dường như bắt đầu như chân dung và các nút nhìn tốt nhưng sau đó tôi phải tự chuyển nó sang phong cảnh và các sprites và xem ranh giới một lần nữa nhận được điều sai lầm. Đây là phương pháp:

    func convert(point: CGPoint)->CGPoint { 
        return self.view!.convertPoint(CGPoint(x: point.x, y:self.view!.frame.height-point.y), toScene:self) 
    } 
    
  5. Hướng dẫn vô số vid trên RW và mọi nơi khác trên internet.

Cảm ơn bạn trước! Tôi đánh giá cao sự giúp đỡ. Tôi biết chủ đề này là kỳ lạ bởi vì rất nhiều người đặt câu hỏi về nó nhưng tình hình của mọi người dường như là đủ khác nhau mà một giải pháp không phù hợp với tất cả.

Trả lời

9

Ban đầu tôi đã cố gắng tự mình mở rộng quy mô với 2 trò chơi và đó chỉ là sự điên rồ (kích thước cảnh = kích thước chế độ xem hoặc chế độ khung cảnh = .ResizeFill). Bạn phải điều chỉnh tất cả các giá trị ví dụ như kích thước phông chữ, kích thước sprite, xung vv cho tất cả các thiết bị và nó sẽ không bao giờ nhất quán.

Vì vậy, bạn có 2 lựa chọn cơ bản

1) Đặt kích thước trường để 1024X768 (ngang) hoặc 768x1024 (chân dung). Đây là cài đặt mặc định trong Xcode 7.

Bạn thường chỉ có/hiển thị thêm một số nền ở trên cùng/dưới cùng (ngang) hoặc trái/phải (dọc) trên iPad bị cắt trên iPhone.

Ví dụ về các trò chơi mà hiển thị thêm về iPad/cây trồng trên iPhone:

Altos phiêu lưu, Sư Tử Fortune, Limbo, The Line Zen, Modern Combat 5.

2) của Apple đã thay đổi cảnh mặc định kích thước trong xCode 8 đến iPhone 6/7 (750 * 1334-Portait, 1337 * 750-Landscape). Cài đặt này sẽ cắt trò chơi của bạn trên iPad.

Ví dụ về các trò chơi mà hiển thị ít hơn trên iPad:

Lumino City, Robot Unicorn tấn công

Chosing giữa 2 lựa chọn là tùy thuộc vào bạn và phụ thuộc game gì bạn đang làm. Tôi thường thích sử dụng tùy chọn 1 và hiển thị nhiều nền hơn trên iPad.

Bất kể chế độ quy mô kích thước cảnh nào thường là tốt nhất còn lại ở cài đặt mặc định của .aspectFill.

Để điều chỉnh những việc cụ thể như nhãn vv bạn có thể làm theo cách này

if UIDevice.current.userInterfaceIdiom == .pad { 
    ... 
} 

Bạn có thể thử các cảnh rộng chính mình, tạo một dự án SpriteKit mẫu trò chơi mới. Chạy trên tất cả iPhone và bạn sẽ thấy nhãn HelloWorld trông hoàn hảo trên tất cả các thiết bị.

Bây giờ thay đổi cài đặt mặc định thành kích thước khung cảnh = hoặc sử dụng .ResizeFill, nhãn HelloWorld không được thu nhỏ đúng cách trên tất cả các thiết bị.

Như một mặt lưu ý, dòng

if let scene = GameScene(fileNamed: "GameScene") 

tài liệu tham khảo tập tin GameScene.sks. Bạn nói rằng bạn làm tất cả mọi thứ programatically, do đó bạn có lẽ có thể xóa các tập tin GameScene.sks và thay đổi dòng để

let skView = view as! SKView! 
let scene = GameScene(size: CGSize(width: 1024, height: 768)) // 768 x 1024 if portrait 

Cập nhật:

bây giờ tôi đang sử dụng một biến thể hơi khác nhau như tôi đã có vấn đề thích ứng trò chơi của tôi cho iPhoneX. Tôi đặt kích thước cảnh thành 1334x750 và sử dụng khía cạnh phù hợp làm chế độ tỷ lệ. Tôi chạy một số mã để loại bỏ các thanh màu đen nếu cần ví dụ như iPad hoặc iPhone X như tôi thích để hiển thị thêm nền. Nó dựa trên bài viết tuyệt vời này.

http://endlesswavesoftware.com/blog/spritekit-skscene-scalemode/

+2

Cảm ơn sự trợ giúp! Tôi đã đánh dấu chính xác vì nó chứa một giải pháp hợp lệ cho vấn đề của tôi. Tuy nhiên tôi chỉ giải quyết nó một cách khác và sẽ dính phương pháp này: Trong info.plist của tôi, tôi lưu ý rằng định hướng màn hình cho iphone và ipad đã có và các quan điểm chân dung cho ipad vẫn còn đó là tốt. Tôi chỉ cần xóa chúng khỏi danh sách. Sau đó tôi cũng cần thiết đặt scene.size thành skView.bounds.size và hai thứ đó đã sửa nó (một cái không có cái khác sẽ phá vỡ chương trình). Bây giờ tôi tiếp tục vị trí và quy mô các nút liên quan đến xem và tất cả mọi thứ hoạt động tốt. – ljs

+2

Cảm ơn bạn đã đánh dấu. Yeah tôi đã không nhận ra bạn đang tìm kiếm những thứ phong cảnh trong plist. Có một chút lạ lùng khi hai mục đó vẫn còn ngay cả khi bạn bỏ chọn chân dung trong Xcode, khiến tôi đau đầu nhiều lần. Happy code – crashoverride777

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