BGT de la Blastbay Studios, un scripting accesibil si facil

Diverse limbaje, programare, scripting, coduri, unelte specifice etc.
Scrie răspuns
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

cam ce s-a facut pe la acest joc daca ne poti spune.
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Ieri a publicat Philip Bennefall pe forum la Blastbay Studios "change log"-ul pentru versiunea 1.0 finala de la 0.6 beta.
In 31 decembrie va fi lansata versiunea finala 1.0 a compilatorului BGT, fiind data limita declarata acum jumatate de an, data pe care nu o poate incalca de acolo din nord, Suedia, unde se afla. :)

Suntem cativa care asteptam cu nerabdare si faptul ca a pus macar lista modificarilor in ziua de Craciun, deja inseamna un cadou. :)

Pun si eu mai jos, pentru cine a mai incercat BGT acest change log, poate este trezit interesul:

Version 1.0:
  • Updated the script interpreter to the latest version which fixes some more bugs found by users, as well as adds the following features:
    1. The ability to convert booleans to strings.
    2. Four new methods to the array called insert_at, remove_at, insert_last and remove_last.
    3. Explaining messages when failing to initialize a global variable after a compilation.
    4. Explaining messages when trying to declare variables within a switch/case statement.
    5. The ability to write floating point numbers as .42, without the leading 0.
  • Updated the ENet library to the latest version which improves bandwidth throttling of reliable packets.
  • Added a calendar object for more advanced date and time calculations.
  • Added the pack_file object to enable reading and writing pack files, which are also used by the sound object.
  • Extended the language tutorial with several new chapters as well as a section about array initialization lists (thanks Felix).
  • Added a series of comprehensive tutorials that explain how games are written in practise (thanks Felix).
  • Added support for sending synchronous HTTP GET and POST requests through two simple functions.
  • Added the http object which allows for more advanced HTTP access using an asynchronous interface, which means that any number of files/resources can be downloaded in the background from the Internet.
  • Added two functions (url_encode and url_decode) to make it easier to assemble parameters for Get and Post HTTP requests.
  • Added the generate_computer_id function.
  • Added a function to run third party executables.
  • Added several new file and directory functions (directory_create, directory_delete, directory_exists, and file_delete).
  • Added an article to the tutorials section of this documentation that explains the various methods used for game registration.
  • It is now possible to modify an individual character at a particular location in a string, just as if the string were an array.
  • Added a hash function to the engine which exposes sha256 and sha512 hash generation at present, generated in either hex or binary form.
  • Added a number of constants listed in appendix e that contain the paths of special folders on the system (thanks Liam).
  • Added the get_last_error_text function that converts the value returned by get_last_error to its corresponding textual description (thanks Damien).
  • The array object is now fully documented (thanks Damien).
  • Added the reset method for the dynamic menu include class to the documentation (thanks Lukáš).
  • Added a virtual audio window include class (thanks Damien).
  • Added the soundtrack include class which wraps the tone_synth object in a simpler interface (thanks Felix).
  • The error dialog now displays the contents of a faulty line as well as its number, rather than just the number on its own.
  • Changed the behavior of the file_exists function so that it only works with files, and added the directory_exists function instead.
  • Fixed a bug where I had accidentally made float equal to double in the engine.
  • Fixed a bug in the number_to_words function (thanks Daniel).
  • Fixed a bug in the string_trim_left function that would cause it to trim one character too little.
  • Fixed a bug in the string_contains function that would cause it to erroneously return a positive result even if a particular occurrence was not found in rare cases.
  • Fixed a mistake in the documentation for the set method in the dictionary object (thanks Damien).
  • Fixed a typo in the example for the freq_ms method in the tone_synth object (thanks Jason).
  • Updated the end user licence agreement to clarify the fact that an unlimited number of non-commercial games may also be created with the pro single version of the engine.
  • Fixed a typo in the documentation for the write method of the logger include class (thanks Michael).
  • Fixed a large number of trivial typos in the documentation.
  • Added the default start and end time values for the edge fades in the tone_synth object to the documentation (thanks Oriol).
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Un mic exemplu in BGT

Mesaj de Manu »

Mai pun un exemplu mic pentru cei care vor dori sa invete in viitor BGT.
Este avantajos acest limbaj pentru ca este un high level language, foarte usor de invatat, se compileaza prin Angel Script in C++, deci ofera o viteza mare de rulare, tot ce trebuie pentru speed action games.

Eram la capitolul de verificat obiectul HTTP, asa ca am facut un scriptulet care preia sursa unei pagini web, o salveaza pe hard pe C intr-un folder numit SiteSource si apoi o deschide in Notepad.

Dupa cod am pus si un link catre varianta compilata.

Cod: Selectaţi tot

void main()
{
//verificam daca folderul SiteSource nu exista pe C, sa il cream.
if(!directory_exists("c\\SiteSource")) directory_create("c:\\SiteSource");
//Instantiem un obiect http la care ne vom referi prin download.
http download;
string address=input_box("Adresa web", "Scrieti ca in exemplul: www.pontes.ro sau www.pontes.ro/portal/");
//instantiem un obiect timer cu numele downloadTime.
timer downloadTime;
//cream variabila de tip string cu numele body, pe care o umplem prin metoda get a clasei http.
string body=download.get("http://"+address);
//verificam daca e vreo eroare.
if(get_last_error()!=0)
{
alert("Eroare", "A avut loc o eroare.\r\nDescriere: " + body + "");
}
else //daca nu e vreo eroare.
{
//Looping pana proprietatea progress a clasei http este adevarata.
while(download.progress)
{
//se tot umple variabila body.
body+=download.request();
wait(5);
}
//cream obiectul file pentru a salva pagina pe hard in folderul SiteSource.
file fileToSave;
fileToSave.open("c://SiteSource//"+address+".html", "w");
fileToSave.write(body);
fileToSave.close();
alert("Succes", "Sursa a fost salvata pe hard.\nLungime sursa: "+body.length()+"\nTimp de download si salvare: "+downloadTime.elapsed+" milisecunde.");
}
//ii dam un run in notepad fisierului salvat pe hard..
run("c:\\windows\\notepad.exe", "c:\\SiteSource\\"+address+".html", false, false);
//inchidem tot ce tine de micul script in BGT.
exit();
}
Download SiteSource.exe
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

am incercat sa fac de unul singur ceea ce mi-ati aratat dumneavoastra cu cateva post-uri mai sus, script-ul acela cu muzica, si mi-a reusit!
as mai vrea sugestii ce as mai putea incerca cu scriptul asta, asa pentru inceput.
multumesc.
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Important e sa intelegi principiile, modalitatile sau ce or fi ele.
Ar trebui sa incerci niste decizii cu if-uri.
Sa pui posibilitati de genul:
Daca se apasa F2 sa spuna "Salut", daca se apasa F3 sa spuna "Ce mai faci" etc.
Apoi sa te joci putin cu ceva variabila, de exemplu:
Declari la inceput, inainte de "void main()" un:
string nume;
Apoi in "void main()" sa spui, in acel while(true) care exista deja in scriptul tau:

Cod: Selectaţi tot

if(key_pressed(KEY_F5))
{
nume=input_box("Numele tau", "Scrie numele tau!");
alert("Nume", "Numele tau este: "+nume);
}
Incearca toate acestea si vezi ce nu iese si intreaba aici, eventual pune codul la corectat.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

salut.
am incercat sa fac un mic scriptulet, dar undeva se tot incapataneaza sa nu mearga.
imi da urmatoarele erori.
File: D:\bgt folder\memory train.bgt
On line: 1 (1)
Information: Compiling void main()

File: D:\bgt folder\memory train.bgt
On line: 16 (1)
Line: game();
Error: No matching signatures to 'game()'

pun mai jos codul.

void main()
{
show_game_window("memory train");
sound menu;
menu.stream("menu.ogg");
menu.volume=0;
menu.play_looped();
while (true)
{
wait (5);
if(key_pressed(KEY_S))
{
exit();
}
if(key_pressed(KEY_L))
game();
{
show_game_window("game");
alert("welcome", "welcome to fly simulator, by romania studio");
}
}
}
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Eroarea este la if-ul care decide apasarea tastei L.
Acolo a fost pusa fix dupa if o functie game() care nu apare mai jos definita.
Am corectat, am pus acolada inainte de game, apoi mai jos am facut functia game care afiseaza un mesaj si schimba numele ferestrei in "Game", asa cum parea ca se doreste.

Cod corectat:

Cod: Selectaţi tot

void main() 
{ 
show_game_window("memory train"); 
sound menu; 
menu.stream("menu.ogg"); 
menu.volume=0; 
menu.play_looped(); 
while(true) 
{ 
wait(5); 
if(key_pressed(KEY_S)) 
{ 
exit(); 
} 
if(key_pressed(KEY_L)) 
{
game(); 
} 
} 
}

void game()
{ 
show_game_window("game"); 
alert("welcome", "welcome to fly simulator, by romania studio"); 
}
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

multumesc de ajutor.
ma sfatuieste si pe mine cineva ce ar trebui sa fac, ca atunci cand apas tasta l, sa se intrerupamuzica care era, si sa inceapa alta?
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Daca te folosesti de acelasi obiect sunet, nu trebuie decat sa opresti sunetul, sa pui in stream alt fisier si apoi sa ii dai play_looped().
Deci, in cazul de fata ai obiectul sound numit menu.
In stadiul actual, pur si simplu sa schimbi doar fisierul care canta, faci in felul urmator:
In functia game(), inainte de alert opresti sunetul:
menu.stop();
Incarci in stream al fisier:
menu.stream("fundal.wav");
Ii dai drumul sa cante la nesfarsit:
menu.play_looped();

In felul acesta tot timpul la apasarea tastei L va reincepe de la 0 redarea sunetului.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

dar am mai vazut in loc de stream, pus si luad.
asta cand se foloseste?
Stefan
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

File: D:\bgt folder\fly simulator.bgt
On line: 22 (1)
Information: Compiling void game()

File: D:\bgt folder\fly simulator.bgt
On line: 25 (7)
Line: sound menu.stop();
Error: Expected '('

o eroare care nu am putut nici in ruptul capului sa o corectez.
as vrea stiu ce se intampla, ca sincer chiar mi-am piredut rabdarea de cand ma chinui sa o corectez.
pun mai jos codul.

void main()
{
show_game_window("memory train");
sound menu;
menu.stream("menu.ogg");
menu.volume=0;
menu.play_looped();
while(true)
{
wait(5);
if(key_pressed(KEY_S))
{
exit();
}
if(key_pressed(KEY_L))
{
game();
}
}
}

void game()
{
show_game_window("game");
sound menu.stop();
sound game;
game.stream("game.ogg");
game.volume=-4;
game.play_looped();
}
o zi buna,
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Diferenta intre metoda streams i metoda load este ca, cea din urma incarca sunetul in ram, iar stream da play la fisier direct de pe hard, luand cate putin din zbor. Load este o metoda utilizata cand se lucreaza cu sunete din timpul jocului, gen arme, diferite ding-uri etc, cele care trebuie sa fie disponibile cat mai instant. Stream e o metoda buna a clasei sound cand se folosesc sunete lungi, gen fundaluri.

In legatura cu eroarea, ea este pentru ca la un moment dat se utilizeaza randul:
sound menu.stop();
Ai vrut sa opresti fundalul de meniu si sa il pornesti pe cel din timpul jocului.
Cand vrei sa lucrezi cu variabile sau obiecte care sa fie disponibile in mai multe functii, trebuie sa le definesti global, adica in afara functiilor.
Pentru a corecta scriptul de mai sus, pune randul:
sound menu; la inceputul fisierului, inainte de void main();
Obiectul sound menu va fi astfel valabil si in main() si in game().
In functia game() trebuie sa opresti fundalul din meniu scriind doar menu.stop(), fara sa mai pui si sound in fata.

Incearca si spune daca a mers.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

am incercat, dar cand vreau sa apas l, nu imi porneste muzica din joc ci imi ramane tot aia din meniu.
pun mai jos codul la corectat.
sound menu;
void main()
{
show_game_window("memory train");
sound menu;
menu.stream("menu.ogg");
menu.volume=0;
menu.play_looped();
while(true)
{
wait(5);
if(key_pressed(KEY_S))
{
exit();
}
if(key_pressed(KEY_L))
{
game();
}
}
}

void game()
{
show_game_window("game");
menu.stop();
sound game;
game.stream("game.ogg");
game.volume=-4;
game.play_looped();
}
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Ai definit global sound menu, dar l-ai lasat apoi si local in void main().
Sterge din void main() sound menu.
Acum pasul ar fi sa definesti global si sound game, apoi la o tasta sa porneasca fudnalul de joc, la alta sa porneasca cel de meniu, sa fie ca si cum ai intra in joc si ai iesi apoi in meniu iar.
Cu menu.stop() sau game.stop() opresti sunetele, poti in void main() sa le pui stream pe fisierele aferente.
Apoi la taste folosesti KEY_L pentru menu.stop(), iar KEY_M sa fie game.stop().
Cand e game.stop() sa fie sub menu.play_looped(), iar cand e menu.stop() sa fie game.play_looped().
menu.stream() si game.stream(), cat si menu.volume si game.volume le poti hotari pe primele randuri din void main(), ele ramanand apoi setate in viitor, atata vreme cat nu folosesti menu.close() sau game.close(), ci doar stop().
Cand reusesti asta, fa ca cu doua taste sa creasca volumul si sa scada. Daca nu te descurci, te ajut eu aici.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

as avea 2 intrebari.
1. cum pot crea functia aceea in care cu ajutorul a doua taste sa creasca volumul?
2. daca incarcam un sunet cu luad cum procedam? mai scriem play_looped si restul?
Stefan
Scrie răspuns