Pagina 7 din 18

Scris: 29 Mai 2011, 01:29
de Manu
Folosesti aceleasi metode pentru sound, doar ca incarci sunetul cu load sau cu stream.

Un exemplu cu load, cu volum si pauza ar fi urmatorul.
Dupa cod mai sunt cateva mentiuni:

Cod: SelectaĊ£i tot

//lucram doar intr-o functie main, cea care se executa implicit la rularea unui script in BGT:
void main()
{
show_game_window("Test cu sunet");
wait(5); //asteptam 5 milisecunde sa fie sigure treburile.
//declaram obiectul sound cu numele s:
sound s;
//incarcam un fisier ogg numit fundal:
s.load("fundal.ogg");
//setam volumul sunetului la minus 6, aproximativ jumatate ca intensitate din volumul standard care este 0:
s.volume=-6;
//dam play repetitiv la sunet:
s.play_looped();
//deschidem un while care sa mearga la nesfarsit, cel in care, in cazul de fata, se vor verifica tastele apasate prin if-uri:
while(true)
{
//deschidem if-ul care verifica pentru apasarea tastei q sa inchidem programelul cand ne-am saturat de fundal:
if(key_pressed(KEY_Q))
{
exit(); //functia care scoate tot ce tine de script din RAM.
} //inchidem if-ul pentru q.
//deschidem if-ul care verifica pentru cresterea volumului cu tasta punct:
if(key_pressed(KEY_PERIOD))
{
//scriem un rand in care este un if care spune ca volumul sa creasca doar pana la 0, adica atata timp cat e mai mic de 0;
//dupa if, pe acelasi rand marim volumul cu cate o unitate:
if(s.volume<0) s.volume=s.volume+1;
} //inchidem if-ul pentru punct, marire volum.
//deschidem if-ul care verifica pentru micsorarea volumului cu tasta virgula:
if(key_pressed(KEY_COMMA))
{
//scriem un rand in care este un if care spune ca volumul sa scada doar pana la -100, adica atata timp cat e mai mare de minus 100;
//dupa if, pe acelasi rand scadem volumul cu cate o unitate:
if(s.volume>-100) s.volume=s.volume-1;
} //inchidem if-ul pentru virgula, micsorare volum.
//deschidem if-ul care verifica pentru pauza si pentru reluare cu tasta spatiu:
if(key_pressed(KEY_SPACE))
{
//daca fundalul canta, se pune pe pauza:
if(s.playing) s.pause();
//altfel, sa cante repetitiv din locul in care a ramas:
else s.play_looped();
} //inchidem if-ul pentru tasta space.
//punem o asteptare de 5 milisecunde in while ca sa nu ruleze procesorul la 100%:
wait(5);
} //inchidem while-ul deschis inainte de if-uri.
} //inchidem functia main.
1. Sunt in total 3 if-uri care nu mai contin acoladele, aceasta pentru ca e vorba doar de o instructiune si nu mai sunt necesare, se poate scrie si instructiunea pe acelasi rand.
2. Volumul standard al unui fisier este 0, iar minus 100 este minimum, cand nu se mai aude nimic.

Am pus si un ZIP care contine un fundal.ogg, codul sursa BGT si un fisier compilat EXE:
Download Test cu volum si pauza pe sunet in BGT

Succes!

Scris: 09 Iul 2011, 11:00
de Stefan_Ilioaica
bun, am incercat si testul cu volumul.
ce imi mai recomandati?
ca asa singur, dupa manualul acela, nu prea ma descurc.

Scris: 09 Iul 2011, 13:50
de Manu
Eu iti pot recomanda tot felul de exercitii, dar acum ar trebui deocamdata sa mai faci tu cate ceva cu sunetul, cu lucrurile pe care l-ai inteles, astfel incat sa fii sigur ca le-ai inteles bine.
Incearca sa pornesti mai multe sunete in acelasi timp, sa fie la volume diferite si pozitionate mai la stanga, mai la dreapta etc.
Eu iti pot corecta aici codurile.

Scris: 09 Iul 2011, 14:02
de Stefan_Ilioaica
cum le pot face sa sune mai la dreapta sau mai la dreapta?
si cum le pot pune sa sune in acelas timp?

Scris: 09 Iul 2011, 17:37
de Manu
Poti crea cate obiecte sound vrei tu.
Scrii de exemplu pe trei randuri la inceput:
sound sunet1;
sound sunet2;
sound sunet3;

Apoi in cadrul functiei main, sa zicem, poti incarca pentru fiecare cate un fisier audio:
sunet1.load("melodie1.wav");
sunet2.load("melodie2.wav");
sunet3.load("melodie3.wav");

Ai in acest moment trei sunete diferite pregatite pentru a fi pornite sa cante, sa li se schimbe volumul sau pozitia stanga-dreapta.

Proprietatea pentru stanga-dreapta se numeste pan, asadar:
sunet1.pan=-20;
sunet2.pan=0;
sunet3.pan=20;
In acest moment ai pregatit primul sunet mai in stanga, al doilea la centru si pe al treilea la dreapta.
Le pornesti separat pe toate trei:
sunet1.play();
sunet2.play();
sunet3.play();

Sa nu uiti sa pui dupa acestea si un while[true] astfel incat sa nu se opreasca imediat totul:
while[true]
{
wait(5); //sa nu consume intreaga capacitate a procesorului.
if(key_pressed(KEY_S))
{
exit(); //sa se opreasca daca se apasa S de la stop.
}
} //inchidem while-ul.

Asadar, un exemplu complet ar fi combinand tot ce am scris mai sus:

Cod: SelectaĊ£i tot

sound sunet1;
sound sunet2;
sound sunet3;
void main()
{
show_game_window("Probe cu sunet");
sunet1.load("melodie1.wav");
sunet2.load("melodie2.wav");
sunet3.load("melodie3.wav");

sunet1.pan=-20;
sunet2.pan=0;
sunet3.pan=20;

sunet1.play();
sunet2.play();
sunet3.play();

while[true]
{
wait(5); //sa nu consume intreaga capacitate a procesorului.
if(key_pressed(KEY_S))
{
exit(); //sa se opreasca daca se apasa S de la stop.
} //inchidem if-ul.
} //inchidem while-ul.
} inchidem functia main.
Incearca sa vezi ce si cum, ai putea sa pui volum taste diferite pentru fiecare dintre cele trei sunete. sa dai mai tare si mai incet in parte, ca si cum ai avea trei Winamp-uri diferite pornite.

Scris: 09 Iul 2011, 23:49
de Stefan_Ilioaica
am incercat sa fac ceea ce mi-ati spus, dar undeva ceva se intampla.
pun codul mai jos, erorile nu le mai pun, ca sunt multe, si poate le constatati dumneavoastra.
iata codul mai jos:
sound sunetleft;
sound sunetcenter;
sound sunetright;
void main()
{
show_game_window("the three sounds");
sunetleft.luad("left.wav");
sunetcenter.luad("center.ogg");
sunetright.luad("right.wav");
sunetleft.pan=-20;
sunetcenter.pan=0;
sunetright.pan=+20;
sunetleft.play();
sunetcenter.play();
sunetright.play();
while (true)
{
wait(5);
if(pressed_key(KEY_Q))
{
exit();
}
}
}
as vrea sa stiu de la ce vin toate erorile astea si de ce.
multumesc

Scris: 10 Iul 2011, 00:05
de Manu
Sunt cinci erori vizibile la prima lectura a codului:
Trei erori sunt la metoda load a obiectului sound, tu ai scris luad in loc de load, deci cu "u" in loc de "o".
Ai pus acolo la pan semnul plus, nu stiu daca este ignorat, dar un numar pozitiv nu trebuie semnalat cu plus, se subintelege ca daca nu e minus este mai mare ca zero.
Functia care semnaleaza apasarea unei taste este key_pressed, nu pressed_key.
Vezi daca se rezolva acum.

Scris: 10 Iul 2011, 00:46
de Stefan_Ilioaica
bun, am rezolvat-o si pe asta.
ar mai fi ceva de facut la partea de sunet?
sau putem trece la un alt tip de exercitiu?
stiu, ceva simplu, mai pentru incepatori...

Scris: 10 Iul 2011, 15:08
de Manu
Daca nu gasesti singur exercitii... nu prea are rost, trebuie sa iti vina idei, de exemplu sa muti sunetul de la stanga la dreapta si invers cu sagetile, sa pui eventual un claxon pe tasta spatiu, o frana pe alta tasta si tot felul de astfel de lucruri, pentru acestea nefiind nevoie de nimic in plus fata de functiile deja utilizate mai sus in acest topic.

Scris: 16 Iul 2011, 20:53
de Stefan_Ilioaica
aici intervine o mica intrebare.
pentru a face ca sunetul sa se miste trebuie facuta o alta functie? sau daca apas spatiu sa se intample ceva?
aici nu prea stiu.
daca exista o cale mai scurta in afara de a face functii pentru fiecare chestie in parte, va rog sa scrieti aici.

Scris: 18 Iul 2011, 15:58
de Manu
In general e bine sa faci functii noi pentru majoritatea lucrurilor, astfel incat sa le poti folosi si in alte locuri in acelasi joc. De exemplu daca faci o functie sau o clasa pentru o masina intr-un joc, sigur ai nevoie de aceasta in multe locuri si atunci codul nu il repeti din nou peste tot. Un alt exemplu ar fi din jocul de table: am creat sa zicem o functie care sa verifice cate piese descoperite are albul si cate negrul. Probabil ca vreau ca aceasta informatie sa o pot oricand afla la apasarea unei taste, dar conteaza si in alta parte, sa zicem la crearea unor statistici. Atunci am facut o functie numita vulnerable_checkers() si tiu ca de acum o pot folosi oriunde ar fi nevoie de ea. Daca faceam ca in orice loc unde am nevoie de aceasta informatie iar toate calculele, tot codul, devenea o munca aiurea: daca descopeream o greseala, aceasta trebuia corectata in toate locurile in care aparea codul care calculeaza acest lucru, astfel eu fac orice modificare intr-un sigur loc, iar apoi codul este accesibil de oriunde.

Tu ca joaca si teste poti face absolut tot codul in functia main(), cea care se executa la lansare.

Scris: 18 Iul 2011, 16:33
de Stefan_Ilioaica
am incercat sa creez o chestie, dar nu mi-a reusit.
pun mai jos eroarea urmata de cod.

File: D:\bgt folder\testing sound\new game.bgt
On line: 29 (1)
Line: move.luad("move.ogg");
Error: Expected ',' or ';'

File: D:\bgt folder\testing sound\new game.bgt
On line: 30 (5)
Line: move.volume=0;
File: D:\bgt folder\testing sound\new game.bgt
On line: 31 (1)
Line: }
Error: Unexpected token '}'


si acum codul

sound gun;
sound move;
void main()
{
show_game_window("the game");
while (true)
{
wait(5);
if(pressed_key(KEY_G))
{
gun();
}
if(pressed_key(KEY_B))
{
move();
}
if(pressed_key(KEY_Q))
{
exit();
}
}
}
void gun()
{
gun.luad("gun.wav");
gun.volume=-2;
}
void move()
move.luad("move.ogg");
move.volume=0;
}

Scris: 18 Iul 2011, 19:29
de Manu
Nu inteleg de unde pana unde ai inteles ca load se scrie cu u... probabil incerci sa programezi cu Wintalker, parerea mea e ca nu se poate face astfel de lucruri decat cu Eloquence sau ESpeak.. In fine, nu conteaza, fiecare se obisnuieste cu ce vrea... daca tot veni vorba de Wintalker, sa ne referim si la celelalte sintetizatoare: cand cineva va scrie un cod de program sau joc cu una dintre cele trei voci feminine pentru romana... eu chiar ma voi inclina si imi voi recunoaste greseala de a fi exagerat.

Asadar, revenind la codul din postul anterior, in doua locuri trebuie scris load cu o, nu cu u, apoi functia care asteapta pentru apasarea unei taste este key_pressed(), nu pressed_key().
Corecteaza si vezi ce iese!

Scris: 18 Iul 2011, 19:44
de Stefan_Ilioaica
am incercat si tot nu iese. ciudat.

Scris: 18 Iul 2011, 20:27
de Manu
Ce ai incercat si ce eroare da?