2014-11-23 33 views
5

Tôi có nhiều đối tượng trò chơi trong trò chơi iOS, một số trong đó có độ phân giải lớn hơn các trò chơi khác. Đồ họa để sử dụng cho đối tượng trò chơi được chọn ngẫu nhiên khi chạy. Tôi muốn chắc chắn rằng tất cả họ đều không đi qua một kích thước nhất định khi được sử dụng, vì vậy tôi nghĩ ra thuật toán sau đây:Kích thước và chia tỷ lệ SKSpriteNode

while self.spriteNode.rSize.width > 100 && self.spriteNode.rSize.height > 100 { 
    self.xScale -= 0.01 
    self.yScale -= 0.01 
} 

nơi spriteNode là đối tượng có kết cấu là đồ họa và rSize là một mở rộng thuộc tính được tính toán trên SKSpriteNode trả về kích thước của khung tích lũy của nút.

Thông thường, điều này dẫn đến một vòng lặp vô hạn. Có chuyện gì vậy?

UPDATE 1

Dựa trên nhận xét LearnCocos2D, tôi đã thử như sau:

let reqXScale = 50/self.spriteNode.rSize.width 
let reqYScale = 50/self.spriteNode.rSize.height 
self.xScale = reqXScale 
self.yScale = reqYScale 

Mặc dù điều này giải quyết các vấn đề vòng lặp vô hạn, một số đối tượng được squished hơn là giữ tỉ lệ ban đầu của họ.

Ngoài ra, đây là mã định nghĩa rSize:

var rSize: CGSize { 
    return self.calculateAccumulatedFrame().size 
} 

Tôi đã sử dụng này chắc chắn nhiều lần trước đó.

+1

Sẽ hữu ích nếu bạn đăng mã xác định rSize. – 0x141E

+1

wow đó là mã khủng khiếp, bạn chỉ có thể lấy được các yếu tố quy mô cần thiết từ tỷ lệ giữa kích thước thực tế và mong muốn và gán kết quả. Vòng lặp while sẽ chỉ chặn chương trình trong một thời gian (hoặc nếu bạn có một lỗi như trong trường hợp này: mãi mãi). Ngoài ra, hãy xem xét tỷ lệ khung hình, bạn có thể muốn cập nhật riêng tỷ lệ x/y. – LearnCocos2D

+0

lý do tại sao accumFrame? Nếu các nút không có bất kỳ con, nó giống hệt với khung. Nếu nó có con, nó sẽ không chia tỷ lệ nội dung của sprite thành kích thước mới nhưng với tổng kích thước của sprite AND con của nó. – LearnCocos2D

Trả lời

4

Tôi có thể tìm ra. Tôi đang sử dụng một chiều rộng ngẫu nhiên bởi vì đó là những gì tôi yêu cầu.

// Scaling 
let aspectRatio = self.spriteNode.rSize.width/self.spriteNode.rSize.height 
let randWidth = CGFloat(rand(60, 90)) 
self.spriteNode.size = CGSize(width: randWidth, height: randWidth/aspectRatio) 
+0

cách vẽ đối tượng có chiều rộng chính xác là 60px? Nó được vẽ với kích thước lớn –

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