Phím, chuột và camera
Cả hai đều thuộc về một người chơi, nên chỉ dùng trong ClientScript. Script trên server đụng tới input hay camera sẽ báo lỗi.
Phím
input.onKey("E", function() -- khi bấm (không tính lúc người chơi đang gõ chat hay ô nhập)
net.send("interact")
end)
if input.isDown("LeftShift") then -- đang giữ phím?
print("đang chạy nhanh")
endTên phím: "A" tới "Z", "Zero" tới "Nine", "Space", "Return", "Tab", "Backspace", "Escape", "LeftShift", "RightShift", "LeftControl", "RightControl", "LeftAlt", "RightAlt", "Up", "Down", "Left", "Right".
Với mọi thứ khác - nút chuột, lúc nhả phím - dùng các event thô:
input.began:connect(function(inputObject, typing)
if typing then return end -- người chơi đang gõ chat hay ô nhập
print(inputObject.type, inputObject.key)
end)
input.ended:connect(function(inputObject, typing)
if inputObject.key == "LeftShift" then print("thôi chạy nhanh") end
end)Phím game đã dùng
W A S D để đi, Space để nhảy, Shift là khoá camera, 1-0 chọn công cụ, Tab là bảng người chơi, Enter và / là chat, Esc là menu. Hãy chọn phím khác cho hành động riêng của game - E, F, Q, R...
Điện thoại không có bàn phím: hãy cho mỗi hành động một nút trên màn hình (Lập trình UI), hoặc dùng Prompt, thứ chạm được trên điện thoại.
Chuột đang trỏ vào đâu
game.frame:connect(function()
local hit = world:raycast(camera:ray()) -- từ camera xuyên qua con trỏ
if hit then
marker.position = hit.position
end
end)camera:ray(distance?) trả về điểm đầu và hướng đi qua con trỏ - chuột, giữa màn hình khi khoá camera hay góc nhìn thứ nhất, hoặc lần chạm cuối - dài 1.000 unit nếu không nói khác.
Camera
Khi chưa có script nào đổi, camera là camera của game: đi theo nhân vật, chuột để xoay, con lăn để phóng, và không chui vào tường.
| Thành viên | Là gì |
|---|---|
camera.mode | "Follow" (camera của game), "Fixed" (đứng yên chỗ script đặt), "FirstPerson" (luôn là mắt nhân vật) |
camera.transform | Vị trí và hướng nhìn. Gán vào là cố định camera ở đó |
camera.position | Vị trí; gán vào là cố định camera |
camera.fov | Góc nhìn, 20 tới 100 độ (ban đầu 45) |
camera.target | Thứ "Follow" bám theo: một part, người chơi khác, hoặc nil cho nhân vật của chính mình |
camera.minZoom, camera.maxZoom | Con lăn phóng gần và xa tới đâu, 0,5 tới 400 unit |
camera.offset | Dời điểm camera xoay quanh (x sang phải, y lên, z ra sau) |
camera.firstPerson | True khi camera là mắt nhân vật (chỉ đọc) |
camera.firstPersonArms | Ở góc nhìn thứ nhất, vẫn vẽ tay của người chơi (true) |
camera.viewportSize | Kích thước màn hình tính bằng điểm UI (chỉ đọc) |
camera:toScreen(position) | Một điểm trong world nằm đâu trên màn hình, và có ở phía trước không |
camera:tween(goals, time) | Đổi mượt - phóng to, một cảnh phim |
Ví dụ
-- Camera nhìn từ trên cao
camera.transform = transform.lookAt(vec3(0, 60, 40), vec3(0, 0, 0))
camera.fov = 50
-- Trở lại bình thường
camera.mode = "Follow"-- Chạy nhanh thì góc nhìn rộng ra
input.began:connect(function(i, typing)
if not typing and i.key == "LeftShift" then camera:tween({fov = 60}, 0.2) end
end)
input.ended:connect(function(i)
if i.key == "LeftShift" then camera:tween({fov = 45}, 0.2) end
end)-- Một cảnh phim: bay giữa hai part, rồi trả lại camera
camera:tween({transform = world.Shot1.transform}, 2).completed:wait()
camera:tween({transform = world.Shot2.transform}, 3).completed:wait()
camera.mode = "Follow"-- Xem người chơi khác
camera.target = someOtherPlayer-- Một dấu đánh dấu trên part, bằng UI màn hình
local where, inFront = camera:toScreen(world.Goal.position)
marker.visible = inFront
marker.position = dim.px(where.x, where.y)Góc nhìn thứ nhất
Mọi world đều cho người chơi phóng hết cỡ vào góc nhìn thứ nhất, như Roblox. Để đổi cách camera bắt đầu cho mọi người, chèn Camera settings (Insert > Camera settings) và đặt Mode, Min zoom, Max zoom, Field of view, Arms in first person và Offset trong Inspector. Min zoom từ 2 trở lên sẽ không cho người chơi vào góc nhìn thứ nhất.
ClientScript đổi camera của người chơi của nó từ đó:
-- Game bắn súng: luôn góc nhìn thứ nhất, góc nhìn rộng, trả con trỏ khi mở cửa hàng
camera.mode = "FirstPerson"
camera.fov = 80
local shop = players.me.gui:waitFor("Shop")
input.onKey("B", function()
shop.visible = not shop.visible
input.mouseFree = shop.visible -- hiện con trỏ khi cửa hàng mở
end)
game.frame:connect(function()
if camera.firstPerson then
local hit = world:raycast(camera:ray(300)) -- thứ tâm ngắm đang chỉ vào
end
end)Khoá camera
Người chơi bấm Shift (hoặc nút ổ khoá trên điện thoại) để khoá camera: camera đứng sau vai phải, con trỏ ẩn đi và có tâm ngắm ở giữa, thân người luôn quay về hướng camera nhìn. camera:ray() khi đó đi qua tâm ngắm. input.mouseFree = true cũng thả con trỏ ở đây.