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.

Hình chụp của sản phẩm gần được hoàn thành.


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