Skip to content

Skrypty Tutorial

Paweł Waligóra edited this page May 23, 2024 · 15 revisions

Po co to?

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.

Jak się z tego korzysta?

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": {
      }
    },
  // ...
  ]
}

Nie wiem co mam w tym napisać

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.

Home

Git Workflow

Issues

Coding Rules

Skrypty-Tutorial

Useful resources

Game Structure

Code Structure

Clone this wiki locally