Pagina 14 din 18

Scris: 14 Mar 2013, 15:38
de Manu
Multumim Alexandru pentru informatie, in ultimele zile nu am mai intrat pe Blastbay fiind destul de ocupat.
A fost o surpriza placuta sa aflu ca intr-un final s-a publicat What's New pentru BGT 1.3.
Sa speram ca apare cat de curand si versiunea propriu-zisa a programului... Suportul pentru DLL e foarte important, inseamna ca de acum se poate sari peste multe limitari anterioare.

Scris: 08 Apr 2013, 16:16
de Vlad_Ciotescu
buna
vin si eu cu un exemplu de cod.

Cod: Selectaţi tot

void main()
{
show_game_window("super man");
sound gun;
gun.load("sounds/shot.wav");
while(true)
{
int bulets=10;
switch(bulets)
{
case 10:
bulets=10
gun.play();
case 9:
bulets=9;
gun.play();
case 8
bulets=8;
default
bulets=0;
}
if(key_down(KEY_LMENU)&&key_pressed(KEY_F4))
{
exit();
}
}
}
eu am facut un joc cu impuscaturi si vreau sa vad cum pot sa fac sa am doar 10 gloante pe incarcator

Scris: 08 Apr 2013, 23:35
de Manu
In codul tau se intampla ca instant arma ajunge sa aiba 0 gloante, aceasta fiind instructiunea default a switch-ului. Ori daca era initial o valoare de 10 la bulets si exista case 10, atunci se tot intampla repetitiv instructiunile de la case 10, adica bulets sa fie tot 10 si sa se tot auda impuscatura.
De asemenea variabila bulets era declarata de milioane de ori pe secunda, ea intamplandu-se intr-un while chiar fara wait-ul conventional de 5 milisecunde.

Am luat codul tau si am facut ca inainte de while sa fie declarata variabila bulets care sa contina valoarea 10.
In while ramane sa se verifice doar daca se apasa tasta spatiu sau daca se apasa alt+f4.

Daca se apasa tasta spatiu, se vor intampla urmatoarele lucruri:
scade valoarea lui bulets cu 1 si se aude sunetul incarcat in instanta gun a clasei sound.
Se mai verifica imediat dupa ce se aude sunetul daca nu cumva incarcatorul este gol, adica daca bulets<=0, e suficient si bulets==0, caz in care se va afisa un alert care anunta finalul jocului si este chemata functia exit().

Am incarcat in gun un sunet numit pistol.ogg care nu este in folderul sounds, ci in acelasi folder cu fisierul .bgt, asta ca sa imi fie mie mai usor sa verific. Dar poti schimba dupa preferinta parametrul metodei load a instantei gun a clasei sound.

Cod: Selectaţi tot

 void main() 
 { 
 show_game_window("super man"); 
 sound gun; 
 gun.load("pistol.ogg"); 
int bulets=10;

while(true) 
{ 

// Daca se apasa tasta spatiu:
if(key_pressed(KEY_SPACE))
{
bulets--; // se duce cu cate un glont din cartus.
gun.stop();
gun.play();

// Verificam daca nu cumva s-a golit arma:
if(bulets<=0)
{
alert("Game Over", "Charger empty. Bye bye");
exit();
}
} // sfarsit daca se apasa tasta spatiu.

// Daca se apasa alt+f4:
 if(key_down(KEY_LMENU)&&key_pressed(KEY_F4)) 
 { 
 exit(); 
 } 

wait(5); // a nu se uita de aceasta instructiune, procesorul trebuie sa rasufle.
} // sfarsit while.
 }

Scris: 09 Apr 2013, 12:52
de Alexandru
Am si eu o varianta.

Cod: Selectaţi tot

void main()
{
tts_voice voice;
sound gun;
sound loader;
int bulets=10;
show_game_window("Super Man");
gun.load("sounds/gun.ogg");
if(gun.active==false)
{
sound_error("gun.ogg");
}
loader.load("sounds/loader.ogg");
if(loader.active==false)
{
sound_error("loader.ogg");
}
while(true)
{
if(key_down(KEY_LMENU)&&key_pressed(KEY_F4) or key_down(KEY_RMENU)&&key_pressed(KEY_F4))
{
exit();
}
if(key_pressed(KEY_A))
{
voice.speak_interrupt(""+bulets);
}
if(key_pressed(KEY_SPACE))
{
bulets--;
gun.stop();
gun.play();
}
if(bulets<0)
{
bulets=0;
}
while(bulets==0)
{
if(gun.playing==false)
{
gun.stop();
}
if(key_down(KEY_LMENU)&&key_pressed(KEY_F4) or key_down(KEY_RMENU)&&key_pressed(KEY_F4))
{
exit();
}
if(key_pressed(KEY_A))
{
voice.speak_interrupt(""+bulets);
}
if(key_pressed(KEY_RETURN) or key_pressed(KEY_NUMPADENTER))
{
loader.play();
while(loader.playing==true)
{
if(key_down(KEY_LMENU)&&key_pressed(KEY_F4) or key_down(KEY_RMENU)&&key_pressed(KEY_F4))
{
exit();
}
if(key_pressed(KEY_A))
{
voice.speak_interrupt(""+bulets);
}
wait(5);
}
bulets=10;
break;
}
wait(5);
}
wait(5);
}
}

Scris: 09 Apr 2013, 14:06
de Manu
Da, probabil ca tu ai vrut ca Alt+F4 sa mearga absolut peste tot, chiar si in timp ce se aude un anume sunet.
Ai devenit astfel repetitiv la anumite linii de cod, cum ar fi cel de inchidere cu Alt+F4.
Fiind vorba de un cod scurt e ok, dar altfel, ca sugestie, atunci cand ai cateva combinatii de taste pe care le vrei valabile peste tot, poti face o functie, sa zicem:
void global_keystrokes() { ... }
in aceasta fiind codul pentru Alt+F4, verificare numar de gloante etc. Astfel chemi functia si cand e while(playing), si cand e while(true) etc.

O remarca pentru codul care verifica la if daca se apasa Alt+F4:
Varianta ta este:
if(key_down(KEY_LMENU)&&key_pressed(KEY_F4) or key_down(KEY_RMENU)&&key_pressed(KEY_F4))
Practic verifici daca se tine apasat Alt stanga si se apasa F4, ori daca se apasa alt dreapta si se apasa F4. In mod normal cele doua variante, din stanga si dreapta OR-ului ar fi bine sa fie intre paranteze rotunde, astfel incat sa fie evaluate ca doua conditii separate.

Un cod mai scurt pentru ambele Alt-uri plus F4 ar fi:

if((key_down(KEY_LMENU)||key_down(KEY_RMENU))&&key_pressed(KEY_F4))

Practic se verifica intre paranteze daca cumva se apasa Alt stanga sau dreapta, iar daca e unul dintre ele apasate se verifica daca nu cumva se apasa intre timp si F4.

Diferenta intre cele doua coduri ar fi, intr-un limbaj cat mai uman inteligibil cu putinta:

Al tau:

Daca este apasat Alt stanga si se apasa F4 sau daca este apasat Alt dreapta si se apasa F4.

Al meu:

Daca este apasat Alt stanga sau Alt dreapta si daca intre timp se apasa F4.

Scris: 09 Apr 2013, 14:49
de Vlad_Ciotescu
pai bun dar unde pun switchul in joc pentu a avea un nr de gloante?

Scris: 09 Apr 2013, 15:19
de Manu
Cum adica pentru a avea un numar de gloante?
In mod normal trebuie sa ai la inceput un numar de gloante, apoi din totalul de gloante sa se tot ia cate unul pe masura ce le consumi.

Explica-ne mai clar ce anume vrei, adica cum ai vrea sa se comporte.
un switch ar fi bun aici daca ai vrea ca la fiecare numar de gloante posibil sa se intample ceva anume, dar si atunci acel switch va trebui pus sa fie verificat in momentul impuscari sau dupa, nu permanent in while.
Atentie, la switch e recomandabil ca la finalul oricarui case sa existe si un break, eventual o sa explic mai amanuntit mai incolo de ce.

Scris: 09 Apr 2013, 16:52
de Alexandru
Am o intrebare referitoare la codul meu:
Imi amintesc ca la un moment dat, am pus doua while-uri unul intr-altul. "while(bulets==0)" si "while(loader.playing==true)". Eu am pus pe pauza while-ul pentru gloante dupa ce valoarea vareabilei bulets era egala cu 10, dar nu am facut asta si in cazul celuilalt while. Deci, intrebarea mea este:
Daca este pus pe pauza un while principal ori secundar se opresc si cele din interior? Sau se repeta pe toata durata jocului.

Scris: 09 Apr 2013, 18:32
de Vlad_Ciotescu
pai cam asa:
adica daca apas o tasta sa se auda sunetul de rencarcare si sa am din nou 10 gloante
cum pot face chestia asta

Scris: 09 Apr 2013, 18:59
de Alexandru
Intre timp, m-am mai jucat cu script-uletul acesta. Cautam o posibilitate prin care sa pot reda un sunet cand nu mai sunt gloante in arma si am gasit-o! Am descoperit ca in loc de acel while care se repeta cand nu mai erau gloante in arma as fi putut pune chiar si un if, dar in varianta initeala cautam o posibilitate prin care sa opresc sunetul de foc. De asemenea, am mai descoperit ca nu ar fi fost neaparat sa tin vareabila bulets la 0 atunci cand se ajungea acolo, ci era necesar doar while-ul. Oricum, jocul functiona cu ambele variante. Mai jos, pun codul in varianta actoala, cea care emite si un sunet atunci cand nu mai sunt gloante in arma dar tasta Spatiu inca mai este apasata.
Cod:

void main()
{
tts_voice voice;
sound gun;
sound loader;
sound unloaded;
int bulets=10;
show_game_window("Super Man");
gun.load("sounds/gun.ogg");
if(gun.active==false)
{
alert("Error", "Error loading gun.ogg");
exit();
}
loader.load("sounds/loader.ogg");
if(loader.active==false)
{
alert("Error", "Error loading loader.ogg");
exit();
}
unloaded.load("sounds/unloaded.ogg");
if(unloaded.active==false)
{
alert("Error", "Error loading unloaded.ogg");
exit();
}
while(true)
{
if(key_down(KEY_LMENU)&&key_pressed(KEY_F4) or key_down(KEY_RMENU)&&key_pressed(KEY_F4))
{
exit();
}
if(key_pressed(KEY_A))
{
voice.speak_interrupt(""+bulets);
}
if(key_pressed(KEY_SPACE))
{
if(bulets==0)
{
unloaded.play();
}
else
{
bulets--;
gun.stop();
gun.play();
}
}
if(bulets==0)
{
if(gun.playing==false)
{
gun.stop();
}
if(key_pressed(KEY_RETURN) or key_pressed(KEY_NUMPADENTER))
{
loader.play();
while(loader.playing==true)
{
if(key_down(KEY_LMENU)&&key_pressed(KEY_F4) or key_down(KEY_RMENU)&&key_pressed(KEY_F4))
{
exit();
}
if(key_pressed(KEY_A))
{
voice.speak_interrupt(""+bulets);
}
if(bulets==10)
{
break;
}
wait(5);
}
bulets=10;
}
}
wait(5);
}
}

Scris: 09 Apr 2013, 21:23
de Manu
Alexandru, nu stiu exact la ce te referi cand spui ca pui pe pauza un while. Probabil te referi la un moment in care repetarea este oprita prin aparitia in peisaj a unei functii care tine in loc sirul, vezi alert(), sau aparitia unui alt while care, intr-adevar, atata vreme cat se desfasoara, va tine in loc while-ul superior.

Practic poti oricand sa faci o pauza la un joculet, vorbind cel mai simplu in felul urmator:

Cod: Selectaţi tot

while(true)
{
if(key_pressed(KEY_Q))
{
exit();
}

// Daca se apasa P sa intre pauza:
if(key_pressed(KEY_P))
{
while(true)
{
// Daca se apasa P sa se iasa din pauza, din while-ul imbricat:
if(key_pressed(KEY_P))
{
break;
}
wait(5);
} // sfarsit while pentru pauza.
}
wait(5);
} // sfarsit while principal.
Daca intelegi bine codul de mai sus e un lucru bun, inseamna ca e loc de progres; daca e nevoie de explicatii suplimentare, sunt dispus sa le dau, reformuland chiar codul.

Vlad, pentru a incarca arma cu 10 gloante, e suficient ca in codul meu, cel in care puteai impusca de 10 ori sa scoti alert-ul si exit-ul de la if-ul care verifica momentul in care sunt 0 gloante si acolo sa pui un sunet care aduce a arma descarcata.
Sa pui in while-ul principal si codul pentru apasarea tastei Enter, la apasarea careia sa se incarce arma cu inca 10 gloante, desigur, doar daca bulets este 0:

Cod: Selectaţi tot

if(key_pressed(KEY_RETURN)&&bulets<=0)
{
bulets=10;
charge.play();
}
Desigur va trebui sa declari si obiectul charge de tip sound si sa ii atribui un sunet specific.
Asadar, vei avea in while 3 if-uri principale: unul pentru tasta spatiu care este tragere, unul pentru tasta Enter / Return care este incarcare, unul pentru Alt + F4 care este inchidere.
Daca inca iti e greu sa combini codurile, pot sa il fac eu complet cu impuscare de 10 ori, plus reincarcare.

Scris: 09 Apr 2013, 22:27
de Alexandru
Am inteles codul perfect. Ideea e ca in while-ul pentru redarea sunetului de incarcare nu am pus o instructiune conditionata care sa verifice ca daca sunetul de incarcare este false, atunci sa intrerupa si acel while. A fost o confuzie de a mea. In ceea ce priveste jocul propriu-zis, eu l-am programat deja. Voi dau codul final caruia i-am facut niste ajustari. Eu o sa il distribui cu extensia .wav a fisierelor, este o constanta caruia i se poate atribui textul .ogg in loc de .wav.
Nu am comentat codul, cred ca este destul de intuitiv. Oricum, o pot face daca chiar este nevoie.
Asadar, trebuie pus fisierul .bgt intr-un folder in care sa se afle si un folder numit sounds care sa contina fisierele gun, loader si unloaded.
Cod:
sound gun;
sound loader;
sound unloaded;
int bulets=10;
const string sound_extension=".wav";
tts_voice voice;
void main()
{
show_game_window("Super Man");
gun.load("sounds/gun"+sound_extension);
if(gun.active==false)
{
alert("Error", "Error loading gun"+sound_extension);
exit();
}
loader.load("sounds/loader"+sound_extension);
if(loader.active==false)
{
alert("Error", "Error loading loader"+sound_extension);
exit();
}
unloaded.load("sounds/unloaded"+sound_extension);
if(unloaded.active==false)
{
alert("Error", "Error loading unloaded"+sound_extension);
exit();
}
while(true)
{
if((key_down(KEY_LMENU)||key_down(KEY_RMENU))&&key_pressed(KEY_F4))
{
exit();
}
if(key_pressed(KEY_A))
{
voice.speak_interrupt(""+bulets);
}
if(key_pressed(KEY_SPACE))
{
if(bulets==0)
{
unloaded.play();
}
else
{
bulets--;
gun.stop();
gun.play();
}
}
if(bulets==0)
{
if(gun.playing==false)
{
gun.stop();
}
if(key_pressed(KEY_RETURN) or key_pressed(KEY_NUMPADENTER))
{
if(unloaded.playing==true)
{
unloaded.stop();
loading();
}
else
{
loading();
}
}
}
wait(5);
}
}
void loading()
{
loader.play();
while(loader.playing==true)
{
if((key_down(KEY_LMENU)||key_down(KEY_RMENU))&&key_pressed(KEY_F4))
{
exit();
}
if(key_pressed(KEY_A))
{
voice.speak_interrupt(""+bulets);
}
if(bulets==10)
{
break;
}
wait(5);
}
bulets=10;
}

Scris: 10 Apr 2013, 10:10
de Vlad_Ciotescu
poftiti codul
cod:
void main()
{
show_game_window("super man");
sound gun;
sound charger;
gun.load("sounds/gun.wav");
charger.load("sounds/charger.wav");
if(charger==false)
{
alert("error", "could not load the file name");
exit();
}
if(gun.active==false)
{
alert("error","could not load teh sound.");
exit();
}
while(true
{
int bulets=10;
if(key_down(KEY_LCONTROL)||key_down(KEY_RCONTROL))
{
switch(bulets)
{
case 10:
bulets=10;
gun.play_wait();
default:
bulets=0;
sound empti;
empti.load("sounds/empty.wav");
}
}
if(key_pressed(KEY_RETURN&&bulets==0)
{
bulets=10;
charger.play_wait();
}
if(key_pressed(KEY_Q))
{
exit();
}
}
}

prin acest cod am vrut sa-ntreb daca am pus bine switchul?

Scris: 10 Apr 2013, 15:48
de Manu
Nu prea vad sensul switch-ului in aceasta situatie.
Practic la tine pare sa se intample urmatorul lucru:
Daca bulets e 10 ramane tot 10 cand se impusca, de asemenea, neaparand un break la finalul unui case se intampla si default-ul, adica bulets ajunge la 0.
Ma mira insistenta cu care doresti utilizarea switch-ului. Eu il folosesc destul de rar, pana acum doar in Pontes Escape mi s-a parut necesar pentru ca erau mai multe nivele de dificultate si in functie de o variabila level se incarcau anumite sunete, anumite valori la cronometre etc.
O justificare a folosirii aici a switch-ului ar fi daca la fiecare numar posibil de gloante sa se intample ceva anume, sa se auda diferit arma, sa scada si puterea sau asa ceva.

Ar fi atunci un switch prin care sa se treaca la apasarea spatiului sau a tastei care actioneaza tragatorul:

Cod: Selectaţi tot

switch(bulets)
{
case 9:
strength=5; // am decis ca puterea sa fie 5.
// eventual alt cod care sa fie executat daca in incarcator sunt 9 gloante.
break;
case 8:
strength=3; // sa fie puterea 3.
// eventual alt cod care sa fie executat daca in incarcator sunt 8 gloante.
break;
default:
/*
Cod care sa se intample in caz ca niciuna dintre valorile lui bulets nu se regaseste la case-urile anterioare.
Poate nici nu e necesar un default in situatia de fata.
*/
}
Trebuie la sfarsitul fiecarui case cate un break pentru a nu fi evaluate la aceeasi trecere prin switch si celelalte case-uri care au mai ramas dupa ce a fost detectat unul ca fiind indeplinit.

Eu zic sa iei primul meu cod cu descarcarea armei si pe el sa il modifici, astfel ai fi pe o cale mai buna, cel putin in ceea ce priveste incercarea de fata, ai putea-o denumi "Gun Simulator".
Daca reusesti, pune codul aici si il putem dezvolta in continuare, astfel incat sa iasa un simulator de arme in care in functie de model sa fie un anumit numar de gloante in incarcator, anumite sunete etc.

Scris: 23 Apr 2013, 18:50
de Vlad_Ciotescu
buna
vreau sa va pun doua intrebari.
1. Cum pot face un mini duel intre jucator si calculator?
2. Ce site imi recomandati pentru a-mi descarca sunete?