Pagina 3 din 18
Scris: 04 Aug 2010, 13:38
de Manu
Pentru volum ar fi cel mai bine sa creezi o variabila numita, sa zicem "vol".
Deci, la inceputul scriptului declari variabila:
int vol=-5;
Dupa ce ai incarcat sunetul prin Load sau Stream, da-i volumul initial:
ambience.volume=vol;
dupa care ii dai play-looped().
Urmeaz aacum acel while care verifica permanent daca se intampla ceva, in cazul nostru daca se apasa vreo tasta.
Ai cele doua If-uri cum le-ai stabilit.
Pentru tasta la care vrei sa se dea mai tare cu 1 faci o incrementare a variabilei vol:
vol++;
iar pe randul urmator pui iar:
ambience.volume=vol;
Practic la apasarea tastei se creste variabila vol cu 1, dupa care se reactualizeaza proprietatea volume a obiectului ambience de tip sound.
Procedezi la fel pentru a da mai incet, faci cu minus la variabila vol.
Pune eventual si cate un wait(5); intre incrementare/decrementare si actualizare, astfel nu se va intampla prea repede, adica sa sara brusc tare sau incet.
Normal aici mai trebuie setata si o piedica de maxim si minim, altfel e riscul ca variabila vol sa urce sau sa coboare foarte mult, dar despre asta o sa mai vorbim.
Sa spui daca a reusit cu volumul.
Scris: 04 Aug 2010, 14:22
de Valentin
nu a mers,,,.. poate ca iar am gresit ceva.. uitati scriptul...
int vol=-5;
sound ambience;
void main()
{
show_game_window("vali");
wait(5);
alert("hello", "you are about to play some sounds....");
ambience.stream("ambience.ogg");
ambience.play_looped();
while(true)
if(key_pressed(KEY_SPACE))
{
exit();
}
ambience.volume=vol;
while(true)
if(key_pressed(KEY_F))
{
vol++;
}
ambience.volume=vol;
wait(5);
while(true)
if(key_pressed(KEY_G))
{
vol--;
}
ambience.volume=vol;
wait(5);
}
oare e bine daca am pus cate un while(true) inainte de fiecare if? am pus si play_looped si tot nu merge. si cu pauza cand vreau eu am incercat astfel...
while(true)
if(key_pressed)KEY_ESCAPE))
{
break;
}
si nu a mers de si scriptu pornea... va multumesc..
Scris: 04 Aug 2010, 17:39
de Manu
Deci sa luam partea de volum.
Inca o data, trebuie doar un While in cazul de fata.
Iar in acest While sa fie trei If-uri, unul cu inchiderea la apasarea spatiului, iar celelalte doua pentru mai tare si pentru mai incet.
In fiecare din ultimele doua If-uri trebuie incrementarea sau decrementarea, urmate de wait(50); si ambience.volume=vol;
Daca nu iti reuseste, pun eu codul care si merge.
Scris: 04 Aug 2010, 19:59
de Valentin
mi-am muncit creierii toata ziua cu scriptul asta si am facut cred eu tot ce mi-ati zis si tot nu reusesc.... dau paste aici la cod si va rog sa imi explicati ce am gresit..
int vol=-6;
sound ambience;
void main()
{
show_game_window("vali");
wait(5);
alert("hello", "you are about to play some sounds....");
ambience.stream("ambience.ogg");
ambience.play_looped();
ambience.volume=vol;
while(true)
if(key_pressed(KEY_SPACE))
{
exit();
}
if(key_pressed(KEY_F))
{
vol++;
}
wait(5);
ambience.volume=vol;
if(key_pressed(KEY_G))
{
vol--;
}
wait(5);
ambience.volume=vol;
}
va multumesc.. si va rog sa ma corectati..
Scris: 04 Aug 2010, 23:26
de Manu
Vai, cred ca m-am chinuit o ora sa gasesc de ce nu merge, din moment ce eu am facut in Pontes Hits treaba asta si a mers din prima.
Problema era o omitere de-a ta pe care nici cum nu am observat-o, dar nici interpretorul nu a vazut greseala, o sa ii semnalez lui Philip Bennefall ce se intampla.
Deci, tu ai facut aproape bine, doar ca in If-uri trebuia sa bagi si wait(5) si ambience.volume=vol; asta pentru ca sa se actualizeze volumul doar daca apesi tu tastele setate.
Bun, ar fi mers si cum ai facut tu, doar ca si while trebuie sa fie inceput si sfarsit prin acolade. Deci, intre randul while(true) si randul if(key_pressed(KEY_SPACE)) trebuie acolada deschisa, iar dupa acolada inchisa care sfarseste al treilea If, cel cu volumul mai incet, trebuie sa inchizi acolada deschisa pentru while. Dupa aceste doua acolade mai intervine si acolada inchisa care inchide functia void main().
Pun mai jos codul care la mine merge, dar inainte o sa fac o specificare:
In stilul actual, variabila vol se incrementeaza sau decrementeaza fara nici o piedica, practic daca tu tot dai litera g de pe tastatura vei ajunge la volum minim, adica minus 100, dar variabila poate merge in jos oricat, pana la minus un milion sa zicem. Atunci, cand vrei sa dai mai tare, trebuie sa urci cu f iar pana la mai mare de minus 100 ca sa inceapa sa creasca cu adevarat volumul sunetului.
Deci, ar trebui acum sa gasesti o metoda, ar fi doua convenabile pe baza de if, care sa stopeze la 0 cand dai g si la minus 100 cand dai f. Zero este volumul normal al fisierului WAV sau OGG.
Codul corect:
int vol=-6;
sound ambience;
void main()
{
show_game_window("vali");
wait(5);
alert("Hello!", "You are about to play some sounds");
ambience.stream("ambience.ogg");
ambience.play_looped();
ambience.volume=vol;
while(true)
{
if(key_pressed(KEY_SPACE))
{
exit();
}
if(key_pressed(KEY_F))
{
vol++;
wait(5);
ambience.volume=vol;
}
if(key_pressed(KEY_G))
{
vol--;
wait(5);
ambience.volume=vol;
}
wait(5);
}
}
Am pus un wait(5) inainte de inchiderea penultimei acolade, mai precis inainte de inchiderea while-ului, astfel incat acea verificare repetitiva sa nu solicite procesorul permanent la 100%. Astfel este o pauza imperceptibila de 5 milisecunde la fiecare actiune din while.
Scris: 05 Aug 2010, 10:26
de Andreea Neagu
Faptul ca nu a gasit acoladele lipsa nu e o eroare de interpretor, e modul normal de functionare. Din cate tin minte, asa merge si compilatorul Turbo C, pe care probabil s-au bazat la dezvoltare.
In general, in programare e o problema de bune practici sa marchezi inceputul si sfarsitul unei instructiuni, fie cu acolade in limbajele bazate pe C/C++, fie cu end in cele bazate pe Pascal.
Scris: 05 Aug 2010, 13:04
de Manu
In ce sens e un mod normal de comportare?
Normal trebuie puse cele doua acolade pentru a deschide while si pentru a-l inchide.
Aici Vali le-a omis, dar nu a fost semnalata nici o eroare, scriptuletul a pornit cantecelul, doar ca nu lua in considerare din while decat primul "if", cel cu Space. Deci inchidea totul la apasarea Space, dar pentru tasta "f" sau "g" nu se intampla nimic, nu isi dadea seama ca sunt apasate.
Poate nu m-am exprimat bine in postul anterior, dar asta ziceam ca ar fi o eroare prin faptul ca nu a semnalat el o eroare si a incercat sa ruleze scriptul, desi nu erau pusi delimitatorii, in mod normal BGT e facut sa arate unde lipseste ceva, o paranteza, un ";" (punct si virgula) etc.
Am citit ca pentru interpretor se bazeaza pe un proiect numit
AngelScript. Mai departe... nu am mai citit pe ce se bazeaza acela...
Scris: 05 Aug 2010, 13:22
de Andreea Neagu
Mie mi s-a parut asemanator cu Turbo C ca limbaj, si presupun ca si compilatorul tot asa ceva are la inceputuri.
Ce se intampla acolo e asa:
while (true) - adica in continuu, fiindca aceasta conditie e mereu respectata
if(ceva) fa cutare chestie
if(altceva) - aici nu se mai ajunge: fara acolade un compilator pentru C intelege ca doar primul if tine de while si ramane permanent in bucla while-ului.
Pentru compilatoarele de C este un comportament normal sa nu identifice acoladele, deoarece lipsa lor nu este o eroare de sintaxa - este OK sa nu le pui daca in while/for/if exista doar o singura instructiune sau operatie. Acoladele intervin in cazul existentei unor operatii multiple in aceeasi instructiune.
Practic, in C si C++ un cod de genul
este perfect corect, compilatorul considerand ca primul rand de dupa while tine de aceasta instructiune, iar al doilea nu. Astfel la rulare vom avea (explic si pt Vali, ca sa vada rolul acoladei)
x=3
y=10
este 3 < 5 ? da, deci intra in while, se efectueaza x++ si il face pe x 4. y ramane 10, inca nu s-a ajuns la y++;
se intoarce la verificarea conditiei. 4 < 5 deci x creste la 5
remarcati ca tot nu s-a ajuns la cresterea lui y, acesta a ramas tot 10
iar verifica daca x < 5. cum 5 nu e mai mic decat 5, nu se mai intra in while, x ramane 5 si abia acum creste y cu 1. Astfel, la sfarsitul rularii avem x = 5 si y = 11.
Daca am fi scris:
s-ar fi intamplat asa:
x=3
y=10
este 3 < 5? da. intra in while, x devine 4 si y devine 11
este 4 < 5? da. intra in while, x devine 5 si y devine 12
este 5 < 5? nu, deci nu mai intra in while. La final, avem x = 5 si y = 12.
Scris: 05 Aug 2010, 16:54
de Manu
Ai dreptate, chiar inainte de a intra pe forum am vazut si eu acest amanunt.
Deci fara acolade se ia doar primul Statement.
Se vede ca nu am experiente anterioare decat de JAWS Scripting unde fara sa inchizi un while sau un if nu merge nimic.
Aici fiindca prima treaba era if-ul cu apasarea spatiului, "programul" se inchidea la apasarea acestuia, restul nu mai erau calculate ca existand in while..
Scris: 05 Aug 2010, 20:48
de Valentin
buna seara... iar eu cu scriptul meu mereu imbunatatit... m-am gandit eu la o metoda de stopare a nivelului pana la care volumul ajunge... si dupa mintea mea ar trebui sa mearga... dar nu merge... v-asi ruga sa ma corectati...
int vol=-6;
sound ambience;
void main()
{
show_game_window("vali");
wait(5);
alert("Hello!", "You are about to play some sounds");
ambience.stream("ambience.ogg");
ambience.play_looped();
ambience.volume=vol;
while(true)
{
if(key_pressed(KEY_SPACE))
{
exit();
}
if(key_pressed(KEY_F))
{
vol++;
wait(5);
ambience.volume=vol;
}
if(key_pressed(KEY_G))
{
vol--;
wait(5);
ambience.volume=vol;
}
wait(5);
}
while(key_pressed(KEY_G)==true)
{
if(vol==-7)
{
vol=-7;
}
}
while(key_pressed(KEY_F)==true)
{
if(vol==0)
{
vol=0;
}
}
}
Scris: 05 Aug 2010, 21:05
de Andreea Neagu
Salut,
La cele 2 whileuri pentru key_pressed nu se mai ajunge, fiindca din whileul principal practic nu se iese niciodata.
while(conditie) executa inseamna "cat timp conditia este indeplinita, executa". Conditia din whileul nostru, adica while(true) e indeplinita tot timpul, atat cat programul ruleaza.
Tu ai nevoie ca programul sa-ti "capteze" si sa-ti analizeze apasarile de taste pe tot parcursul "jocului", ca sa-i zic asa. De aceea folosesti acest while(true). Orice pui in void main() sau in orice alta functie dupa while(true) nu va mai fi vazut fiindca nu se va mai ajunge acolo.
O solutie propusa de mine strict pe baza de algoritm, deci netestata, ar fi cea de mai jos.
Cod: Selectaţi tot
int vol=-6;
sound ambience;
void main()
{
show_game_window("vali");
wait(5);
alert("Hello!", "You are about to play some sounds");
ambience.stream("ambience.ogg");
ambience.play_looped();
ambience.volume=vol;
while(true)
{
if(key_pressed(KEY_SPACE))
{
exit();
}
if(key_pressed(KEY_F))
{
if(vol<0)
{
vol++;
}
wait(5);
ambience.volume=vol;
}
if(key_pressed(KEY_G))
{
if(vol>-100)
{
vol--;
}
wait(5);
ambience.volume=vol;
}
wait(5);
}
}
PS:
Singurul caz in care se poate ajunge la o instructiune de dupa un while(true) este cel in care in acest while ai pus vreun break; care sa "sparga" instructiunea si sa iasa din bucla.
Scris: 05 Aug 2010, 22:40
de Valentin
am reusit intre timp si chestia cu pauza... dar nu am reusit ca de ex cand apas pe enter sa se puna pauza si cand apas iar sa porneasca sunetul din nou... am reusit sa pornesc sunetul doar cu o alta tasta... v-asi ruga daca puteti sa imi corectati scriptul si sa faceti ca de pe enter sa si porneasca sunetul....
int vol=-6;
sound ambience;
void main()
{
show_game_window("vali");
wait(5);
alert("Hello!", "You are about to play some sounds");
ambience.stream("ambience.ogg");
ambience.play_looped();
ambience.volume=vol;
while(true)
{
if(key_pressed(KEY_SPACE))
{
exit();
}
if(key_pressed(KEY_F))
{
if(vol<0>-15)
{
vol--;
}
wait(5);
ambience.volume=vol;
}
wait(5);
if(key_pressed(KEY_RETURN))
{
ambience.stop();
}
if(key_pressed(KEY_W))
{
ambience.play_looped();
}
}
}
ps.. chestia cu volumul merge foarte bine. multumesc... si ati putea va rog sa imi dati un exemplu de cum ar trebui sa fac de exemplu ca sappy sa vorbeasca ceva?
Scris: 05 Aug 2010, 23:09
de Manu
Vin si eu cu o propunere pentru stoparea volumului la un anume nivel, a doua la care ma gandeam pe baza de if, prima e cea propusa de Andreea.
Ca sa nu mai avem un if in plus, eu zic ca e mai simplu ca la conditia daca se apasa F sa fie si daca vol<0.
Asadar::
if{(key_pressed(KEY_F))&&{vol<0}}
Dublu "and" inseamna "si daca", tradus:
Daca se apasa F si daca volumul e mai mic 0, atunci:
Da volumul mai tare;
O sa vin eventual putin mai tarziu cu codul pentru pauza.
Scris: 05 Aug 2010, 23:35
de Andreea Neagu
Voi prelucra direct codul tau, Vali, tot fara a-l testa, fiindca nu-mi permite timpul.
Iti voi prezenta 2 metode: una bazata pe o verificare daca un numar e par sau impar si una pe verificare daca un numar e egal cu 1 sau cu 0.
Voi crea o variabila numita flag, care sa imi spuna de cate ori s-a apasat pe enter. Acest flag va porni cu valoarea 0 si va creste cu 1 la fiecare apasare a lui enter. De cate ori flag va fi numar par, vom opri sunetul, iar cand va fi impar il vom reporni.
Asadar, direct pe codul tau:
Cod: Selectaţi tot
int vol=-6;
int flag=0;
sound ambience;
void main()
{
show_game_window("vali");
wait(5);
alert("Hello!", "You are about to play some sounds");
ambience.stream("ambience.ogg");
ambience.play_looped();
ambience.volume=vol;
while(true)
{
if(key_pressed(KEY_SPACE))
{
exit();
}
if(key_pressed(KEY_F))
{
if(vol<0>-15)
{
vol--;
}
wait(5);
ambience.volume=vol;
}
wait(5);
if((key_pressed(KEY_RETURN))&&(flag%2==0))
{
ambience.stop();
}
if((key_pressed(KEY_RETURN))&&(flag%2==1))
{
ambience.play_looped();
}
flag++;
}
}
}
Sau, o alta varianta, daca nu vrei sa te joci cu par-impar ci cu 1 si 0 sau true si false:
Cod: Selectaţi tot
int flag=0;
...
if((key_pressed(KEY_RETURN))&&(flag==0))
{
ambience.stop();
flag=1;
}
if((key_pressed(KEY_RETURN))&&(flag==1))
{
ambience.play_looped();
flag=0;
}
...
Dupa cum vezi, ti-am lasat metoda cea mai draguta, cea cu 1 si 0, la sfarsit. Totusi, am vrut sa-ti arat si smecheria cu par-impar fiindca la anumite tipuri de jocuri vei avea nevoie de ea.
Desigur ca ma puteam juca si cu variabile booleene, cu valori true si false in locul exemplului cu 1 si 0. Alegerea iti apartine.
Daca BGT suporta, se pot folosi si anumite contrageri din c++, adica !flag pentru flag==0 si flag pentru flag nenul.
Scris: 06 Aug 2010, 01:18
de Manu
Imi place metoda cu par/impar, nu mi-a trecut prin cap sa o folosesc in cazuri de acest tip.
Chestia cu restul impartirii am folosit-o in alte cateva situatii. Specific pentru Vali, nu stiu daca a apucat sa foloseasca toti operatorii, semnul de procent "%" scoate restul.
De exemplu:
int variabila=7%2;
atribuie variabilei cu numele "variabila" valoarea 1, asta pentru ca restul impartirii lui 7 la 2 este 1. Astfel se deduce ca 7 e un numar impar, orice impartire a unui numar par la 2 avand restul 0.
Propun si eu o varianta mai povestita pentru a pune pe pauza un sunet:
if(ambience.playing==true)
{
ambience.pause();
}
else
{
ambience.play_looped();
}
Practic in if se verifica daca ambience este in desfasurare, astfel avand motiv sa il puna pe pauza. Else, altfel sa i se dea drumul.