Qt Quick – Gra komputerowa

Qt Quick – Gra komputerowa

W ramach pracy dyplomowej przygotowałem silnik gier komputerowych opierając się o technologię Qt Quick. Miałem duże nadzieje wobec realizowanego projektu. Jeszcze przed wyborem tematu wszystko wskazywało na to, że MeeGo będzie głównym system operacyjnym w produktach Nokii. Niestety sprawy się skomplikowały. MeeGo zostało zepchnięte na bok, a mój zapał do pracy nad silnikiem bardzo zmalał. Mimo wszystko musiałem zrealizować temat, który wcześniej zgłosiłem. Nie było łatwo ponieważ silnik postanowiłem oprzeć o graf sceny Qt, który był rozwijany równocześnie z pisaniem pracy magisterskiej. Zmiany programistów Qt często skutkowały dużymi regresjami w już napisanym przeze mnie kodzie. Dodatkowo do projektu dołączyłem silnik fizyczny Box2D oraz bibliotekę FMOD służącą odgrywaniu plików dźwiękowych. Ostateczny efekt jest dość ciekawy. Silnik działa bardzo płynnie, a przygotowanie za jego pomocą gry jest niesamowicie proste oraz szybkie. Nie trzeba znać skomplikowanego języka programowania takiego jak C++ czy Java. Wystarczy elementarna znajomość QML oraz JavaScript. Przygotowany silnik ma swoje mocne strony. Za sprawą Qt teoretycznie działa na wszystkim, począwszy od komputerów (Windows, Linux, Mac OS X) po urządzenia mobilne (MeeGo, Symbian).

Możliwości silnika:

  • efektywne renderowanie grafiki 2D oraz 2.5D za sprawą Qt Scenegraph;
  • podstawowe elementy graficzne: kształty, obrazki oraz duszki;
  • efekty końcowe realizowane w jednostkach cieniowania;
  • w pełni zintegrowany silnik fizyki Box2D – zaadaptowano większość możliwości tego silnika;
  • obsługa gamepadów i innych urządzeń wejścia dostępnych już w Qt;
  • odgrywanie multimediów za sprawą FMOD;
  • obsługa sieci.

Interfejs programowania

Gry za pomocą przygotowanego silnika tworzy się w oparciu o język QML oraz JavaScript. Deklarując scenę można się posługiwać elementami zarówno pochodzącymi z modułu Qt Quick 2.0 jak i modułu silnika Qtiko 1.0. Oto kilka przykładów.

Utworzenie pustej sceny:

import QtQuick 2.0
import Qtiko 1.0

Qtiko
{
    width: 640; height: 480
    // pozostały kod sceny
}

Animowanie duszka:

import QtQuick 2.0
import Qtiko 1.0

Sprite
{
    source: "Flake.png"
    frames: 51
    PropertyAnimation on frame {to: frames; duration: 1000; loops: Animation.Infinite}
}

Rozmycie zadanego elementu za sprawą programu w jednostce cieniowania:

import QtQuick 2.0
import Qtiko 1.0

Qtiko
{
    width: 210; height:180;
    Image
    {
        id: image
        source: "image.png"
        anchors.fill: parent
    }

    ShaderEffectSource
    {
        id: msource;
        sourceItem: image;
        hideSource: true;
    }

    PostProcessing
    {
        anchors.fill: parent
        source: msource
        effect: Blur { level: 3 }
    }
}

Odgrywanie próbki dźwiękowej A oraz po jej zakończeniu próbki B:

import QtQuick 2.0
import Qtiko 1.0

Qtiko
{
    width: 400; height: 510
    Sound
    {
        id: soundA
        source: "muzykaA.wav"
        play: true
        onPlayChanged:
        {
            soundB.play = true
        }
    }

    Sound
    {
        id: soundB
        source: "muzykaB.wav"
        play: false
    }
}

Efekt echo w odgrywanej próbce dźwiękowej:

import QtQuick 2.0
import Qtiko 1.0

Qtiko
{
    Sound
    {
        source: "muzyka.wav"
        play: true
        loop: true
        effect: EchoEffect
        {
            delay: 77
            active: true
        }
    }
}

Deklaracja fizyki oraz obiektu podłoża:

import QtQuick 2.0
import Qtiko 1.0

Qtiko
{
    width: 640; height: 480
    Physics
    {
        anchors.fill: parent
        running: true
        gravity: Qt.point(0, -10)
        Body
        {
            height: 20
            anchors { left: parent.left; right: parent.right; bottom: parent.bottom }
            bodyType: Body.Static
            fixtures: Box
            {
                anchors.fill: parent
                categories: Box.Category1
                collidesWith: Box.All
            }
            Image
            {
                source: "Rockwall.png"
                anchors.fill:parent
                fillMode: Image.Tile
            }
        }
    }
}

Takich przykładów mogło by być dużo więcej, ale chciałem pokazać raptem podstawy. Niestety nie mogę udostępnić silnika. Prawa majątkowe należą do uczelni, na której realizowałem pracę.

Demo

Komentarze

  • Jesus Boadas15-09-2011

    Your page looks very interesting, can you traduce it to English.
    Best Regards

  • Agata21-10-2012

    Rewela :/. A tutaj można kupić kod źródłowy tej gry (gotowiec)
    https://www.garagegames.com/products/tgb-platformer-kit
    Tat z ciekawości ile czas zajęło Ci stworzenie tego demka??

  • Marcin Baszczewski21-10-2012

    Hej. Co do TGB – wykorzystałem wyłącznie grafikę. Demo, które przygotowałem opiera się wyłącznie o QML oraz moją wtyczkę. Przygotowanie takiej platformówki zajęło mi około 2 dni.

  • Agata22-10-2012

    Link podany został dla chętnych do pogrania w grę lub zrobienia sobie własnej wersji z ta grafiką (linka do Twojego demka gry nie widzę) w 2 dni no to nieźle ;)

Chcę dodać komentarz