-
Notifications
You must be signed in to change notification settings - Fork 0
Skrypty Tutorial
Każdy szanujący się silnik do gier ma system sktyptów. Ma go po to żeby dało się wygodnie tworzyć grę niezależnie od silnika, nie musząc odwoływać się do żadnych niskopoziomowych systemowych wartości oraz by łatwiej iterować nad pomysłami.
Każdy skrypt ma funkcje takie jak:
-
update()
- tutaj wpisujemy kod, który ma się wydarzyć w każdej klatce gry -
start()
- kod, który wykona się raz - tuż przed pierwszym update'em -
on_destroy()
- kod który wykona się raz - gdy obiekt klasy skryptu zostanie zniszczony de facto destruktor klasy -
on_instantiate()
- kod który wykona się raz - gdy zostanie stworzony obiekt skryptu de facto konstruktor klasy -
on_collision_enter(collision_info)
- wykona się raz gdy skojarzony ze skryptem collider wejdzie w kolizję po raz pierwszy -
on_collision_stay(collision_info)
- wykonywany w każdej klatce, w której skojarzony ze skryptem collider koliduje z innym colliderem -
on_collision_exit()
- wiadomo
Skrypt nie musi implementować ich wszystkich.
Pierwsze 2 dziedziczysz ze scripts_system::script, zamiast on_instantiate() i on_destroy() korzystasz z konstruktora i destruktora, z ostatnich 3 skorzystasz tworząc pole typu physics::collider i subskrybując na jego listy.
Piszesz dowolną klasę w namespace game:
my_script.h
#pragma once
#include "scripts_system.h"
namespace game {
class my_script : public scripts_system::script {
public:
my_script(); // konstruktor - on_instantiate(), może mieć argumenty wejściowe
void start() override;
void update() override;
~my_script(); // destruktor - on_destroy()
// other public members
private:
// private members
};
}
my_script.cpp
#include "my_script.h"
void game::my_script::my_script() {
// this code will execute once on creation of a my_script object
}
void game::my_script::start() {
// this code will execute once just before game loop
}
void game::my_script::update() {
// this code will execute once every program step
}
void game::my_script::~my_script() {
// this code will execute once upon deletion of this object
}
// other members definitions
W pliku scene_loader.cpp w void scene_loader::load_scene(const std::string& file_name)
wpisz obsługę tworzenia instancji skryptu:
if (entry["type"] == "my_script") { scripts_system::scripts.push_back(new game::my_script()); }
I wpisz do example_scene.json do tablicy "scripts" instancję skryptu
{
"scripts": [
// ...
{
"type": "my_script",
"name": "script1",
"args": {
}
},
// ...
]
}
Skrypty są po to by tworzyć:
- przeciwników
- interaktywne elementy otoczenia
Tworzysz jedną klasę - wzór i wiele instancji - jest wielu przeciwników na planszy, którzy są tego samego typu.
- skrypty zarządzające grą - pauzowanie, przechodzenie do main menu, wybór poziomu, zapisywanie gry
Skrypty zarządzające wymagają jednej i dokładnie jednej instancji
Jak korzystać w skryptach skorzystać z funkcjonalności silnika (input_system, fizyka, renderer itd.)
Poniżej lista systemów, z których można skorzystać. Na stronie każdego z nich znajdują się instrukcje i przykłady wykorzystania.
- scene_loader::load_scene()
- scene_loader::un_load_scene()
- time_system::delta_time
- time_system::time_scale
- time_system::timer
- input_system::key_held
- input_system::key_bind
- input_system::axis
- input_system::double_axis
- input_system::triple_axis
- physics::colliders::aabb
- physics::colliders::sphere
- physics::colliders::plane
- physics::rigidbody
- ui_system::ui_image
- ui_system::ui_text
- engine
- scripts_system
- scene_loader
- time_system
-
input_system
- input_system::key_held
- input_system::key_events
- input_system::subscribe() (deprecated)
- input_system::axis_state()
- input_system::key_bind
- input_system::axis
- input_system::double_axis
- input_system::triple_axis
- input_system::axis2
- input_system::double_axis2
- input_system::triple_axis2
- input_system::axis-choice
- renderer
- physics
- ui_system
- game