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 »

am corectat exact cum mi-ati spus.
cat despre eroare, este aceeasi.
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Nu cred.
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 »

o, ba da.
am facut exact cum mi-ati zis:
in loc de luad, load, si in loc de pressed_key, key_pressed.
nu stiu mai mult de atat.
Stefan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Atunci trimite fisierul tau pe mail sa il pot corecta, altceva nu stiu ce sa zic, e greu de corectat un cod de care spui ca nu merge, dar nu il vad in fata...
Eventual pune din nou codul corectat aici daca da erori la rulare.
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:

Despre Random in BGT

Mesaj de Manu »

Postez acest mesaj pentru ca unii s-au indoit in legatura cu sistemul de random din BGT, spunand ca in jocul de table cad cam des duble sau ca zarurile nimerite sunt putin inechitabile intre alb si negru.

Pentru inceput mentionez ca sistemul de random utilizat in BGT este Mersenne Twister, creat in 1997 de Makoto Matsumoto si Takuji Nishimura, utilizat in timp in majoritatea jocurilor.

Ca sa ma conving de uniformitate, am scris cateva randuri si am facut un mic aruncator de zaruri pentru a vedea o statistica pe un esantion mare.
Explicat cat mai simplu, am facut o cutie cu 6 compartimente. Un zar este tot aruncat, iar numarul nimerit intra in compartimentul corespunzator. Zarul este aruncat de cate ori dorim, la inceput se intreaba numarul printr-un input box.

Am testat cu un milion de zaruri, iar rezultatul a fost echilibrat, toate cele 6 compartimente aveau un numar de zaruri care incepea cu 166, adica 166 de mii si ceva, cred ca numarul 1 a picat totusi cu cateva peste 167 de mii. Actiunea de aruncare a un milion de zaruri dureaza aproximativ o secunda.
Am incercat apoi cu un miliard de zaruri, actiune ce dureaza ceva, la un laptop cu un CPU la 1,6 GHZ in jur de douazeci de minute.
Aici rezultatul a fost tot uniform, toate cele 6 numere au picat de 166 de milioane si ceva de ori.

La linkul urmator pun fisierul executabil, poate are cineva chef sa se joace. Nu trebuie decat pornit, scris cate zaruri sa fie aruncate si apoi apare rezultatul intr-un mesaj cu Ok si intr-un fisier numit "Random_Results.txt" gasibil in folderul de unde a fost lansat executabilul.
Random_Statistics.exe

Mai jos este si codul sursa pentru acest simplu aruncator de zaruri:

Cod: Selectaţi tot

void main()
{
show_game_window("Random Statistics");
wait(5);
//un input box care va decide cate zaruri sa fie aruncate,
//variabila se va numi limit:
int limit=string_to_number(input_box("Limit", "How many dice to be rolled?"));
//cream un cronometru sa vedem cat dureaza aruncarea cu zarurile:
timer t;
//cream un array cu 6 variabile,

int[] result(6);
//o bucla care va atribui 0 pentru fiecare dintre cele 6 variabile result din array:
for(int x=0; x<6; x++)
{
result[x]=0;
}
//cream un zar de tip integer:
int die;
//restartam cronometrul pentru a incepe de la 0:
t.restart();
//aruncam zarul intr-o bucla pana ajunge la numarul limit decis in input box:
for(int x=0; x<limit; x++)
{
//random de la 1 la 6:
die=random(1, 6);
//inseram zarul nimerit in lacasul corespunzator din array,
//o incrementare a valorii variabilei corespunzatoare, zarul minus 1:
result[die-1]++;
} //end for.

//salvam rezultatele intr-un fisier numit Random_Results.txt::
file f;
//fisierul va fi gasit in acelasi folder unde este executat aruncatorul de zar:
f.open("Random_Results.txt", "w");
//cream un string care va contine rezultatele:
string res="";
//intr-o alta bucla stabilim stringul in asa fel incat sa aiba pe randuri diferite fiecare zar, liniuta si de cate ori a picat:
for(int x=0; x<6; x++)
{
int sdie=x+1;
res+="\r\n"+sdie+" - "+result[x];
} //end for.
f.write(res);
f.close();
//afisam si intr-un alert durata si rezultatele:
alert("Results", "Time elapsed: "+t.elapsed+" miliseconds."+res);
//scoatem totul din ram:
exit();
}
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Allx Cucu
Sergent
Mesaje: 48
Membru din: 30 Mai 2010, 08:33
Localitate: Bucuresti
Contact:

Mesaj de Allx Cucu »

Buna dimineata
ieri m-am hotarat si eu sa ma "joc" in acest limbaj de programare.
Si ma descurc destul de bine pana acum
Am inceput cu un joculet in care trebue fixat sunetul pe mijloc si apasat sageata sus.
Cu tasta "s" se intra in joc.
Codul ruleaza fara erori
Il pun mai jos pentru pareri

Cod: Selectaţi tot

sound menu; 
sound game;
int scor=0;
void main() 
{ 
show_game_window("Shooter"); 
menu.stream("fundal.wav"); 
menu.volume=-20; 
menu.play_looped(); 
while(true) 
{ 
wait(5); 
if(key_pressed(KEY_Q)) 
{ 
exit(); 
} 
if(key_pressed(KEY_S)) 
{ 
games(); 
} 
} 
} 
void games() 
{ 
show_game_window("Shooter"); 
sound tintit;
tintit.load("arma.wav");
game.load("boing.wav"); 
game.volume=-4;
game.play_looped(); 
game.pan=random(-20,20);
while(true)
{
wait(5);
if(key_pressed(KEY_UP) and game.pan==0)
{
tintit.play();
scor=scor+1;
game.pan=random(-20,20);
}
if(scor==3)
{
alert("Succes"," Joc terminat");
exit();
}
if(key_pressed(KEY_Z))
{
game.volume=game.volume-2; 
}
if(key_pressed(KEY_A))
{
game.volume=game.volume+2; 
}
if(key_pressed(KEY_LEFT))
{
game.pan=game.pan-1;
}
if(key_pressed(KEY_RIGHT))
{
game.pan=game.pan+1;
}
if(key_pressed(KEY_M))
{
game.stop();
main();
}
if(key_pressed(KEY_Q))
{
exit();
}
}
}
Sf. cod.
In folderul unde se executa codul trebue sa existe trei fisiere audio: "boing.wav", "fundal.wav" si "arma.wav".
Cu tasta "s" se intra in joculet si cu tasta "q" se inchide jocul.
(Informati despre fisierele audio utilizate si despre taste am pus pentru cei care nu stiu sa citeasca codul si eventual il vor copia pentru a se juca cu el).
Astept pareri, eventuale corecti pe unde se considera ca e nevoe.
Si vreau sa intreb cum pot face un meniu verbalizat cu sapi5 la joc de unde sa se poata da startul , merge la o salvare etc.
Pe vitor ma gandeam sa fac un "shooter" ceva in genul "Half-Life" sau "Counter-Strike":) dar mai am de munca pana voi putea sa creez asa ceva.
vom vedea.
_________
ALLX
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Felicitari, vad ca ai inteles destul de bine cateva conceptii de BGT / C++.
Ma bucur cand mai apare cineva prin acest topic si incearca BGT sau orice alt limbaj.
Ce ai scris e chiar ok, nu apar greseli de cod sau asa ceva.

Ca sugestii neobligatorii pentru codul de mai sus:
Cand faci scor=scor+1 poti scrie mai scurt scor++, adica sa folosesti operatorul de incrementare cu 1. Daca vrei sa incrementezi cu doi, decat sa scrii scor=scor+2, e mai scurt sa scrii scor+=2.
Cand mergi stanga dreapta, cred ca ar fi bine sa ii pui si limitele, de la minus 20 la plus 20. Acest lucru il faci simplu cu un if. De exemplu la randul de mers spre stanga, ii spui:
if(game.pan<20) game.pan=game.pan-1;
mai poti pe randul urmator adauga si un perete
else
{
perete.pan=-20;
perete.play();
}
Sunetul cu peretele se presupune ca l-ai incarcat undeva in afara while-ului. Inainte de play, acel perete a fost facut sa se auda la extrema stanga.

Voi reveni cu meniul, depinde de care vrei, cel utilizat in BGT sau unul creat manual.
Celd in BGT este explicat si in manual, dar il pot prezenta cat de cat si eu aici, nu e complicat.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Allx Cucu
Sergent
Mesaje: 48
Membru din: 30 Mai 2010, 08:33
Localitate: Bucuresti
Contact:

Mesaj de Allx Cucu »

Am pus limitele, si pereti la margini.
In privinta meniului nu stiu ce sa spun, ce imi recomandati.
Acum ma chinui sa pun mai multe sunete pentru a fi tintite cand scorul ajunge la 3, sa nu se mai termine jocul acolo.
Si nu reusesc.
________
ALLX
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Foloseste mai bine clasa dynamic_menu inclusa de Blastbay Studios in Helper Layout.

Pun mai jos exemplu de meniu simplu din manual pe care il si comentez printre randuri:

Cod: Selectaţi tot

//trebuie intai de toate inclus fisierul care contine clasa pentru meniu:
#include "dynamic_menu.bgt"

//lucram in functi amain:
void main()
{
//trebuie inainte de toate instantiat obiectul meniu, precum la cel de sunet, il numim my_menu:
dynamic_menu my_menu;
//se stabileste o variabila care va contine in final itemul ales din meniu:
int menu_result;
//urmatorul rand spune daca se poate apasa sau nu escape pentru a iesi:
my_menu.allow_escape=true; //cu false nu se poate iesi.
//urmatorul rand spune daca se poate sari iar la inceputul meniului sau cursorul se opreste cand se ajunge pe ultimul item, ori invers pentru primul item:
my_menu.wrap=true;
//urmatoarele randuri adauga cate un item in meniu, itemii pot fi vorbiti de TTS sau fisiere wav inregistrate. Aici al doilea este pentru Sapi, primul si al treilea cu fisiere wav:
my_menu.add_item("start_game.wav");
my_menu.add_item_tts("test speakers");
my_menu.add_item("exit.wav");
//urmatorul rand va scoate rezultatul, itemul apasat si mentioneaza si ce sa se anunte cand se intra in meniu:
menu_result=my_menu.run("choose_an_option.wav", false);
//de acum sunt ifuri care vor decide in functie de itemul apasat ce sa se intample. 1 este pentru itemul 1, 2 pentru itemul 2 etc. 0 este pentru escape, deci inchidere, -1 pentru eroare:
if(menu_result==-1)
{
alert("Error", "There was an error loading the menu.");
exit();
}
if(menu_result==0)
{
alert("Option", "Escape was pressed. Exiting.");
exit();
}
if(menu_result==1)
{
alert("Option", "Option selected was start game.");
//aici se poate pune functia ta games(), cea care da drumul la joc.
}
if(menu_result==2)
{
alert("Option", "Option selected was test speakers.");
}
if(menu_result==3)
{
alert("Option", "Option selected was exit. Exiting.");
exit();
}
}
Adauga meniu la jocul tau si va incepe apoi sa se contureze putin, va parea din ce in ce mai inchegat.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Allx Cucu
Sergent
Mesaje: 48
Membru din: 30 Mai 2010, 08:33
Localitate: Bucuresti
Contact:

Mesaj de Allx Cucu »

Am luat codul de aici si lam pus in fisierul meu cu coduri in void main().
Si nu merge.
Imi apare:
Error There was an error loading the menu.
Apas ok si se inchide tot jocul.
__________
ALLX
Allx Cucu
Sergent
Mesaje: 48
Membru din: 30 Mai 2010, 08:33
Localitate: Bucuresti
Contact:

Mesaj de Allx Cucu »

S-a rezolvat.
Nu aveam fisierul "choose_an_option.wav"
In folderul unde am rulat meniul.
Va multumesc de instructiuni, opservasem si eu "Dynamic_menu" dar nu reuseam sa-l aplic.
_________
ALLX
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Nu prea e eficient sa pui codul de meniu in void main(), faci mai bine un void main_menu(), apoi poti ajunge la el oricand, de exemplu la apasarea tastei M sau Escape in timpul jocului, poate ai vrea sa apara iar meniul. Tot acolo in void main_menu() poti pune si un fundal diferit, sunet pe care sa il opresti tot timpul la inceputul functiei games().
Daca nu ai chef sa imprimi fisiere wav, utilizeaza pentru fiecare item mai bine:
my_menu.add_item_tts("Optiunea din Meniu");

Pentru partea de test speakers, ceva clasic in jocurile astea audio, poti face o chestie cu proprietatea pan a clasei sound, stanga, mijloc dreapta, in alternanta cu vocea care anunta. Ai sa zicem un sunet ding.wav, si obiectul tts_voice numit v.
Scrii atunci:

Cod: Selectaţi tot

void test_speakers()
{
sound ding;
ding.load("ding.wav");

v.speak_wait("Left");
ding.pan=-20;
ding.play_wait();

v.speak_wait("Center");
ding.pan=0;
ding.play_wait();

v.speak_wait("Right");
ding.pan=20;
ding.play_wait();

ding.close();
}
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Allx Cucu
Sergent
Mesaje: 48
Membru din: 30 Mai 2010, 08:33
Localitate: Bucuresti
Contact:

Mesaj de Allx Cucu »

Pentru meniu am creat o functie diferita
void meniu()
Pentru ca vreau sa inceapa la startul jocului un anumit sunet.
si daca lasam meniul in void main()
de fiecare data cand se revenea la meniu se reda si sunetul de inceput al jocului.
L-am facut in limba romana, eu am instalat la sapi5 o voce e-speak.
Test_speakers-ul l-am facut mai diferit de cat mi-ati aratat
cod:
void testboxe()
{
show_game_window("shooter");
sound test_boxe;
sound dreapta;
sound stanga;
test_boxe.stream("sunete/tintit.wav");
dreapta.stream("sunete/dreapta.ogg");
dreapta.volume=-6;
stanga.stream("sunete/stanga.ogg");
stanga.volume=-6;
test_boxe.pan=-20;
test_boxe.play();
stanga.pan=-20;
wait(1000);
stanga.play();
wait(1000);
test_boxe.pan=-10;
test_boxe.play();
wait(1000);
test_boxe.pan=0;
test_boxe.play();
wait(1000);
test_boxe.pan=10;
test_boxe.play();
wait(1000);
test_boxe.pan=20;
test_boxe.play();
wait(1000);
dreapta.pan=20;
dreapta.play();
wait(1000);
meniu();
}
Sf cod.
_________
ALLX
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Ai inteles bine functiile definite sau cele builtin, obiectele sound si tts, if-ul si while-ul cu tot cu wait-ul de 5 milisecunde.
Va trebui acum sa intelegi for-ul care e des utilizat in diverse imprejurari, la fel ar trebui sa te uiti peste array-uri. Daca le stii pe toate astea, nu mai depinde decat de creativitate, inventivitate si disponibilitate sa ffaci jocuri chiar complexe.
Daca e ceva greu de inteles la for sau array, pot explica eu aici cum stau lucrurile. For-ul e tot o bucla ca while, chiar poate fi inlocuit cu while, fapt care era necesar in JAWS scripting unde nu exista; array-urile sunt de fapt variabile mai multe exprimate concis, simplificand foarte mult codul, reducand uneori treaba de la munca de chinez la eficienta suedeza.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Allx Cucu
Sergent
Mesaje: 48
Membru din: 30 Mai 2010, 08:33
Localitate: Bucuresti
Contact:

Mesaj de Allx Cucu »

Stiu si for si array, destul de bine de la Pascal.
Am o intrebare: care este diferenta dintre for si while in BGT/C++?
In pascal for se folosea in loc de incrementare
exemplu: for i:=1 to 10 do instructiune;
si for il crestea pe i de la 1 la 10.
in BGT/C++ am opservat ca este: for(i=1; i<=10; i++) instructiune;
array nu am prea avut ocazia sa folosesc, m-am gandit sa folosesc in jocul la care am inceput.
Stiu ca array inseamna un numar de variabile de acelas tip.
Ma mai intereseaza cum pot verbaliza un string oarecare cu sapi5?
____
ALLX
Scrie răspuns