BGT de la Blastbay Studios, un scripting accesibil si facil
- Manu
- General de divizie
- Mesaje: 4120
- Membru din: 02 Feb 2007, 01:15
- Localitate: Cluj-Napoca
- Contact:
In ceea ce priveste acel mini-duel, nu am cum sa spun cum s-ar face pana nu spui exact ce vrei sa se intample acolo. Nu prea poti incepe sa lucrezi la un joc daca nu stii exact cum vrei sa fie.
Un exemplu de asa-zis mini-duel ar fi:
Auzi un sunet undeva mai departe, adica mai incet ca volum, pe o lungime de 20 de pasi determinati de proprietatea pan a sunetului.
Trebuie sa mergi in fata lui si cu spatiul sa il impusti, sa se considere lovitura valabila daca ai reusit sa pozitionezi sunetul care reprezinta adversarul cu sunetul care te reprezinta pe tine in teren.
Sa vina randul adversarului (calculatorului), iar acesta eventual sa vina in fata ta, dar sa aiba random 3 posibilitati, te nimereste, da pe langa prin dreapta sau pe langa prin stanga.
Cine ajunge primul la 5 castiga.
In cele din urma ar iesi un joculet in care pe nivelul usor calculatorul ar avea sanse de 1 la 3 sa te nimereasca, iar tu ai avea sanse in functie de abilitati, in functie de capacitatea de a localiza bine sunetele intre cele doua boxe.
Asadar, gandeste-te exact ce ai vrea si incercam, desi nu era rau sa mergi pe simulatorul de arme din posturile anterioare.
In cea ce priveste site cu sunete... nu mai stiu nici unul acum pe loc, dar le-am gasit tot timpul cu Google pe cele care ofera download gratuit.
Foarte importanta este si partea de prelucrare, rar gasesti un sunet care sa multumeasca din prima, asa cum este el. Cele gratuite se vede ca sunt facute uneori superficial, mai au cateva milisecunde de pauza la inceput, au cate un pacanit etc.
Cu Sound Forge poti ca nevazator sa prelucrezi foarte bine, sa faci taieri la milisecunda, fade-in-uri si fade-out-uri pe segmente de 10 milisecunde, astfel incat sa nu existe riscul cate unui zgomot la inceput sau sfarsit de sunet din cauza taierilor anterioare.
Sunt cu siguranta si alte programe accesibile pentru prelucrare de sunet.
Un exemplu de asa-zis mini-duel ar fi:
Auzi un sunet undeva mai departe, adica mai incet ca volum, pe o lungime de 20 de pasi determinati de proprietatea pan a sunetului.
Trebuie sa mergi in fata lui si cu spatiul sa il impusti, sa se considere lovitura valabila daca ai reusit sa pozitionezi sunetul care reprezinta adversarul cu sunetul care te reprezinta pe tine in teren.
Sa vina randul adversarului (calculatorului), iar acesta eventual sa vina in fata ta, dar sa aiba random 3 posibilitati, te nimereste, da pe langa prin dreapta sau pe langa prin stanga.
Cine ajunge primul la 5 castiga.
In cele din urma ar iesi un joculet in care pe nivelul usor calculatorul ar avea sanse de 1 la 3 sa te nimereasca, iar tu ai avea sanse in functie de abilitati, in functie de capacitatea de a localiza bine sunetele intre cele doua boxe.
Asadar, gandeste-te exact ce ai vrea si incercam, desi nu era rau sa mergi pe simulatorul de arme din posturile anterioare.
In cea ce priveste site cu sunete... nu mai stiu nici unul acum pe loc, dar le-am gasit tot timpul cu Google pe cele care ofera download gratuit.
Foarte importanta este si partea de prelucrare, rar gasesti un sunet care sa multumeasca din prima, asa cum este el. Cele gratuite se vede ca sunt facute uneori superficial, mai au cateva milisecunde de pauza la inceput, au cate un pacanit etc.
Cu Sound Forge poti ca nevazator sa prelucrezi foarte bine, sa faci taieri la milisecunda, fade-in-uri si fade-out-uri pe segmente de 10 milisecunde, astfel incat sa nu existe riscul cate unui zgomot la inceput sau sfarsit de sunet din cauza taierilor anterioare.
Sunt cu siguranta si alte programe accesibile pentru prelucrare de sunet.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
BGT versiunea 1.3, revizia 1
Cu aproximativ cincisprezece minute in urma, oficial, BGT 1.3 a fost lansat. Acesta se poate descarca de pe site-ul www.blastbay.com din sectiunea "Software", subsectiunea "Blastbay Game Toolkit (BGT)". Inainte de a va scrie si jurnalul cu schimbarile acestei versiuni, trebuie sa va informez ca versiunea anterioara a BGT-ului trebuie dezinstalata.
Iata care sunt schimbarile:
Iata care sunt schimbarile:
Version 1.3 (revision 1):
* Updated the script interpreter to the latest version which fixes some more bugs found by users, and adds the following features:
1. The infamous "unexpected end of file" compilation error now shows a lot more information.
2. It is now possible to declare several class properties of the same type on a single line, separated by comma.
3. It is also possible to initialize class properties in their declaration, rather than having to do it in the constructor.
Note: This means that some obscure scripts, where a child class calls a method in the parent class that in turn tries to access its members before its constructor has been called by the child class, will now result in a null pointer access script runtime error. This happens very rarely, but should be taken into account if you are upgrading and have scripts that may potentially reproduce the above scenario.
4. Large scripts will now compile significantly faster, and loading of precompiled byte code is faster as well.
5. The script compiler no longer implements a default constructor for classes that define a constructor with arguments. If you want both a default constructor and a constructor that takes arguments, you must define both of them explicitly (see the language tutorial for more information).
* Added DLL call support.
* Added the ability to compile scripts either as debug or release builds, and added documentation to explain the differences (see appendix h).
* Added some basic serialization functions that make it easier to save and load data from files or from memory.
* Made it possible to serialize and restore the exact state of the random number generator at any point in time.
* Added an object called combination which contains algorithms to calculate different types of combinations from an arbitrarily large set of items (sponsored by Marc Andersen).
* Added a pan property to the tone synth object which affects all subsequently generated notes.
* Added reverberation to the tone synth object, which is controlled by various properties.
* Added a new function called is_admin which checks if the program is being run with administrator priviliges (thanks Liam).
* Added some new functions to force/simulate keystrokes (thanks Nikola).
* Added two new functions (string_base64_encode and string_base64_decode) which makes it possible to convert binary data to and from a printable, Ascii compatible representation.
* The keyhook is now automatically uninstalled when the user leaves the game window, and installed again when the window is reactivated. This is to prevent lag in certain screen readers when the user is working with an application other than the game.
* Upgraded to the Visual Studio 2010 compiler, which gives a performance boost.
* Changed it so that initial text that is placed in an input box is selected automatically when the window appears (thanks Nikola).
* Added a new folder constant (DIRECTORY_MY_DOCUMENTS), see appendix e for more details (thanks Liam).
* Significantly optimized the way audio files are read, resulting in a great performance improvement when loading sounds (thanks Aaron).
* Optimized the string_contains function.
* Significantly optimized the internals of the sound_pool include class so that it now runs much faster.
* Made the script compilation result dialog show the amount of time that the compilation took.
* Added a speak_to_file method to the tts_voice object (thanks Marc).
* Added a function to hide the game window (thanks Nikola).
* Added the concept of named items to the dynamic_menu include class, making it easier to figure out what the chosen item is regardless of in what order the items were added.
* Added a new method to the audio_form class that allows a listbox cursor to be changed (Thanks Damien).
* Allowed the home and end keys to navigate to the top and bottom of a listbox in an audio form.
* Fixed a serious bug in the audio subsystem which would cause random crashes.
* Fixed a crash which would occur when converting large floating point numbers to strings (thanks Corey).
* Fixed a bug which would cause the string_split function to enter an infinite loop if the NULL terminator was used in the delimiter (thanks Damien).
* Fixed a crash which would sometimes occur after a runtime error (thanks Corey).
* Improved support for the Window Eyes screen reader (thanks Aaron and Jason).
* Fixed a problem where erronious warning messages could be triggered if the initialization of the global variables failed (thanks Damien).
* Fixed a bug in the sound_pool include class which made it try to reload a sound that came back within earshot, from the currently used storage rather than the storage that was active when the sound was initially loaded (thanks Liam).
* Fixed a bug in the dynamic_menu include class which would cause the intro message not to be heard if the auto_speak_first parameter was true and the first item used an output different from the intro message (thanks Aaron).
* Fixed a bug in the audio_form include class in the get_list_count method where the maximum index was being returned rather than the number of items as described in the documentation (Thanks Damien).
* Fixed several multiline input field bugs in the audio_form include class (Thanks Damien).
* Updated the language tutorial with information about the new behavior of automatic default constructors, and about how to assign values to class properties directly in their declaration.
* Added a serialization tutorial.
* Documented the string object.
* Added four missing overloaded operators to the list in the language tutorial (opPreInc, opPreDec, opPostInc and opPostDec).
* Added a note to the number_to_hex_string documentation regarding the fact that it produces lowercase results (thanks Jordan).
* Added a list of command line options available in the BGT engine (see appendix g).
* Updated the documentation for the profiler to explain the differences when profiling debug versus release builds.
* Failed to document the new array methods mentioned in the change log for version 1.2 revision 1 (thanks Marc).
* Failed to document the new get_size method mentioned in the change log for version 1.2 revision 1 (thanks Damien).
* Failed to document the sound_is_playing method in the sound_pool include class(Thanks Lukás).
* Failed to document several methods of the dynamic_menu class (Thanks Lukás).
* Fixed an error in one of the examples in the language tutorial to do with integer calculations.
* Fixed a few typos in the html code in the documentation (thanks Nikola).
- Manu
- General de divizie
- Mesaje: 4120
- Membru din: 02 Feb 2007, 01:15
- Localitate: Cluj-Napoca
- Contact:
Asteptam de ceva vreme noua versiune de BGT, in seara asta m-am jucat deja cu noua clasa library pentru apelarea functiilor din DLL-uri.
Fiind la inceput suportul pentru DLL, inca sunt minusuri, dar important este ca putem chema functii din librarii precum "user32.dll" unde sunt de exemplu functiile "MessageBox", putem chema functii din "kernel32.dll" unde sunt si functii precum "GetComputerName".
Am vazut chiar si un exemplu cu o librarie "my_recorder.dll", se inregistra un fisier WAV.
Teoretic de acum nu mai sunt restrictii nici in ceea ce priveste crearea unei interfete pentru un program, sigur pot fi chemate si functiile din "gdi32.dll".
O noutate este si faptul ca de acum acel install_keyhook va fi dezinstalat automat cand este parasita fereastra cu jocul, astfel incat nu vor mai fi probleme cu utilizarea calculatorului cand e JAWS pornit. Eu la table facusem niste artificii pentru a rezolva problema, dar fiind de acum nativ e si mai bine.
Utile sunt de asemenea si functiile pentru serializarea si deserializarea datelor, simplifica mult lucrul. A scris si un tutorial acolo Philip Bennefall despre serialization, asta pentru cine nu prea stie despre ce e vorba.
Pe scurt e vorba de salvarea unui array asociativ intr-un fisier, de fapt despre crearea unui string dintr-un array asociativ, in BGT obiectul dictionary.
Imi place ca acum se arata si timpul procesului de compilare, ca se poate alege ca o sursa sa fie compilata ca debug sau release build.
Alte functii noi pot fi utile, cum ar fi is_admin(), uneori este necesar sa vedem daca putem scrie sau nu in registri, daca putem scrie fisiere in anumite locuri etc. Toate acestea se puteau verifica si inainte, doar ca avand o functie din start care verifica un lucru, nu mai est enecesar sa ne batem capul cu artificiile.
Tot asa mi-ar fi placut o functie nativa pentru a verifica daca este o conexiune ok la internet, desi foarte usor se poate crea functia is_connection_available(), functie in care sa se vada daca headerele de la Google sunt accesabile, probabil site-ul Google e unul dintre cele mai sigure disponibile la un moment dat.
Desigur ca m-am si grabit sa recompilez jocul de table, maine voi recompila si celelalte jocuri, mai ales ca in unele nu am avut rabdare sa scot comportamentul aiurea in afara ferestrei cand e JAWS pornit si keyhook installed, acum acest lucru e implicit.
Fiind la inceput suportul pentru DLL, inca sunt minusuri, dar important este ca putem chema functii din librarii precum "user32.dll" unde sunt de exemplu functiile "MessageBox", putem chema functii din "kernel32.dll" unde sunt si functii precum "GetComputerName".
Am vazut chiar si un exemplu cu o librarie "my_recorder.dll", se inregistra un fisier WAV.
Teoretic de acum nu mai sunt restrictii nici in ceea ce priveste crearea unei interfete pentru un program, sigur pot fi chemate si functiile din "gdi32.dll".
O noutate este si faptul ca de acum acel install_keyhook va fi dezinstalat automat cand este parasita fereastra cu jocul, astfel incat nu vor mai fi probleme cu utilizarea calculatorului cand e JAWS pornit. Eu la table facusem niste artificii pentru a rezolva problema, dar fiind de acum nativ e si mai bine.
Utile sunt de asemenea si functiile pentru serializarea si deserializarea datelor, simplifica mult lucrul. A scris si un tutorial acolo Philip Bennefall despre serialization, asta pentru cine nu prea stie despre ce e vorba.
Pe scurt e vorba de salvarea unui array asociativ intr-un fisier, de fapt despre crearea unui string dintr-un array asociativ, in BGT obiectul dictionary.
Imi place ca acum se arata si timpul procesului de compilare, ca se poate alege ca o sursa sa fie compilata ca debug sau release build.
Alte functii noi pot fi utile, cum ar fi is_admin(), uneori este necesar sa vedem daca putem scrie sau nu in registri, daca putem scrie fisiere in anumite locuri etc. Toate acestea se puteau verifica si inainte, doar ca avand o functie din start care verifica un lucru, nu mai est enecesar sa ne batem capul cu artificiile.
Tot asa mi-ar fi placut o functie nativa pentru a verifica daca este o conexiune ok la internet, desi foarte usor se poate crea functia is_connection_available(), functie in care sa se vada daca headerele de la Google sunt accesabile, probabil site-ul Google e unul dintre cele mai sigure disponibile la un moment dat.
Desigur ca m-am si grabit sa recompilez jocul de table, maine voi recompila si celelalte jocuri, mai ales ca in unele nu am avut rabdare sa scot comportamentul aiurea in afara ferestrei cand e JAWS pornit si keyhook installed, acum acest lucru e implicit.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
-
- Plutonier
- Mesaje: 110
- Membru din: 10 Iul 2012, 13:39
- Localitate: timisoara
- Contact:
buna
dupa o lunga absenta de pe forum m-am gandit sa mai fac putina programare in bgt.
daca va mai aduceti aminte v-am intrebat oare cum pot face un mini duel iar domnul Manu m-a intrebat la ce ma refer.
acuma va dau raspunsul la ce ma refer.
cand spun mini duel ma refer la un duel de genul jocului pontes duel de aceea va rog explicatimi putin cum pot face chestia asta.
dupa o lunga absenta de pe forum m-am gandit sa mai fac putina programare in bgt.
daca va mai aduceti aminte v-am intrebat oare cum pot face un mini duel iar domnul Manu m-a intrebat la ce ma refer.
acuma va dau raspunsul la ce ma refer.
cand spun mini duel ma refer la un duel de genul jocului pontes duel de aceea va rog explicatimi putin cum pot face chestia asta.
- Manu
- General de divizie
- Mesaje: 4120
- Membru din: 02 Feb 2007, 01:15
- Localitate: Cluj-Napoca
- Contact:
Cea mai simpla varianta ar fi pentru inceput crearea modului antrenament din Pontes Duel, sectiunea Training Mode.
Pentru aceasta ideea ar fi:
Creezi doua variabile globale x si y, unde x este jucatorul, y calculatorul.
Instantiezi de asemenea doua obiecte de tip sound, unul pentru pasul tau si unul pentru pasul calculatorului.
sound pasX, pasY;
In pontes duel, deplasarea stanga dreapta este permisa intre -12 si +12, adica proprietatea pan a pasilor poate fi intre aceste doua valori, de asemenea x si y nu au voie sa iasa dintre ele.
Mai setezi volumul celor doua sunete de pasi sa fie diferit, al calculatorului sa zicem _10, iar al tau sa zicem 0, astfel incat primul sa se auda mai indepartat:
pasX=0;
pasY=-10;
Setezi pozitia calculatorului, adica valoarea y, undeva aleatoriu intre -12 si +12, apoi setezi corespunzator si proprietatea pan a lui pasY:
y=random(-12, 12);
pasY=y;
La apasarea sagetilor stanga dreapta, faci ca x sa fie decrementat, si respectiv incrementat , astfel incat sa fie senzatia unei deplasari; concomitent setezi corespunzator si proprietatea pan a lui pasX.
Sunetul pasY ar trebui sa se tot auda la intervale regulate, astfel incat sa il poti gasi. Pentru a face sa se auda un sunet la intervale regulate, trebuie sa folosesti si un timer:
timer t; // timerul este instantiat undeva in afara while-ului.
Apoi in while, codul pentru a fi redat sunetul de pas al calculatorului la un interval de 10 secunde ar fi:
if(t.elapsed>10000)
{
pasY.play();
t.restart();
}
Asadar cand valoarea elapsed a lui t a trecut de 10000 milisecunde, sunetul este auzit si valoarea proprietatii elapsed a lui t este readusa la 0, moment din care iar creste pentru a se indeplini conditia pentru redare pasY dupa alte 10 secunde.
Ramane apoi doar implementarea partii de tragere cu arma.
Aici e nevoie de tasta spatiu, pentru a verifica atunci cand este apasata daca x este egal cu y. Daca se indepineste la apasarea tastei spatiu conditia x==y, inseamna ca jucatorul este fix in fata calculatorului, ma refer la personaje desigur, ceea ce inseamna ca a fost nimerire in plin si se poate incrementa o eventuala variabila scoreX cu 1.
La fiecare nimerire, trebuie rechemata functia random pentru a plasa calculatorul in alta pozitie.
Am prezentat in mare care ar fi modul de programare al unui mini---duel, desigur ca este nevoie si de alte elemente, gen sunet pentru strigatul cauzat de nimerire etc.
Pentru a face ca si oponentul virtual sa se plimbe, intervin lucruri mai complexe, in aceasta privinta fiind mai usor ca y sa fie schimbat de un alt jucator prin retea decat de calculator. Aici conteaza mult creativitatea, cum il convingi pe calculator sa se comporte cat mai aproape de un player uman, sa fuga de tine, sa vina dupa tine etc, aceasta este partea de AI (Artificial Inteligence).
In Pontes Duel, din cate se poate observa, partea de joc contra calculatorului nu este prea reusita, desi am folosit o multime de randomuri cu parametri in functie de alte randomuri si factori gen arma incarcata / descarcata, flashbang activat / dezactivat etc, dar sa nu intram in amanunte pentru ca inca nu e momentul potrivit.
Ia-o treptat si mai bine arata ce faci, astfel incat sa te putem ajuta pe masura ce progresezi.
Pentru aceasta ideea ar fi:
Creezi doua variabile globale x si y, unde x este jucatorul, y calculatorul.
Instantiezi de asemenea doua obiecte de tip sound, unul pentru pasul tau si unul pentru pasul calculatorului.
sound pasX, pasY;
In pontes duel, deplasarea stanga dreapta este permisa intre -12 si +12, adica proprietatea pan a pasilor poate fi intre aceste doua valori, de asemenea x si y nu au voie sa iasa dintre ele.
Mai setezi volumul celor doua sunete de pasi sa fie diferit, al calculatorului sa zicem _10, iar al tau sa zicem 0, astfel incat primul sa se auda mai indepartat:
pasX=0;
pasY=-10;
Setezi pozitia calculatorului, adica valoarea y, undeva aleatoriu intre -12 si +12, apoi setezi corespunzator si proprietatea pan a lui pasY:
y=random(-12, 12);
pasY=y;
La apasarea sagetilor stanga dreapta, faci ca x sa fie decrementat, si respectiv incrementat , astfel incat sa fie senzatia unei deplasari; concomitent setezi corespunzator si proprietatea pan a lui pasX.
Sunetul pasY ar trebui sa se tot auda la intervale regulate, astfel incat sa il poti gasi. Pentru a face sa se auda un sunet la intervale regulate, trebuie sa folosesti si un timer:
timer t; // timerul este instantiat undeva in afara while-ului.
Apoi in while, codul pentru a fi redat sunetul de pas al calculatorului la un interval de 10 secunde ar fi:
if(t.elapsed>10000)
{
pasY.play();
t.restart();
}
Asadar cand valoarea elapsed a lui t a trecut de 10000 milisecunde, sunetul este auzit si valoarea proprietatii elapsed a lui t este readusa la 0, moment din care iar creste pentru a se indeplini conditia pentru redare pasY dupa alte 10 secunde.
Ramane apoi doar implementarea partii de tragere cu arma.
Aici e nevoie de tasta spatiu, pentru a verifica atunci cand este apasata daca x este egal cu y. Daca se indepineste la apasarea tastei spatiu conditia x==y, inseamna ca jucatorul este fix in fata calculatorului, ma refer la personaje desigur, ceea ce inseamna ca a fost nimerire in plin si se poate incrementa o eventuala variabila scoreX cu 1.
La fiecare nimerire, trebuie rechemata functia random pentru a plasa calculatorul in alta pozitie.
Am prezentat in mare care ar fi modul de programare al unui mini---duel, desigur ca este nevoie si de alte elemente, gen sunet pentru strigatul cauzat de nimerire etc.
Pentru a face ca si oponentul virtual sa se plimbe, intervin lucruri mai complexe, in aceasta privinta fiind mai usor ca y sa fie schimbat de un alt jucator prin retea decat de calculator. Aici conteaza mult creativitatea, cum il convingi pe calculator sa se comporte cat mai aproape de un player uman, sa fuga de tine, sa vina dupa tine etc, aceasta este partea de AI (Artificial Inteligence).
In Pontes Duel, din cate se poate observa, partea de joc contra calculatorului nu este prea reusita, desi am folosit o multime de randomuri cu parametri in functie de alte randomuri si factori gen arma incarcata / descarcata, flashbang activat / dezactivat etc, dar sa nu intram in amanunte pentru ca inca nu e momentul potrivit.
Ia-o treptat si mai bine arata ce faci, astfel incat sa te putem ajuta pe masura ce progresezi.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
- Manu
- General de divizie
- Mesaje: 4120
- Membru din: 02 Feb 2007, 01:15
- Localitate: Cluj-Napoca
- Contact:
Doar in scop didactic, nu ca ar fi utila in BGT o astfel de functie, pun mai jos un algoritm de transformare a unui numar natural arab in numar roman.
Daca gaseste cineva un alt algoritm mai eficient, il astept aici.
Nu am mai facut verificare sa nu se introduca numar negativ, ceea ce conteaza este algoritmul de convertire.
Cine nu isi da seama exact cum functioneaza, poate lua un numar si sa faca treptat calculele, urmarind scriptul.
Daca gaseste cineva un alt algoritm mai eficient, il astept aici.
Cod: Selectaţi tot
// Functie care returneaza string si are ca parametru un int:
string int_to_roman_numerals(int arab_number) {
// Variabila care va fi returnata in final:
string roman_number="";
/* Doua array-uri paralele in loc de unul asociativ,
sunt cuprinse intr-unul ca stringuri toate valorile diferite care pot exista in numeralul roman,
iar in altul sunt valorile corespondente in numere arabe.
*/
string[] roman={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int[] arab={1000,900,500,400,100,90,50,40,10,9,5,4,1};
/* Ambele array-uri au cate 13 valori.
Mergem intr-un for de la prima cea mai mare pana la ultima cea mai mica.
*/
for(int i=0; i<arab.length(); i++) {
/* Efectuam o impartire a numarului arab de convertit la valoarea curenta din array-ul int,
rezultatul impartirii fiind ocurenta valorii de tip roman din array-ul de tip string.
*/
int occurrence=arab_number/arab[i];
// Dupa ce am determinat de cate ori trebuie sa fie scrisa o valoare romana, scadem din numarul arab ceea ce s-a consumat:
arab_number%=arab[i];
/* Acum intr-un for adaugam valorii de tip string de returnat valoarea corespunzatoare din array-ul roman, de cate ori trebuie sa apara, deci de occurrence ori.
*/
for(int j=1; j<=occurrence; j++) {
roman_number+=roman[i];
}
}
// Returnam valoarea finala:
return roman_number;
}
/* Un exemplu de utilizare, apare un input_box in care se scrie un numar,
dupa care apare intr-un alert() rezultatul.
*/
void main() {
int x=string_to_number(input_box("Convertire...", "Scrieti un numar: "));
alert("Rezultat...", ""+x+" convertit in numar roman este "+int_to_roman_numerals(x)+".");
exit();
}
Cine nu isi da seama exact cum functioneaza, poate lua un numar si sa faca treptat calculele, urmarind scriptul.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Nu am cronometrat cat dureaza calculele, dar cred ca nici nu conteaza prea mult viteza, fiindca probabil ca nu exista volume foarte mari de numere romane care sa trebuiasca convertite, insa am gasit mai multe module in Perl care convertesc intre numere arabe si romane. Un exemplu este:
use Roman;
$arabic = arabic($roman) if isroman($roman);
$roman = Roman($arabic);
$roman = roman($arabic);
Si am mai vazut si alte module care fac acelasi lucru, iar unele spun ca returneaza codul Unicode pentru numere romane. Cu ocazia asta am aflat ca exista coduri Unicode si pentru numere romane.
Ce e drept, nu am avut niciodata nevoie sa fac calcule cu numere romane.
use Roman;
$arabic = arabic($roman) if isroman($roman);
$roman = Roman($arabic);
$roman = roman($arabic);
Si am mai vazut si alte module care fac acelasi lucru, iar unele spun ca returneaza codul Unicode pentru numere romane. Cu ocazia asta am aflat ca exista coduri Unicode si pentru numere romane.
Ce e drept, nu am avut niciodata nevoie sa fac calcule cu numere romane.
- Manu
- General de divizie
- Mesaje: 4120
- Membru din: 02 Feb 2007, 01:15
- Localitate: Cluj-Napoca
- Contact:
Sigur e vorba de calcule care se efectueaza foarte repede, mai ales ca pentru convertirea din arab in roman se lucreaza doar cu impartiri de numere intregi...
Vad ca Perl are module cam pentru orice, mai ales cand in discutie intra si ceva ce tine de string-uri.
Oare ce valori romane sunt in Unicode? cele absolut diferite: I, V, X, L, C, D si M? Le stie Eloquence?
Cand am dat exemplu de mai sus ma gandeam doar la algoritm, poate daca ar cere cineva pe loc sa fie gasita o metoda programatica de convertire a unui numar arab in numar roman, nu ar veni una instant in minte.
Vad ca Perl are module cam pentru orice, mai ales cand in discutie intra si ceva ce tine de string-uri.
Oare ce valori romane sunt in Unicode? cele absolut diferite: I, V, X, L, C, D si M? Le stie Eloquence?
Cand am dat exemplu de mai sus ma gandeam doar la algoritm, poate daca ar cere cineva pe loc sa fie gasita o metoda programatica de convertire a unui numar arab in numar roman, nu ar veni una instant in minte.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Da intr-adevar, Perl are foarte multe module pentru o gramada de chestii, iar pentru string-uri este clar cel mai potrivit limbaj.
Nu am folosit module care genereaza caractere Unicode pentru numere latine, asa ca nu am idee cum sunt formate si nici nu stiu daca sunt accesibile pentru Jaws, insa am o banuiala ca nu sunt.
Asta fiindca nu prea am intalnit astfel de caractere niciodata pe care sa le citeasca Jaws. Ma gandesc ca probabil fiindca sunt destul de rar folosite, vazatorii nu se obosesc sa introduca cine stie ce caractere ciudate cand pot folosi simple litere, asa ca interesul pentru varianta Unicode cred ca nu este prea mare.
Nu am folosit module care genereaza caractere Unicode pentru numere latine, asa ca nu am idee cum sunt formate si nici nu stiu daca sunt accesibile pentru Jaws, insa am o banuiala ca nu sunt.
Asta fiindca nu prea am intalnit astfel de caractere niciodata pe care sa le citeasca Jaws. Ma gandesc ca probabil fiindca sunt destul de rar folosite, vazatorii nu se obosesc sa introduca cine stie ce caractere ciudate cand pot folosi simple litere, asa ca interesul pentru varianta Unicode cred ca nu este prea mare.
Am testat un modul care returneaza caractere unicode pentru numerele romane, iar pentru cifra 14 a returnat: ⅩⅠⅤ
Vad ca sunt 3 caractere, deci probabil ca scrie XIV
Dar evident, nu este accesibil pentru Jaws. Cine stie daca functioneaza cu modificari in dictionar... insa cred ca nu prea este ceva util cu adevarat.
Vad ca sunt 3 caractere, deci probabil ca scrie XIV
Dar evident, nu este accesibil pentru Jaws. Cine stie daca functioneaza cu modificari in dictionar... insa cred ca nu prea este ceva util cu adevarat.
-
- Capitan
- Mesaje: 503
- Membru din: 12 Sep 2009, 21:00
- Localitate: Bucuresti
Salutare.
Iata ca ma mai joc si eu din cand in cand cu BGT-ul....
Am descarcat ultima versiune, am facut un meniu dar.....
Cand il deschid imi arata compilation result, unde imi spune ceva de genul: "menu_result not initialised".
Sunt sigur ca exact cum am procedat acum, am procedat si in alte dati si nu am patit asa ceva.
Mentionez ca la acel compilation result am si buton de continue, deci n-are cum sa fie eroare aia... Sau este?
Care ar putea fi problema?
Iata ca ma mai joc si eu din cand in cand cu BGT-ul....
Am descarcat ultima versiune, am facut un meniu dar.....
Cand il deschid imi arata compilation result, unde imi spune ceva de genul: "menu_result not initialised".
Sunt sigur ca exact cum am procedat acum, am procedat si in alte dati si nu am patit asa ceva.
Mentionez ca la acel compilation result am si buton de continue, deci n-are cum sa fie eroare aia... Sau este?
Care ar putea fi problema?
Stefan
- Manu
- General de divizie
- Mesaje: 4120
- Membru din: 02 Feb 2007, 01:15
- Localitate: Cluj-Napoca
- Contact:
Nu imi pot da seama, eventual trimite fisierul si iti raspund aici.
Nu s-a schimbat nimic, totul e backward compatible.
Nu s-a schimbat nimic, totul e backward compatible.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
-
- Capitan
- Mesaje: 503
- Membru din: 12 Sep 2009, 21:00
- Localitate: Bucuresti
Ok, pun mai jos un link cu fisierul buclucas.
https://dl.dropboxusercontent.com/u/84997815/game.bgt
https://dl.dropboxusercontent.com/u/84997815/game.bgt
Stefan
-
- Capitan
- Mesaje: 503
- Membru din: 12 Sep 2009, 21:00
- Localitate: Bucuresti
As mai avea o mica problema. Pe anterioara am rezolvat-o.
Dar cu toate ca meniul e facut corect, nu stiu de ce nu mi se activeaza prima optiune din meniu, cea care ar fi trebuit sa imi deschida un submeniu. In loc sa faca chestia asta, imi scoate programul din ram. Stie cineva de ce?
Pun mai jos codul la corectat.
#include "dynamic_menu.bgt"
tts_voice voice;
sound song;
int menu_result;
void main()
{
show_game_window("Testing game");
voice.speak_wait("This is a test version. Some options might not work properly.");
meniu();
}
void meniu()
{
song.play();
song.stream("Sounds/song1.ogg");
song.volume=-10;
song.play_looped();
dynamic_menu mainmenu;
mainmenu.wrap=true;
mainmenu.add_item_tts("Start game");
mainmenu.add_item_tts("bonus games");
mainmenu.add_item_tts("configuration");
mainmenu.add_item_tts("test speakers");
mainmenu.add_item_tts("Exit");
menu_result==mainmenu.run("Main menu. Use up and down arrow keys to choose an option, then press enter.", true);
if(menu_result==-1)
{
voice.speak_wait("Error. Exiting...");
exit();
}
if(menu_result==1)
{
house();
}
if(menu_result==2)
{
exit();
}
if(menu_result==3)
{
exit();
}
if(menu_result==4)
{
exit();
}
if(menu_result==5)
{
voice.speak_wait("Exiting program...");
exit();
}
}
void house()
{
dynamic_menu housemenu;
housemenu.allow_escape=true;
housemenu.wrap=false;
housemenu.add_item_tts("Bedroom");
housemenu.add_item_tts("Livingroom");
housemenu.add_item_tts("Kitchen");
housemenu.add_item_tts("Bathroom");
housemenu.add_item_tts("Leave outside");
menu_result=housemenu.run("Choose where would you like to go.", true);
if(menu_result==0)
{
meniu();
}
}
Dar cu toate ca meniul e facut corect, nu stiu de ce nu mi se activeaza prima optiune din meniu, cea care ar fi trebuit sa imi deschida un submeniu. In loc sa faca chestia asta, imi scoate programul din ram. Stie cineva de ce?
Pun mai jos codul la corectat.
#include "dynamic_menu.bgt"
tts_voice voice;
sound song;
int menu_result;
void main()
{
show_game_window("Testing game");
voice.speak_wait("This is a test version. Some options might not work properly.");
meniu();
}
void meniu()
{
song.play();
song.stream("Sounds/song1.ogg");
song.volume=-10;
song.play_looped();
dynamic_menu mainmenu;
mainmenu.wrap=true;
mainmenu.add_item_tts("Start game");
mainmenu.add_item_tts("bonus games");
mainmenu.add_item_tts("configuration");
mainmenu.add_item_tts("test speakers");
mainmenu.add_item_tts("Exit");
menu_result==mainmenu.run("Main menu. Use up and down arrow keys to choose an option, then press enter.", true);
if(menu_result==-1)
{
voice.speak_wait("Error. Exiting...");
exit();
}
if(menu_result==1)
{
house();
}
if(menu_result==2)
{
exit();
}
if(menu_result==3)
{
exit();
}
if(menu_result==4)
{
exit();
}
if(menu_result==5)
{
voice.speak_wait("Exiting program...");
exit();
}
}
void house()
{
dynamic_menu housemenu;
housemenu.allow_escape=true;
housemenu.wrap=false;
housemenu.add_item_tts("Bedroom");
housemenu.add_item_tts("Livingroom");
housemenu.add_item_tts("Kitchen");
housemenu.add_item_tts("Bathroom");
housemenu.add_item_tts("Leave outside");
menu_result=housemenu.run("Choose where would you like to go.", true);
if(menu_result==0)
{
meniu();
}
}
Stefan
- Manu
- General de divizie
- Mesaje: 4120
- Membru din: 02 Feb 2007, 01:15
- Localitate: Cluj-Napoca
- Contact:
Pe prima o puteai rezolva initializand cu o valoare, sa zicem 0, variabila declarata local:
int menu_result=0;
Deci nu era nevoie sa o faci globala. BGT iti dadea doar un avertisment ca nu este initializata, asadar spunand doar int menu_result, asa cum e in C sau C++, variabila ar fi avut o valoare aleatorie, pastrand ceea ce se gasea pe acolo prin rami. Asadar, ca sa fie sigur, mai bine ii dai o valoare, cea pe care te astepti si tu sa o primeasca cel mai probabil, de exemplu 1 pentru Start game. Daca prin absurd se intampla ceva si nu se schimba valoarea, dar se ajungea la decizia ce sa se intample, macar pornea jocul.
Cea de-a doua problema este legata tot de menu_result care are valoarea aleatorie dupa rularea meniului, deci tocmai se confirma de ce era mai bine sa o initializezi local cu o valoare.
Acolo ai pus:
menu_result==mainmenu.run("Main menu. Use up and down arrow keys to choose an option, then press enter.", true);
Apare semnul egal de doua ori, deci nu se atribuie nici o valoare lui menu-result, ceea ce face sa nu fie nici 1 pentru Start game, nici 2, 3 sau 4 pentru optiunile urmatoare. Taie un egal ca sa fie atribuire, nu comparatie.
Ai fi avut o sansa de 1 la 4294967296 sa se nimereasca totusi 1, asta fiindca valoarea aleatorie data variabilei declarate este un int de 32 de biti, deci 2 la puterea 32.
Sa pui la orice test o fereastra cu show_game_window(), altfel daca dam un Alt + Tab nu mai putem avea control asupra programului si trebuie sa il inchidem din Task manager.
int menu_result=0;
Deci nu era nevoie sa o faci globala. BGT iti dadea doar un avertisment ca nu este initializata, asadar spunand doar int menu_result, asa cum e in C sau C++, variabila ar fi avut o valoare aleatorie, pastrand ceea ce se gasea pe acolo prin rami. Asadar, ca sa fie sigur, mai bine ii dai o valoare, cea pe care te astepti si tu sa o primeasca cel mai probabil, de exemplu 1 pentru Start game. Daca prin absurd se intampla ceva si nu se schimba valoarea, dar se ajungea la decizia ce sa se intample, macar pornea jocul.
Cea de-a doua problema este legata tot de menu_result care are valoarea aleatorie dupa rularea meniului, deci tocmai se confirma de ce era mai bine sa o initializezi local cu o valoare.
Acolo ai pus:
menu_result==mainmenu.run("Main menu. Use up and down arrow keys to choose an option, then press enter.", true);
Apare semnul egal de doua ori, deci nu se atribuie nici o valoare lui menu-result, ceea ce face sa nu fie nici 1 pentru Start game, nici 2, 3 sau 4 pentru optiunile urmatoare. Taie un egal ca sa fie atribuire, nu comparatie.
Ai fi avut o sansa de 1 la 4294967296 sa se nimereasca totusi 1, asta fiindca valoarea aleatorie data variabilei declarate este un int de 32 de biti, deci 2 la puterea 32.
Sa pui la orice test o fereastra cu show_game_window(), altfel daca dam un Alt + Tab nu mai putem avea control asupra programului si trebuie sa il inchidem din Task manager.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
In forum linguae Latinae venite! (via est: www.limbalatina.ro)