Pagina 10 din 18

Scris: 08 Feb 2012, 10:50
de Manu
Eventual sa fac eu maine un list view.
O functie de genul:
create_list_view(string items, bool sort_alphabetically)

Cu aceasta functie va rezulta o lista, iar la apasarea enterului pe un item, va fi returnat numarul itemului.

De exemplu tu vei scrie:
int result=create_list_view("BMW|Mercedes|Ford|Dacia", false);
Va aparea o lista cu cele 4 masini nearanjate alfabetic, iar la apasarea enterului pe Dacia, variabila de tip integer result va primi valoarea 4, Dacia fiind a patra in lista.
E ok asa?

Scris: 08 Feb 2012, 10:53
de Stefan_Ilioaica
da, si as vrea ca dupa ce masina e selectata, sa apara un alert sau ceva, ca de exemplu, ai ales o dacia etc.

Scris: 08 Feb 2012, 11:03
de Manu
Pai asta depinde de tine, ce anume vrei sa se intample in urma selectiei.
Tu vei scrie:

if(result==4)
{
alert("Ai ales!", "Alegerea ta a fost Dacia");
}

Scris: 08 Feb 2012, 11:04
de Stefan_Ilioaica
da, asa ar fi perfect.

Scris: 10 Feb 2012, 09:28
de Manu
Mai jos este un exemplu de lista simpla.
Ceea ce este in functia main nu iti trebuie, eu am dat si un exemplu de utilizare a functiei audio_list();
Asadar tu vei copia functia audio_list undeva la tine in scripturi sau vei include un fisier, apoi oricand ai nevoie de o lista scrii:
audio_list(itemii, delimitatorul);
In loc de itemi ori pui intre ghilimele un sir de itemi delimitati de ceva, ori o variabila care contine un sir de itemi delimitati de ceva; iar ca al doilea parametru, pui delimitatorul ales de tine, daca nu pui nimic, implicit se considera ca folosesti pipe, bara verticala.
Un exemplu de utilizare a functiei ar fi:
int result=audio_list("Cluj.Bucuresti.Arad.Londra.Roma.Berlin", ".", ".");
In exemplul de mai sus delimitatorul a fost "." punctul.
Cand se apasa Enter pe undeva in lista, este returnat numarul aferent itemului ales. Indexul ales este in baza 0, asa cum folosim la array-uri, deci pentru primul item se returneaza 0, pentru al doilea 1 si asa mai departe.
Daca se apasa escape, valoarea returnata este -1.
Am folosit doar TTS-ul instantiat cu variabila v, se poate schimba cu cea utilizata in proiectul mai larg.

Exemplul din care trebuie luata doar a doua functie:

Cod: Selectaţi tot

tts_voice v;

void main()
{
show_game_window("Audio List");

string cars="BMW|Mercedes|Ford|Dacia|Fiat|Alfa Romeo|Trabant|Lastun";
int result=audio_list(cars);

string[] cars_array=string_split(cars, "|", true);

if(result==-1) alert("Nimic", "Nu ai ales nici o masina, ai apasat escape.");
else alert("Felicitari!", "Acum ai o masina marca "+cars_array[result]+". ");

exit();
}

int audio_list(string items, string delimiter="|")
{
string[] temp=string_split(items, delimiter, true);
int i=0;
v.speak("List with "+temp.length()+" items.");
v.speak(temp[0]); // just to say first item in the list.
while(true)
{
if(key_pressed(KEY_ESCAPE))
{
i=-1;
break;
}
if(key_pressed(KEY_DOWN))
{
if(i<temp.length()-1) i++;
v.speak_interrupt(temp[i]);
}
if(key_pressed(KEY_UP))
{
if(i>0) i--;
v.speak_interrupt(temp[i]);
}
if(key_pressed(KEY_RETURN)||key_pressed(KEY_NUMPADENTER))
{
break;
}
wait(5);
} 
return i;
}

Scris: 10 Mar 2012, 13:00
de Stefan_Ilioaica
salut. am o curiozitate.
cum pot face sa se auda un sunet, de exemplu un obiect in cadere, iar daca nu apas tasta sageata sa il prind intr-un anumit interval de timp, obiectul respectiv sa se sparga, adica sa se auda sunetul acela de sticla sparta sau ce o mai fi.
sper ca m-am exprimat cum trebuie.

Scris: 10 Mar 2012, 15:53
de Manu
Am facut un fel de joculet in minimum de randuri, in care pica ceva din ce in ce mai repede, pe masura ce prinzi obiectul.
Caderea este realizata prin schimbarea pitch-ului in timp real, suprafata este de la pan minus 10 la plus 10.
Cu sageti stanga dreapta te misti si cu sageata in sus incerci sa returnezi obiectul la un nou loc de cadere. Este un fel de a face duble.
S spune scorul. Daca pierzi esti intors in interfata principala unde cu enter se porneste jocul sau cu Q se inchide totul.
Ar trebui sunete mai bune, am facut cu ce am gasit la repezeala. Nu am mai pus lovire de pereti, in zona acestora se bate pasul pe loc.

Mai jos sub link-ul de download este si sursa.

Download fisier Falling.zip (404 KB)
Arhiva contine sunetele, sursa si varianta compilata .exe. Daca se incearca trebuie pus JAWS pe sleep sau oprit, nu am mai bagat verificari de tot felul, daca e pornit JAWS si altele, codul pentru toate alea fiind cat codul de fata.

Cod: Selectaţi tot

// Declarare obiecte:
sound obiect, lansare, prindere, pierdere, gresit, pas;
timer t, t2;
tts_voice v;

// Declarare variabile:
int where=0; // unde sa cada obiectul.
int speed=100; // cat de repede sa cada obiectul.
int actual_pitch=200; // tot timpul pitch-ul maxim, cand obiectul este sus.
int x=0; // pozitia cursorului.
int score=0; // scorul.

// Declarare constante:
const int ledge=-10; // marginea din stanga.
const int redge=10; // marginea din dreapta.
const int step_speed=50; // distanta in milisecunde intre pasi.
const int latence=1; // plus / minus cat sa fie in zona obiectului ca sa se considere prindere, punand mai mare se joaca mai usor.

void main()
{
show_game_window("Falling");

v.speak("Welcome! Press Enter to start or Q to exit.");

// Incarcare sunete:
obiect.load("sounds//obiect.ogg");
pas.load("sounds//pas.ogg");
prindere.load("sounds//prindere.ogg");
pierdere.load("sounds//pierdere.ogg");
gresit.load("sounds//gresit.ogg");
lansare.load("sounds//lansare.ogg");
lansare.pitch=200;
// sfarsit incarcare sunete.

while(true)
{
if(key_pressed(KEY_RETURN))
{
score=0;
speed=100;

v.speak_wait("Starting!");
game();
}

if(key_pressed(KEY_Q))
{
v.speak_wait("Exiting.");
exit();
}
wait(5);
}
}

void game()
{
new_falling(); // prima cadere.

while(true)
{

if(key_down(KEY_LEFT)&&t.elapsed>step_speed)
{
t.restart();
if(x>ledge) x--;
pas.stop();
pas.pan=x;
pas.play();
}

if(key_down(KEY_RIGHT)&&t.elapsed>step_speed)
{
t.restart();
if(x<redge) x++;
pas.stop();
pas.pan=x;
pas.play();
}

if(key_pressed(KEY_UP))
{
// verificare daca e cursorul in zona obiectului:
if(x>=(where-latence)&&x<=(where+latence))
{
score++; // adaugam un punct la scor.

obiect.stop();
prindere.pan=x;
prindere.play_wait();

// O alta cadere:
new_falling();
}
else
{
gresit.stop();
gresit.pan=x;
gresit.play();
}
}

if(key_pressed(KEY_S))
{
v.speak_interrupt(""+score);
}

if(key_pressed(KEY_ESCAPE))
{
obiect.stop();
break;
}

// Scaderea pitch-ului:
if(t2.elapsed>speed)
{
t2.restart();
actual_pitch--; // decrementare a variabilei care seteaza pitch-ul obiectului.
obiect.pitch=actual_pitch;
}

// Verificare daca obiectul ajunge jos, adica pitch-ul ajunge de la 200 la 100:
if(obiect.pitch<=100)
{
obiect.stop();
pierdere.pan=where;
pierdere.play_wait();
v.speak_wait("Game over. The score was "+score+".");
break;
}
wait(5);
}
}

void new_falling()
{
// O pozitie noua random pentru cadere:
where=random(ledge, redge);

// Marim viteza de cadere scazand intervalul intre decrementarile de pitch:
if(speed>=6) speed--; // sa fim siguri ca macar 5 ms sunt intre decrementarile pitch-ului.

lansare.pan=where;
lansare.play_wait();
actual_pitch=200;
obiect.pitch=actual_pitch; // ducem obiectul sus de unde sa cada.
obiect.pan=where; // ducem obiectul in locul stanga dreapta de unde sa cada.
obiect.play_looped(); // ii dam drumul.
}
Iti pot explica eventual unele aspecte ale codului de mai sus pe masura ce ai nedumeriri.

Scris: 10 Mar 2012, 16:13
de Stefan_Ilioaica
dar se poate face o chestie de genul sa se aude un sunet oarecare iar dupa ce acesta se aude sa apesi o alta tasta cat mai repede posibil inainte de a expira timpul? cam asta vreau eu. sa se auda de exemplu un leu, iar dupa ce acesta se aude sa dau spatiu ca sa il ucid sa zicem. daca nu dau spatiu timp de 10 secunde sa zicem, leul sa ma prinda.

Scris: 10 Mar 2012, 17:02
de Manu
Cu siguranta se poate orice.
Pentru faza cu leul, ai nevoie de un cronometru pe baza caruia sa se evalueze daca ai apasat spatiul in timpul setat ca limita.

Ceva de genul, scriu doar asa fara sa mai fac cod verificat:

Cod: Selectaţi tot

// daca apesi spatiul in decurs de o secunda de la resetarea cronometrului:
if(key_pressed(KEY_SPACE)&&timp.elapsed<1000)
{
// il omori tu pe el.
// dai drumul la un nou leu in arena.
timp.restart();
}
if(timp.elapsed>=1000)
{
// esti mancat de leu.
// dai drumul la un nou leu sau mori de tot.
timp.restart();
}
Desigur ca toate astea trebuie sa fie intr-un while, trebuie sa fie declarate obiectele de sunet, cronometrul timp si alte variabile.

Scris: 24 Mar 2012, 21:55
de Stefan_Ilioaica
eu n-am prea inteles care este treaba cu timer-ul cand trebuie pus si cum.

Scris: 25 Mar 2012, 22:26
de Manu
Timerul este de fapt un cronometru.
Cred ca cel mai bine vei urmari imprimarile cursului de BGT si pana sa folosesti obiecte, mai incearca if-uri, while-uri si putina jonglare cu variabile. Nu prea inteleg intrebarea, "cum sa folosesc timer-ul si unde"... ar fi de folosit ca un cronometru in viata de zi cu zi. Ii dai drumul, spui cand a trecut de anumita valoare sa se intample ceva.

Scris: 25 Mar 2012, 22:58
de Manu
Acum o vreme ma jucam cautand un algoritm pentru cautarea fisierelor in calculator cu BGT, care nu are functie nativa pentru asa ceva.
Poate in viitor mai vor sa vada si altii exemple sau sa gaseasca un algoritm mai usor sau mai eficient.

Scriptul intreaba printr-un input box calea initiala care trebuie sa se termine in back slash ca in exemplele: "C:\" sau "C:\Program Files\BGT\". Un alt input box intreaba ce sa caute, * (asterisc) poate fi utilizat ca wildcard.
Dupa executare, vom avea un array found_files care va contine toate fisierele gasite si un fisier text cu aceleasi rezultate in folderul cu scriptul.

Practic baza este o functie recursiva.
Sunt curios cum ar fi mai bine, acesta cauta pe nivele, intai in toate folderele gasite sub calea initiala, apoi in toate folderele din folderele de sub calea initiala si tot asa, pana la cel mai adanc nivel posibil, la mine in C erau 10 "etaje", cel mai de jos fiind in Program Files, Office.. Fisierul .TXT rezultat care continea toate fisierele in urma cautarii dupa *.* (asterisc punct asterisc), aproximativ 250 de mii, are vreo 24 de mega.
Poate o solutie ar mai fi sa caute tot ceea ce e in primul folder, apoi ce e in al doilea si tot asa.

De mentionat ca in BGT avem deja functiile find_files() si find_directories() care returneaza array-uri cu rezultate din locatia curenta doar, codul de fata merge in toate locurile posibile.

Cod: Selectaţi tot

string[] directories;
string[] files;
string[] found_files;
string init_path=""; 
string term="";
uint level=0; // doar sa vedem cate nivele au fost detectate.

void main()
{
show_game_window("Find Files");
init_path=input_box("Calea", "Scrie calea sub care sa se caute.");
if(init_path=="") exit();

term=input_box("Search string", "Scrie ce sa se caute. * (star) poate fi folosit ca wildcard. De exemplu *.mp3 cauta dupa toate fisierele MP3., iar *.* cauta dupa absolut toate fisierele.");
if(term=="") exit();

find_files_under_path();

exit();
}

void find_files_under_path()
{

// if(init_path!="") search_files(init_path);; // to search also in the rout directory.

directories=find_directories(init_path+"*");

// Se pune la inceput calea:
for(uint i=0; i<directories.length(); i++)
{
directories[i]=init_path+directories[i];
}

find_dirs_recursive();
}

void find_dirs_recursive()
{
string[] temp;
string[] temp_directories;
for(uint i=0; i<directories.length(); i++)
{
directories[i]=directories[i]+"\\";
search_files(directories[i]);
temp=find_directories(directories[i]+"*");
for(uint j=0; j<temp.length(); j++)
{
temp_directories.insert_last(directories[i]+temp[j]);
} // end for
} // end for.

if(temp_directories.length()==0)
{
output_results();
}
else
{
directories.resize(0);
for(uint i=0; i<temp_directories.length(); i++)
{
directories.insert_last(temp_directories[i]);
} // end for.
level++;
find_dirs_recursive();
}
}

void search_files(string directory_to_search_in)
{
files=find_files(directory_to_search_in+term);
for(uint k=0; k<files.length(); k++)
{
found_files.insert_last(directory_to_search_in+files[k]);
}
}

void output_results()
{
string result="";
for(uint i=0; i<found_files.length(); i++)
{
result+=found_files[i]+"\r\n";
}
// write results in a file:
file f;
f.open("Found_Files.txt", "w");
f.write(result);
f.close();

// clipboard_copy_text(result);
alert("Finished", "Searched until level "+level+".\n"+found_files.length()+" files found");}
O varianta compilata ar fi aici.

Scris: 03 Apr 2012, 16:14
de Stefan_Ilioaica
salut.
de curand am facut ca la apasarea unei taste, o variabila sa tot scada din 10 in 10 pornind de la 100.
problema e ca nu mi se opreste la 0, ba din contra, se duce in jos, la numere negative.
ce pot face cca limita la care sa se ajunga sa fie 0?

Scris: 03 Apr 2012, 20:56
de Manu
Pune codul tau aici si il completam punand o bariera la 0.

Scris: 03 Apr 2012, 22:34
de Stefan_Ilioaica
n-o sa il pun pe tot, pun doar un mic exemplu asemanator, deoarece acel codulet il foloseam la un mic joculet cu sunet ca sa zic asa.
deci, ar fi cam asa:
declaram o variabila la inceput numita energie:
int energy=100;
si pe la mijlocul codului
if(key_pressed(KEY_A))
{
energy=energy-10;
}
if(key_pressed(KEY_S))
{
energy=energy-20
}

si tot asa cu alte taste.
bine inteles ca am pus mult mai multe chestii la scriptuletul meu, dar asta a fost bariera peste care am dat.