Game Studio
Liên kế mạng xã hội

Game Studio


Hướng dẫn: mở rộng các điểm neo (anchor point) trong Corona SDK

Trong Corona, tất cả các đối tượng hiển thị đều có một điểm neo . Về cơ bản, điều này có thể được hình dung như một điểm "pin" nằm bên trong giới hạn của đối tượng và tất cả các biến đổi sẽ xảy ra tại đó như định vị x/y, rotation, và scale. Ví dụ, nếu điểm neo được định nghĩa ở góc trên bên trái của một đối tượng, khi ta rotation đối tượng, đối tượng này sẽ xoay xung quanh điểm đó.

Trong các phiên bản trước đây của Corona, khái niệm này đã được biết đến như là điểm tham chiếu (reference point) và nó xử lý 2 phương pháp nhưng đã bị phản đối do có những bất cập khi sử dụng. Đầu tiên là object:setReferencePoint() API chỉ chấp nhận 9 hằng số để thiết lập điểm "pin" ở trung tâm hoặc tại các điểm cụ thể trên các cạnh của đối tượng. Ví dụ, bạn có thể chỉ định display.TopLeftReferencePoint để "pin" đối tượng ở góc trên bên trái của nó, hoặc display.TopCenterReferencePoint để “pin” đối tượng ở vị trí giữa của cạnh trên...

Ngoài ra, bạn có thể xác định một điểm tham chiếu ‘được điều chỉnh” bằng cách thiết lập các thuộc tính xReference hoặc yReference của đối tượng. Điều này cho phép các nhà phát triển có thể thiết lập các điểm tham chiếu đến bất kỳ điểm nào trong giới hạn của đối tượng, hoặc thậm chí đến một điểm bên ngoài giới hạn đối tượng bằng cách thiết lập giá trị vượt quá các cạnh của nó.

Trong các phiên bản hiện tại của Corona, cả hai phương pháp trên đã được thay thế bởi các điểm neo (anchor point). Tuy nhiên, thay vì thiết lập một giá trị không đổi hoặc một khu vực nội dung, điểm neo thường được định nghĩa là giá trị thập phân giữa 0.0 và 1.0, với 0.0 đại diện cho cạnh trên hoặc cạnh trái, 0.5 đại diện cho trung tâm, và 1.0 đại diện cho phía dưới hoặc bên phải. Ví dụ, nếu bạn muốn mô phỏng theo display.TopLeftReferencePoint cũ, bạn có thể thiết lập cả hai điểm neo là 0.0 (hoặc đơn giản là 0):

object.anchorX = 0 object.anchorY = 0

Bằng cách này, các điểm neo có thể làm được những gì các phương pháp trước đó có thể làm - Tuy nhiên, có một điều mà trước đây đã bị "loại bỏ" là khả năng thiết lập các điểm neo bên ngoài giới hạn của đối tượng. Trước đây, bạn có thể đạt được điều này bằng cách thiết lập thuộc tính xReference hoặc yReference của đối tượng đến giá trị vượt quá các cạnh của nó. Cụ thể, hành vi mặc định của các điểm neo là chúng bị giới hạn trong phạm vi giữa 0.0 và 1.0, do đó giá trị thiết lập bên ngoài phạm vi này sẽ “đi cùng” với các clamped giới hạn tương ứng.

Mở rộng các điểm neo

Để phân biệt với các điểm neo nằm bên trong đối tượng, các kỹ sư của corona đã thêm một tùy chọn "isAnchorClamped" mới dành cho display.setDefault(), điều này sẽ khả dụng trong Daily Build 2015.2733 trở về sau sau. Khi thiết lập là false, bạn có thể xác định các điểm neo ở bên ngoài giới hạn của đối tượng:

display.setDefault( "isAnchorClamped", false )

Bây giờ, các điểm neo được thiết lập các giá trị nằm ngoài khoảng 0-1 sẽ được sử dụng:

local rect = display.newRect( 200, 240, 50, 50 ) rect.anchorX = -1 rect.anchorY = 1.5 transition.to( rect, { rotation=135, delay=500 } )

Ví dụ

Một ví dụ cho thấy phương pháp này có những hữu ích chính là xoay một đối tượng xung quanh một đối tượng khác, như một hành tinh quay quanh mặt trời của nó. Nếu các điểm neo được gán vào các điểm bên trong hoặc ở trên cạnh của đối tượng, đối tượng này chỉ có thể xoay ở một góc độ hạn chế. Bây giờ, với "isAnchorClamped" thiết lập là false, bạn có thể dễ dàng thực hiện các loại xoay dạng như các hành tinh quay quanh một mặt trời:

display.setDefault( "isAnchorClamped", false )

local sun = display.newCircle( display.contentCenterX, display.contentCenterY, 24 )
sun:setFillColor( 1.0, 0.78, 0 )

local earth = display.newCircle( display.contentCenterX, display.contentCenterY, 6 )
earth:setFillColor( 0, 0.5, 0.7 )
earth.anchorX = -10.0

transition.to( earth, { time=8000, rotation=-360, iterations=0 } )

Kết luận

Với thiết lập mới này, bây giờ bạn có thể sử dụng toàn bộ sức mạnh mà các điểm tham chiếu trong các phiên bản cũ của Corona có thể làm được, bao gồm các điểm “pin” bên trong và bên ngoài giới hạn của đối tượng. Tuy nhiên, hãy nhớ rằng, tính năng này chỉ khả dụng trong Daily Build 2015.2733 trở về sau.

Xem thêm:

Đăng sự kiện cho developer