Tutorial:Physics (Česky)
Vytvoříme si červený míč kutálející se po zelené zemi.
Na konci stránky je výsledný soubor/kód. Všechen kód klidně napiš do main.lua.
Začneme s love.load funkcí.
love.load()
Vytvoříme si fyzikální svět:
function love.load()
world = love.physics.newWorld(-650, -650, 650, 650) --vytvoří dvourozměrný svět (LOVE je pro 2D hry), obdélník s rozměry o výšce a šířce 650 jednotek
world:setGravity(0, 700) -- gravitace bude tento vektor, bude mířit dolů, velikost bude 700 jednotek
world:setMeter(64) -- nastavení kolik jednotek odpovídá metru (na metry měříme vzdálenost, tomu metru), zde 64
Ve světě vytvoříme fyzikální tělesa:
objects = {} -- množina/tabulka/seznam, no prostě datová struktura pro fyzikální tělesa
-- vytvoříme zemi o kterou se tělesa zastaví/odrazí ...
objects.ground = {}
-- dáme zemi hmotnost 0, takže se nebude pohybovat
objects.ground.body = love.physics.newBody(world, 650/2, 625, 0, 0) --pamatuj, že tvar je ukotvený k tělesu ze středu
objects.ground.shape = love.physics.newRectangleShape(objects.ground.body, 0, 0, 650, 50, 0) --ukotvi tvar k tělesu, šířka bude 650 a výška bude 50
--vytvořme míč
objects.ball = {}
objects.ball.body = love.physics.newBody(world, 650/2, 650/2, 15, 0) -- umísti míč ve středu světa a dej mu hmotnost 15
objects.ball.shape = love.physics.newCircleShape(objects.ball.body, 0, 0, 20) --podobně jako země, míč má ale poloměr 20
Nastavme si grafiku:
love.graphics.setBackgroundColor(104, 136, 248) --barva pozadí bude modrá
love.graphics.setMode(650, 650, false, true, 0) --rozměr okna 650x650, ne na celou obrazovku, vertikální synchronizace zaplá a nevyhlazovat hrany (antialiasing)
end
To by mělo stačit. Teď se pustíme do love.update() funkce.
love.update()
function love.update(dt)
world:update(dt) -- tímto pohneme celým světem - provede fyzikální simulaci ...
--zde obstaráme události z klávesnice
if love.keyboard.isDown("right") then --šipka vpravo strčí míč doprava
objects.ball.body:applyForce(400, 0) -- Použijeme sílu, což vynutí změnu rychlosti. Je to fyzikálně "korektní" způsob.
elseif love.keyboard.isDown("left") then --šipka vlevo strčí míč doleva
objects.ball.body:applyForce(-400, 0)
elseif love.keyboard.isDown("up") then --šipka nahoru stčí míč nahoru, což odpovídá skoku
objects.ball.body:setY(650/2)
end
end
Fyzika nám šlape, pusťme se do nakreslení míčku a země.
love.draw()
Kreslení země :
function love.draw()
love.graphics.setColor(72, 160, 14) -- barva výplně/pera bude od tohoto okamžiku zelená, jako barva trávy
love.graphics.polygon("fill", objects.ground.shape:getPoints()) -- nakresli mnohoúhelník (anglicky polygon) vyplněný barvou pera/výplně , nakresli ho v pozicích země (jak jsme ji definovali předtím, pamatuj že její pozice jsme uložili do datové struktury "objects")
Vykreslení míčku:
love.graphics.setColor(193, 47, 14) --červenou barvou
love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius(), 20) -- nakresli balónek, protože grafika je omezená na kreslení mnohoúhelníku, nakreslí se koule pomocí 20-stěného mnohoúhelníku
end
A je to! Následující zazipovaný soubor přejmenuj na physics.love (jakkoli, koncovka, to za tečkou, musí být "love"), spusť ho. A po travnaté zemi ti bude skákat míček. Že to vypadá trochu počítačověji, primitivněji, máš přeci fantazii ne? :)
The main.lua
Následující text není přeložený. Proč? Angličtina je pro tebe jako pro vývojáře důležitá (vetšina knih, manuálů ... je v angličtině). České komentáře odpovídají anglickým.
function love.load()
world = love.physics.newWorld(-650, -650, 650, 650) --create a world for the bodies to exist in with width and height of 650
world:setGravity(0, 700) --the x component of the gravity will be 0, and the y component of the gravity will be 700
world:setMeter(64) --the height of a meter in this world will be 64px
objects = {} -- table to hold all our physical objects
--let's create the ground
objects.ground = {}
--we need to give the ground a mass of zero so that the ground wont move
objects.ground.body = love.physics.newBody(world, 650/2, 625, 0, 0) --remember, the body anchors from the center of the shape
objects.ground.shape = love.physics.newRectangleShape(objects.ground.body, 0, 0, 650, 50, 0) --anchor the shape to the body, and make it a width of 650 and a height of 50
--let's create a ball
objects.ball = {}
objects.ball.body = love.physics.newBody(world, 650/2, 650/2, 15, 0) --place the body in the center of the world, with a mass of 15
objects.ball.shape = love.physics.newCircleShape(objects.ball.body, 0, 0, 20) --the ball's shape has no offset from it's body and has a radius of 20
--initial graphics setup
love.graphics.setBackgroundColor(104, 136, 248) --set the background color to a nice blue
love.graphics.setMode(650, 650, false, true, 0) --set the window dimensions to 650 by 650
end
function love.update(dt)
world:update(dt) --this puts the world into motion
--here we are going to create some keyboard events
if love.keyboard.isDown("right") then --press the right arrow key to push the ball to the right
objects.ball.body:applyForce(400, 0)
elseif love.keyboard.isDown("left") then --press the left arrow key to push the ball to the left
objects.ball.body:applyForce(-400, 0)
elseif love.keyboard.isDown("up") then --press the up arrow key to set the ball in the air
objects.ball.body:setY(650/2)
end
end
function love.draw()
love.graphics.setColor(72, 160, 14) -- set the drawing color to green for the ground
love.graphics.polygon("fill", objects.ground.shape:getPoints()) -- draw a "filled in" polygon using the ground's coordinates
love.graphics.setColor(193, 47, 14) --set the drawing color to red for the ball
love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius(), 20) -- we want 20 line segments to form the "circle"
end
Ostatní jazyky
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