Tutorial:Physics (Tiếng Việt)
Trong ví dụ này ta sẽ tạo nên một quả bóng đỏ lăn trên nền xanh.
Ví dụ sau khi hoàn thành sẽ có ở cuối trang này. Tất cả những hàm liệt kê cần được đặt trong một file có tên main.lua
Ta sẽ bắt đầu bằng hàm love.load().
love.load()
Trước hết ta cần dựng nên một world mà các vật thể vận động trong đó.
function love.load() love.physics.setMeter(64) --chiều cao của một mét trong môi trường này sẽ bằng 64 pixel world = love.physics.newWorld(0, 9.81*64, true) --tạo nên một môi trường chứa các vật thể, với lực trọng trường hướng ngang bằng 0 và hướng thẳng đứng bằng 9.81
Bây giờ khi world đã được tạo lập, ta có thể thêm vào trong đó các vật thể, hình dạng, và fixture.
objects = {} -- bảng chứa tất cả những vật thể ta có --hãy tạo một nền đất objects.ground = {} objects.ground.body = love.physics.newBody(world, 650/2, 650-50/2) --nhớ rằng hình dạng (hình chữ nhật được tạo nên sau đây) sẽ gắn với vật thể ở vị trí tâm của nó, vì vậy ta phải dịch chuyển nó đến (650/2, 650-50/2) objects.ground.shape = love.physics.newRectangleShape(650, 50) --tạo một hình chữ nhật có bề rộng bằng 650 và chiều cao bằng 50 objects.ground.fixture = love.physics.newFixture(objects.ground.body, objects.ground.shape) --gắn hình dạng vào vật thể --hãy tạo nên quả bóng objects.ball = {} objects.ball.body = love.physics.newBody(world, 650/2, 650/2, "dynamic") --đặt vật thể vào vị trí trung tâm của môi trường và làm nó có tính động (dynamic), để nó chuyển động được objects.ball.shape = love.physics.newCircleShape( 20) --hình dạng của quả bóng có bán kính bằng 20 objects.ball.fixture = love.physics.newFixture(objects.ball.body, objects.ball.shape, 1) -- Gắn fixture vào vật thể và cho nó một mật độ bằng 1. objects.ball.fixture:setRestitution(0.9) --để cho quả bóng nảy --hãy tạo nên một vài khối hộp để chơi xem sao objects.block1 = {} objects.block1.body = love.physics.newBody(world, 200, 550, "dynamic") objects.block1.shape = love.physics.newRectangleShape(0, 0, 50, 100) objects.block1.fixture = love.physics.newFixture(objects.block1.body, objects.block1.shape, 5) -- Giá trị mật độ cao làm tăng khối lượng của nó. objects.block2 = {} objects.block2.body = love.physics.newBody(world, 200, 400, "dynamic") objects.block2.shape = love.physics.newRectangleShape(0, 0, 100, 50) objects.block2.fixture = love.physics.newFixture(objects.block2.body, objects.block2.shape, 2)
Bây giờ để kết thúc hàm love.load(), ta hãy lập kích thước màn hình và màu nền.
--thiết lập đồ họa ban đầu love.graphics.setBackgroundColor(104, 136, 248) --đặt nền màu xanh lam love.graphics.setMode(650, 650, false, true, 0) --đặt kích thước cửa sổ bằng 650 x 650, không toàn bộ màn hình, bật vsync, và không trơn nét (antialias). end
Được rồi, như vậy là đủ khâu thiết lập ban đầu cho cơ chế vật lý. Bây giờ ta cần viết hàm love.update().
love.update()
function love.update(dt) world:update(dt) --lệnh này giúp môi trường vận động --ở đây ta sẽ tạo nên một số sự kiện bàn phím if love.keyboard.isDown("right") then --nhấn phím mũi tên phải để đẩy quả bóng sang phải objects.ball.body:applyForce(400, 0) elseif love.keyboard.isDown("left") then --nhấn phím mũi tên trái để đẩy quả bóng sang trái objects.ball.body:applyForce(-400, 0) elseif love.keyboard.isDown("up") then --nhấn phím mũi tên lên để đưa quả bóng lên không trung objects.ball.body:setPosition(650/2, 650/2) end end
Bây giờ khi môi trường được cập nhật rồi, ta có thể vẽ mặt đất và quả bóng.
love.draw()
Trước hết là mặt đất.
function love.draw() love.graphics.setColor(72, 160, 14) -- đặt màu vẽ mặt đất là xanh lục love.graphics.polygon("fill", objects.ground.body:getWorldPoints(objects.ground.shape:getPoints())) -- vẽ một đa giác được "tô kín" có dùng đến các tọa độ của mặt đất
Và sau cùng, ta có thể vẽ hình tròn biểu diễn quả bóng, và các hình khối.
love.graphics.setColor(193, 47, 14) --đặt màu vẽ quả bóng là đỏ love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius()) love.graphics.setColor(50, 50, 50) -- đặt màu vẽ các khối hộp là xám love.graphics.polygon("fill", objects.block1.body:getWorldPoints(objects.block1.shape:getPoints())) love.graphics.polygon("fill", objects.block2.body:getWorldPoints(objects.block2.shape:getPoints())) end
Đến đây ta đã hoàn thành rồi! Hãy đặt file này vào trong file nén, đổi tên nó thành physics.love (hoặc cái gì cũng được), rồi chạy nó. Và bạn sẽ có một quả bóng lăn trên nền xanh mướt như tôi đã hứa.
File main.lua
function love.load() love.physics.setMeter(64) --chiều cao của một mét trong môi trường này sẽ bằng 64 pixel world = love.physics.newWorld(0, 9.81*64, true) --tạo nên một môi trường chứa các vật thể, với lực trọng trường hướng ngang bằng 0 và hướng thẳng đứng bằng 9.81 objects = {} -- bảng chứa tất cả những vật thể ta có --let's create the ground objects.ground = {} objects.ground.body = love.physics.newBody(world, 650/2, 650-50/2) --nhớ rằng hình dạng (hình chữ nhật được tạo nên sau đây) sẽ gắn với vật thể ở vị trí tâm của nó, vì vậy ta phải dịch chuyển nó đến (650/2, 650-50/2) objects.ground.shape = love.physics.newRectangleShape(650, 50) --tạo một hình chữ nhật có bề rộng bằng 650 và chiều cao bằng 50 objects.ground.fixture = love.physics.newFixture(objects.ground.body, objects.ground.shape); --gắn hình dạng vào vật thể --let's create a ball objects.ball = {} objects.ball.body = love.physics.newBody(world, 650/2, 650/2, "dynamic") --đặt vật thể vào vị trí trung tâm của môi trường và làm nó có tính động (dynamic), để nó chuyển động được objects.ball.shape = love.physics.newCircleShape(20) --hình dạng của quả bóng có bán kính bằng 20 objects.ball.fixture = love.physics.newFixture(objects.ball.body, objects.ball.shape, 1) -- Gắn fixture vào vật thể và cho nó một mật độ bằng 1. objects.ball.fixture:setRestitution(0.9) --để cho quả bóng nảy --let's create a couple blocks to play around with objects.block1 = {} objects.block1.body = love.physics.newBody(world, 200, 550, "dynamic") objects.block1.shape = love.physics.newRectangleShape(0, 0, 50, 100) objects.block1.fixture = love.physics.newFixture(objects.block1.body, objects.block1.shape, 5) -- Giá trị mật độ cao làm tăng khối lượng của nó. objects.block2 = {} objects.block2.body = love.physics.newBody(world, 200, 400, "dynamic") objects.block2.shape = love.physics.newRectangleShape(0, 0, 100, 50) objects.block2.fixture = love.physics.newFixture(objects.block2.body, objects.block2.shape, 2) --thiết lập đồ họa ban đầu love.graphics.setBackgroundColor(104, 136, 248) --đặt nền màu xanh lam love.graphics.setMode(650, 650, false, true, 0) --đặt kích thước cửa sổ bằng 650 x 650 end function love.update(dt) world:update(dt) --lệnh này làm môi trường vận động --here we are going to create some keyboard events if love.keyboard.isDown("right") then --nhấn phím mũi tên phải để đẩy quả bóng sang phải objects.ball.body:applyForce(400, 0) elseif love.keyboard.isDown("left") then -nhấn phím mũi tên trái để đẩy quả bóng sang trái objects.ball.body:applyForce(-400, 0) elseif love.keyboard.isDown("up") then --nhấn phím mũi tên lên để đưa quả bóng lên không trung objects.ball.body:setPosition(650/2, 650/2) end end function love.draw() love.graphics.setColor(72, 160, 14) -- đặt màu vẽ mặt đất là xanh lục love.graphics.polygon("fill", objects.ground.body:getWorldPoints(objects.ground.shape:getPoints())) -- vẽ một đa giác được "tô kín" có dùng đến các tọa độ của mặt đất love.graphics.setColor(193, 47, 14) --đặt màu vẽ quả bóng là đỏ love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius()) love.graphics.setColor(50, 50, 50) -- đặt màu vẽ các khối hộp là xám love.graphics.polygon("fill", objects.block1.body:getWorldPoints(objects.block1.shape:getPoints())) love.graphics.polygon("fill", objects.block2.body:getWorldPoints(objects.block2.shape:getPoints())) end
Ngôn ngữ khác
Dansk –
Deutsch –
English –
Español –
Français –
Indonesia –
Italiano –
Lietuviškai –
Magyar –
Nederlands –
Polski –
Português –
Română –
Slovenský –
Suomi –
Svenska –
Türkçe –
Česky –
Ελληνικά –
Български –
Русский –
Српски –
Українська –
עברית –
ไทย –
日本語 –
正體中文 –
简体中文 –
Tiếng Việt –
한국어
More info