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

Game Studio


Hướng dẫn xoay một đối tượng xung quanh một trục cụ thể trong Corona

Chào các bạn, chắc hẳn các bạn đã quá quen thuộc khi dùng hàm rotation để xoay một đối tượng hình ảnh nào đó , nhưng mặc định Corona chỉ cho phép chúng ta xoay hình ảnh đó với trục xoay là tâm của hình ảnh, nhiều lúc bạn muốn xoay hình ảnh với trục nằm ở bất kỳ điểm nào trên hình ảnh thì phải làm sao? bài viết hôm nay mình sẽ hướng dẫn cho các bạn xoay một hình ảnh với một trục bất kỳ.

Điều quan trọng là phải xác định vị trí trục xoay nằm trên hình ảnh bạn muốn xoay. Sau đây mình có 1 ví dụ nhỏ cho các bạn dể hình dung.

[​IMG]

Ở đây mình muốn hình chử nhật màu xanh xoay vòng tròn với trục là điểm màu đỏ.

Cách 1

Mã (Lua):

--Dấu chấm
local dot
-- Hình chữ nhật (có thể là một hình ảnh)
local rect
-- Trong trường hợp bạn cần sự kiện vật lý
local physics =require"physics"
physics.start()
physics.setGravity(0,0)
physics.setDrawMode("hybrid")
local doTurn =function(event)
  rect.rotation = rect.rotation +5
end
dot = display.newCircle(display.contentWidth/2,display.contentHeight/2,5)
dot:setFillColor(200,0,0)
rect = display.newRect(0,0,20,40)
physics.addBody(rect)
-- Thay đổi các điểm tham chiếu đến “botton center” cho rect của bạn
rect:setReferencePoint(display.BottomCenterReferencePoint)
-- Thiết lập các coords. cho rect của bạn
rect.y = dot.y
rect.x = dot.x
-- Chạy hình ảnh
Runtime:addEventListener("enterFrame", doTurn )
 



Cách 2: sử dụng với các hàm toán học

Mã (Lua):

--Dấu chấm
local dot
--Hình chử nhật
local rect
-- Trong trường hợp bạn cần sự kiện vật lý
local physics =require"physics"
physics.start()
physics.setGravity(0,0)
physics.setDrawMode("hybrid")
--Hàm toán học
localCos= math.cos
localSin= math.sin
localRad= math.rad
localAtan2= math.atan2
localDeg= math.deg
--
local radius =10
local angle =90--Start angle
local doTurn =function(event)
  rect.x = dot.x  +Cos(Rad(angle))* radius
  rect.y = dot.y  +Sin(Rad(angle))* radius

  local angleBetween =Atan2(dot.y-rect.y, dot.x-rect.x)
  rect.rotation =Deg(angleBetween)

  angle = angle +5
end
dot = display.newCircle(display.contentWidth/2,display.contentHeight/2,5)
dot:setFillColor(200,0,0)
-- Hình chữ nhật (có thể là một hình ảnh)
rect = display.newRect(0,0,20,40)
rect:setReferencePoint(display.BottomLeftReferencePoint)
physics.addBody(rect)

--Chạy hình ảnh
Runtime:addEventListener("enterFrame", doTurn )
 

Nếu bạn muốn tùy ý vị trí của dấu chấm bạn có thể sử dụng xReference và yReference để đặt nó ở bất kỳ đâu mà bạn muốn. Ví dụ dưới đây bạn chỉ cần thay đổi: rect.yReference = 50 đến bất kỳ giá trị mà bạn muốn.

Mã (Lua):

--Dấu chấm
local dot
-- Hình chữ nhật (có thể là một hình ảnh)
local rect
-- Trong trường hợp bạn cần sự kiện vật lý
local physics =require"physics"
physics.start()
physics.setGravity(0,0)
physics.setDrawMode("hybrid")
local doTurn =function(event)
   rect.rotation = rect.rotation +5
end
dot = display.newCircle(display.contentWidth/2,display.contentHeight/2,5)
dot:setFillColor(200,0,0)
rect = display.newRect(0,0,20,40)
physics.addBody(rect)
--Có thể thay đổi với giá trị bất kỳ
rect.yReference =50
-- Thiết lập các coords. Cho rect của bạn
rect.y = dot.y
rect.x = dot.x
--Chạy hình ảnh
Runtime:addEventListener("enterFrame", doTurn )
 


Đối với graphics 2.0 bạn phải thay đổi như sau:

Mã (Lua):
rect.setsetReferencePoint(display.BottomLeftReferencePoint)
--thành
rect.anchorX = 0
rect.anchorY = 1

Chúc các bạn thành công!

Nguồn: Coronaviet.com