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

Game Studio


Hướng dẫn: Sử dụng cảm biến gia tốc trên Apple TV Remote/Mobile

Một trong những điều thú vị về Remote của Apple TV mới là nó đã được tích hợp cảm biến gia tốc (accelerometer), và tương tự như các thiết bị di động, điều này sẽ cho phép bạn có thể xác định vị trí/định hướng của remote trong không gian. Về cơ bản, trong một thiết bị di động hoặc một remote, cảm biến gia tốc tạo ra 3 chỉ số riêng lẽ dựa trên định hướng và điểm trung tâm của thiết bị.

Các Accelerometer event

Các accelerometer event trả về nhiều giá trị hữu ích, bao gồm:

  • event.name — Thuộc tính này sẽ luôn là "accelerometer".
  • event.isShake — Thuộc tính này sẽ là true nếu một chuyển động nhanh chóng của thiết bị được phát hiện.
  • event.xGravity / event.yGravity / event.zGravity — Những event này có thể hữu ích. Chúng trả về cho bạn một giá trị giữa -1.0 và 1.0. Những giá trị này có thể làm cho các chuyển động nhỏ và giật trở nên mượt mà hơn.
  • event.xInstant, event.yInstant, event.zInstant — Những giá trị này báo cáo các thay đổi từ event cuối cùng, ví dụ các event.xGravity hiện tại trừ đi event.xGravitycuối cùng.
  • event.xRaw, event.yRaw, event.zRaw — Những giá trị này là những giá trị thực tế từ thiết bị (chưa được lọc hoặc áp dụng độ mượt).
  • event.deltaTime — Accelerometer events xảy ra trong khoảng thời gian nào đó có thể được dự đoán dựa trên các giá trị thiết lập bởi hàmsystem.setAccelerometerInterval(), nhưng chúng không được đảm bảo. Đây là nơi mà các event.deltaTime cho thấy sự hữu ích của nó. Nó cho phép bạn nhận được thời gian giữa các events vì vậy bạn có thể làm cho chuyển động mượt mà hơn khi cần thiết.

Tất cả các giá trị “gravity,” “instant,” và “raw” giả định rằng thiết bị đang trong định hướng “portrait”. Điều này rất phổ biến khi người dùng cầm Apple TV Remote (tương tự như các remote truyền thống). Tuy nhiên, nếu bạn đang thiết kế một ứng dụng theo định hướng “landscape” giống như một trò chơi đua xe, bạn có thể muốn Remote sẽ được cầm theo định hướng "landscape" (như một game controller truyền thống) để mô phỏng một tay lái. Trong trường hợp này, bạn nên điều chỉnh giá trị của bạn với một góc 90 độ.

Thực hiện

Chúng ta hãy nhìn vào ứng dụng đơn giản với cảm biến gia tốc. Ứng dụng này sẽ tạo ra một vòng tròn màu xanh và cho phép bạn di chuyển nó xung quanh màn hình bằng cách di chuyển/định hướng remote.

display.setDefault( "anchorX", 0 )

local dot = display.newCircle( display.contentCenterX, display.contentCenterY, 20 )
dot:setFillColor( 0, 0, 1 )
dot.color = "blue"
dot.anchorX = 0.5

local xGravityLabel = display.newText( "xGravity:", 10, 15, native.systemFontBold, 12 )
local yGravityLabel = display.newText( "yGravity:", 10, 31, native.systemFontBold, 12 )
local zGravityLabel = display.newText( "zGravity:", 10, 47, native.systemFontBold, 12 )

local xGravity = display.newText( "", 80, 15, native.systemFont, 12 )
local yGravity = display.newText( "", 80, 31, native.systemFont, 12 )
local zGravity = display.newText( "", 80, 47, native.systemFont, 12 )

local xInstantLabel = display.newText( "xInstant:", 250, 15, native.systemFontBold, 12 )
local yInstantLabel = display.newText( "yInstant:", 250, 31, native.systemFontBold, 12 )
local zInstantLabel = display.newText( "zInstant:", 250, 47, native.systemFontBold, 12 )

local xInstant = display.newText( "", 330, 15, native.systemFont, 12 )
local yInstant = display.newText( "", 330, 31, native.systemFont, 12 )
local zInstant = display.newText( "", 330, 47, native.systemFont, 12 )

local function onTilt( event )
    xGravity.text = event.xGravity
    yGravity.text = event.yGravity
    zGravity.text = event.zGravity
    xInstant.text = event.xInstant
    yInstant.text = event.yInstant
    zInstant.text = event.zInstant

    dot.x = dot.x + event.xGravity
    dot.y = dot.y + event.yGravity

    if dot.x > display.contentWidth then
        dot.x = display.contentWidth
    end
    if dot.x < 0 then
        dot.x = 0
    end
    if dot.y > display.contentHeight then
        dot.y = display.contentHeight
    end
    if dot.y < 0 then
        dot.y = 0
    end

    if event.isShake then
        if dot.color == "blue" then
            dot:setFillColor( 1, 0, 0 )
            dot.color = "red"
        else
            dot:setFillColor( 0, 0, 1 )
            dot.color = "blue"
        end
    end
    return true
end

Runtime:addEventListener( "accelerometer", onTilt )


Ví dụ đơn giản này, chúng ta tạo ra một dấu chấm (vòng tròn), tô màu cho nó là màu xanh, và thiết lập một số đối tượng văn bản để hiển thị các giá trị nhận được từ accelerometer event.

Accelerometer event cần một hàm listener, được phục vụ bởi hàm onTilt(). Bên trong hàm, chúng ta cập nhật các giá trị trên màn hình dựa trên các dữ liệu accelerometer hiện tại.

Tiếp theo, chúng ta cộng các giá trị của event.xGravity và event.yGravity vào vị trí x và y của dấu chấm. Điều này sẽ di chuyển dấu chấm đi xung quanh màn hình. Tiếp theo, chúng ta viết 4 câu điều kiện để giới hạn dấu chấm nằm trong phạm vi của màn hình.

Trong các code cuối cùng của hàm, chúng ta kiểm tra để xem thiết bị có bị rung/lắc hay không và sẽ thay đổi màu sắc qua lại (màu đỏ và màu xanh) mỗi lần phát hiện.

Cuối cùng, tại dòng cuối cùng của ví dụ này, chúng ta kích hoạt "accelerometer" event handler.

Lời kết

Sử dụng cảm biến gia tốc là một phần quan trọng để làm cho ứng dụng của bạn hoạt động chính xác trên tvOS bởi không phải mọi cơ chế điều khiển đều chỉ thực hiện với các up/down/left/right key events hoặc các axis inputs. Ví dụ, hãy xem xét một trò chơi cổ điển như "Fruit Ninja". Trên một thiết bị di động, bạn không thể sử dụng cảm biến gia tốc để chém trái cây nhưng bạn có thể vuốt, còn trên TV bạn không thể vuốt vào màn hình nhưng với một cảm biến gia tốc trên một remote, bạn có thể phát hiện chuyển động chém bằng cách theo dõi các giá trị của cảm biến gia tốc.

J.Black


Đăng sự kiện cho developer