Jak nadać obiektom prędkość w grze?
Często w grach potrzebujemy nadać obiektom prędkość. Wtedy z pomocą przychodzą specjalne funkcje, które pozwalają na przyłożenie pewnej ściśle określonej siły do obiektu niekiedy nawet w wybranym punkcie obiektu.
Jednym z najprostszych sposobów nadania prędkości obiektom jest użycie funkcji liniowej prędkości a mianowicie:
obiekt:setLinearVelocity(prędkośćX, prędkośćY)
Wtedy obiekt zacznie się poruszać z zadaną prędkością wzdłuż osi X i Y. Trzeba jednak uwzględnić siły grawitacji! Przejdźmy do naszego przykładu:
local physics = require("physics")
physics.setDrawMode("hybrid")
physics.start()
local pilka_plazowa_mala = display.newImage("pilka_plazowa_mala.png")
local podloze = display.newRect(0,800, 600, 50)
physics.addBody(pilka_plazowa_mala, {radius=50, density=7, friction=1, bounce=0.3})
physics.addBody(podloze, {density=1, friction=10, bounce=0.3})
podloze.bodyType = "static"
pilka_plazowa_mala:setLinearVelocity(100,10)
W zasadze interesować nas będzie ostatnia linijka kodu, czyli:
pilka_plazowa_mala:setLinearVelocity(100,10)
(bo wcześniejsze były już omawiane a wstawiłem je tu, by można było je skopiować do edytora Corona SDK). Jeśli chodzi o funkcję setLinearVelocity, to uruchomiona z podanymi wyżej parametrami, przyłoży do naszego obiektu czyli do pilka_plazowa_mala siłę odpowiedni dla x=100 pikseli na sekundę zaś w osi y 10 pikseli na sekundę. Ważne jest również to, że siła ta będzie przyłożona do środka obiektu.
Jak pozbyć się grawitacji?
Co jednak gdybyśmy chcieli, by obiekt poruszał się z zadaną prędkością czyli x=100 a y=10piskeli na sekunde nie zważając na grawitację?
Wstarczy:
- usunąć całkowicie grawitację wpisując physics.setGravity(0,0)
- bądź też dla naszego obiektu ją wyłączyć poleceniem: pilka_plazowa_mala.gravityScale=0
Zobaczmy co się wtedy stanie:
Tłumienie prędkości liniowej w Corona SDK
Gdy chcemy, by nasz obiekt zachowywał się nieco bardziej realnie czyli podlegał tłumieniu, bo przecież kopnięta piłka po jakimś czasie się zatrzymuje, musimy dodać do naszego kodu funkcje tłumienia:
obiekt.linearDamping=wartość_tłumienia
Zobaczmy to w praktyce dodając do naszego kodu linijkę:
pilka_plazowa_mala.linearDamping=1
W silniku Corona SDK a w zasadzie Box2D, bo to on został do niej dołożony są jeszcze dostępne funkcje pozwalające wprawić w ruch nasz obiekt np:
- obiekt:applyForce(siła_x,siła_y,punkt_obiektu_x,punkt_obiektu_y)
- applyLinearImpulse(siła_x,siła_y,punkt_obiektu_x,punkt_obiektu_y)
Myślę, że zajmiemy się nimi w przyszłości przy okazji poruszania postaciami w grach.
Czytaj dalej: Fizyka w grach 2d - Android
Warning: include_once(includes/rss_fetch.php) [function.include-once]: failed to open stream: No such file or directory in /home/ekoinst/domains/pcwiedza.pl/public_html/tworzenie-gier/includes/funkcje.php on line 548
Warning: include_once() [function.include]: Failed opening 'includes/rss_fetch.php' for inclusion (include_path='.:/opt/alt/php52/usr/share/pear:/opt/alt/php52/usr/share/php') in /home/ekoinst/domains/pcwiedza.pl/public_html/tworzenie-gier/includes/funkcje.php on line 548