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