Prikaži potpunu verziju : zSlot
Napravio sam igricu u C++ jeziku koristeci Allegro biblioteke. U pitanju je Slot igra. (nazvao sam je zSlot :D)
Download link: (Linux + Windows | +source codes)
http://www.sendspace.com/file/dwmhz5
Za Windows verziju, kompajlirao sam je na Windows XP koristeci DevC++.
Na Linux Ubuntu 10.10, sa CodeBlocks 10.05 (Sad ne znam da li ona moze da radi i na drugim distribucijama Linuxa)
Sto se tice bagova, mislim da ih nema. Kod mene igrica lepo radi.
Sad ima jedan mali problemcic. Kada biram slotove u koje zelim da smjestim vockice, koristim dugmad 4, 5 i 6. Sada kad ja brzo pritisnem kombinaciju 4, 4, 4 - U vecini slucajeva dobijem iste vocke. Koristio sam srand(time(NULL)); ali kako ona radi u odnosnu na vrijeme, znaci ima veze sa tim sto brzo pritiskam. Ako sacekam neki vremenski interval od 1 sekunde izmedju svakog pritiska na tastere, onda je sve OK. Ne znam kako ovo da sredim.
Uglavnom. Igrica je gotova (osim te stvari koju sam gore naveo).
Prihvatam svaki savjet/komentar, svaku kritiku u vezi koda i igrice. Testirajte malo... Postoji readme file u kome pisu komande.. :D
ps. Prvi put u zivotu da sam koristio klase. Malo sam citao o njima prije nego sto sam poceo da radim ovaj projekat, pa sam odlucio da odradim sa klasama.
Nije lose mada treba jos da poradis, kao prvo sto nisi stavio okolo neke labele za start kontrole itd, nema ih puno.
I sto nemoze na x da iskljuci igra, morao sam je u TM ubiti.
I sto zdere 50% dc procesora, strasno.
Radi na Win7 x64.
Izlazis na ESC dugme, pise u readme.txt.
Sto se tice toga za procesor, to ne znam kako da sredim....
Sto se tice X dugmeta, Probacu da odradim....
Samo primjetio sam kod druga. Nnjemu na XP kad pokusa da pokrene prijavi Dont Send gresku :/, kod drugog na Win7 32 radi odlicno, na moj XP 32bit-a, radi takodje...
NISAM NESTO SMART
5.1.2011, 20:37
Izgleda lepo grafika i što je najbitnije funkcijonalno je, ali pokusaj ubaciti GUI nista posebno samo dugmice bice mnogo jednostavnije, a ako ostane ovako neki deo gde pisu komande, takodje ubaci da mogu da izadjem i klik na x na prozorcetu..neki jednostavan meni i highscor i to je to :D
Izgleda veoma lepo svaka cast :D
[QUOTE=clzola;1225891Sad ima jedan mali problemcic. Kada biram slotove u koje zelim da smjestim vockice, koristim dugmad 4, 5 i 6. Sada kad ja brzo pritisnem kombinaciju 4, 4, 4 - U vecini slucajeva dobijem iste vocke. Koristio sam srand(time(NULL)); ali kako ona radi u odnosnu na vrijeme, znaci ima veze sa tim sto brzo pritiskam. Ako sacekam neki vremenski interval od 1 sekunde izmedju svakog pritiska na tastere, onda je sve OK. Ne znam kako ovo da sredim.[/QUOTE]
srand funkcija sluzi da seedujes generator nasumicnih brojeva.
ispravno je resenje seed-ovati random funkciju trenutnim vremenom ali seed treba da uradis samo jedanput!
Seed se ne radi svaki put kada zelis da kreiras novi nasumicni broj, tada koristis samo Rand();
Inace, sve i da bas hoces svaki put da seedujes, ne mogu da verujem da ne mozes da smislis resenje ukoliko se pritisne vise puta u sekundi.... pa postoji bezbroj resenja, covece. npr, napravi varijablu koju ces na svaki stisak dugmeta povecati za jedan i seeduj sa srand(time(NULL) + varijabla); i eto, kolko god da lupa, nece dobiti dva puta istu vrednost seed-a za redom.
Savetujem ti da naucis da razmislis o problemu i iskoristis kreativnost pre nego sto odustanes i pomislis "ne umem ovo da resim".
I to je najbolji savet koji mogu bilo kome bilo kada da dam, sto se tice programiranja.
Nisam odustao od problema :D
Samo sam htio da pitam za pomoc :)
Uglavnom, ovim projektom cu se baviti do kraja Januara.
-Sredio sam ovo za seedovanje.
-Sredio sam za X dugme.
Download link:
http://www.sendspace.com/file/jjzdh5
Planiram:
- Sredim problem zasto kod druga ne moze da se upali (Javlja mu Dont Send)
- Da napravim tablu sa komandama
Sad ovo za dugmice. Sad ovako kad gledam, za dugme. Posto radim u Allegro, mislim da toga nema. Jedino da napravim neki BMP postavim na odredjene koordinate, i onda napravim nesto kao IsClick() funkciju koja ce da provjerava da i sam kliknuo na koordinate koje odgovaraju dugmetu i klasu Dugme.... :/ ?
Interesuje me takodje sta mislite za kod. Da li je sve kako treba :D (Pokusacu da ga optimizujem )
Kad sam jos jednom pogledao kod jasno mi je sto tako zdere procesor, totalni si pogresio dizajn, jer puno puta se u toj velikoj while petlji pozivaju neke funkcije pa to zdere procesor.
Za ovu sto ti radis moras da upotrebis event driven programing, isto kao sto i svaki GUI radi, kada se nesto desi zainteresovana strana se obavesti. Ti ovde stalno proveravas da li nesto pritisnuto, a ne treba to tako. Za dogadjaje sam prvi put saznao u C#, tako da ti nemogu odmah pomoci, mada izvodljivi su i u C++ samo malo vise kucanja i vise opreznosti.
Btw. i sto crni sine koristis goto naredbu to je zlo :D mani se toga osim ako ne programiras u Basicu
Hvala za savjete. Bas cu da istrazim na tu temu. A i smislicu neku caku da maknem tu goto komandu.
Postoji jedan mali problem.
Dao sam jednom drugu igricu. Kad pokrene kaze mu dont send. (Windows XP)
Drugom takodje sam dao. Kad pokrene kaze mu zSlot.exe stopped working (Windows 7)
Ostalima za sada radi kako treba.
Da nije nesto sa rezolucijom ili ono 32bita (da stavim 16, 8 :/)
Hvala za savjete. Bas cu da istrazim na tu temu. A i smislicu neku caku da maknem tu goto komandu.
Postoji jedan mali problem.
Dao sam jednom drugu igricu. Kad pokrene kaze mu dont send. (Windows XP)
Drugom takodje sam dao. Kad pokrene kaze mu zSlot.exe stopped working (Windows 7)
Ostalima za sada radi kako treba.
Da nije nesto sa rezolucijom ili ono 32bita (da stavim 16, 8 :/)
Ne radi ni meni... Ni na XP, ni na W7... Primećujem kako se prozor pojavi i iznenada nestane, ali, to je to... Možda da ubaciš neki LOG?
I meni se desava isto to.
Prvo da kažem svaka čast, izgleda veoma lepo :tapsh::aplauz:
Još samo da ubaciš zvuk i extra :tapsh:
Što se tiče greške koju si pomenuo, da ova igra ne radi kod tvojih prijatelja, imam par saveta koje možeš da probaš, nisam nikad koristio allegro a ni DevC++ tako da samo nagađam:
1. Uveri se da si ovo kompajlirao kao "Release build", isto i za sve ostale biblioteke koje si koristio u ovom projektu da nisu "Debug" verzije?
2.Veoma je moguće da za neke od biblioteka koje koristiš u projektu da kad "distribuiraš" igru korisničke mašine moraju da imaju instalirane njihove "redistributable packages", ako ne možeš da nađeš koji fale probaj da sve statički linkuješ sa tvojom aplikacijom/igrom, pretpostavljam da u DevC++-su imas negde opcije vezano za linker pa pogledaj tamo da izmeniš.
Da se nadovežem na Belphegora, za Windows imaš Dependency Walker (http://www.dependencywalker.com/) da vidiš sve biblioteke koje su potrebne krajnjem korisniku, pa da ih onda distribuiraš sa izvršnom. Nije mi pri ruci laptop da isprobam i linux verziju, ali ne bi trebalo da bude takvih problema :D
I btw, dodaj Makefile :)
Ja ću samo jednu kritiku da izložim, ono što mi je prvo zapalo za oči i na čemu treba mnogo više pažnje da obraćaš su BMP fajlovi u data direktorijumu. Malo su ti preveliki. Za background si koristio fajl od 2,3mb i to jednobojni. Postoji funkcija koja će da ti oboji pozadinu forme u željenu boju tako da ti ova fotografija totalno beskorisna osim što jede memoriju bez razloga. Isto tako i sve ostale fotografije mogu da se kompresuju, što bi prvo trebalo da učiniš.
@Todors: To sam i ja zapazio da silni .bmp-ovi zato igra u memoriji zauzima skoro 50mb sto je zesce bacanje resursa, verovatno moze to i sa .jpg ili .gif slikama.
Bio sam otsutan za praznike ... :D
Sredio sam to za bmp. Sada koristi jpg slike. Posto nista vise nisam mijenjao necu uplodovati. Pokusavam da sredim Allegro 5 na WindowsXP u VirtualBox-u a onda cu da napisem potpuno nov kod sa ovim eventima.
Vama kojima igrica ne moze da se pokrene. Mislim da znam u cemu je problem.
Desktop rezolucija mora biti veca od 1024x768 (rezolucija zSlot igre). U slucaju da su ove dvije rezolucije iste, igrica se ne moze pokrenuti....
A ovo sa Dependency Walker sam se samo pogubio xD
U zavisnosti od komponenti (i kako su linkovane) koje si koristio sa allegro-m treba da znas sta "fali" korisnickom racunaru. Skinuo sam allegro sdk samo da bi video "read me", evo bitnog dela iz dokumenta koji treba da procitas:
Library dependencies
====================
Allegro is divided into a core library and a number of addon libraries.
The core library depends on certain libraries to function. If you don't have
those, nothing will work. These are required for the core library:
- DirectX SDK (Windows only)
You can get this for MSVC from the Microsoft web site (large download).
Alternatively, smaller downloads for MSVC and MinGW are available here:
<http://trent.gamblin.ca/dx/>
Some of those are originally from:
<http://www.g-productions.net/list.php?c=files_devpak>
- X11 development libraries (Linux/Unix only)
The libraries will be part of you Linux distribution, but you may have to
install them explicitly.
- OpenGL development libraries (except on Windows)
The addons, too, may require additional libraries. Since the addons are
strictly optional, they are not required to build Allegro, but a lot of
functionality may be disabled if they are not present.
Windows users may find some precompiled binaries from
<http://gnuwin32.sourceforge.net/>. You need to get the `bin` and `lib`
packages. The `bin` packages contain DLLs, and the `lib` packages contain the
headers and import libraries.
Mac users may find some dependencies in Fink or MacPorts.
<http://www.finkproject.org/> and <http://www.macports.org/>
Linux users likely have all the dependencies already, except PhysicsFS
and DUMB. If your distribution uses separate development packages, they
will need to be installed. The packages are probably named *-dev or *-devel.
These are the dependencies required for the addons:
- libpng and zlib, for PNG image support (Unix and older MinGW only)
Home page: <http://www.libpng.org/pub/png/>
Windows binaries: <http://gnuwin32.sourceforge.net/packages/libpng.htm>
- libjpeg, for JPEG image support (Unix and older MinGW only)
Home page: <http://www.ijg.org/>
Windows binaries: <http://gnuwin32.sourceforge.net/packages/jpeg.htm>
- FreeType, for TrueType font support.
Home page: <http://freetype.sourceforge.net/>
Window binaries: <http://gnuwin32.sourceforge.net/packages/freetype.htm>
- Ogg Vorbis, a free lossy audio format. (libogg, libvorbis, libvorbisfile)
Home page: <http://www.vorbis.com/>
- FLAC, a free lossless audio codec. (libFLAC, libogg)
Home page: <http://flac.sourceforge.net/>
- DUMB, an IT, XM, S3M and MOD player library. (libdumb)
Home page: <http://dumb.sourceforge.net/>
- OpenAL, a 3D audio API.
The audio addon can use OpenAL, although the 3D capabilities aren't used.
<http://kcat.strangesoft.net/openal.html>
On Mac OS X, OpenAL is *required* but should come with the OS anyway.
On Linux and Windows, OpenAL will only be used if you request it, hence there
is no reason to install it specifically.
- PhysicsFS, provides access to archives, e.g. .zip files.
Home page: <http://icculus.org/physfs/>
On Windows it may be a pain to place all these libraries such that they can be
found. Please see the README_cmake.txt section on the "deps subdirectory"
when the time comes.
Da pitam nesto u vezi mog koda.
Tamo u klasi SLOT postoji funkcija koja provjerava koliko sam dobio poena u tom Slotu.
Sad posto je vecina vas gore navela da moja glavna while petlja zdere procesor zbog IF komandi, to jeste stalno provjerava uslov.
Sad kao sto vidite u funkciji za provjeravanje poena u slotu ima ok 50 IF-ova sa po 3 uslova. Sad trenutno ovako gledano, ne vidim drugi nacin da provjeravanje smanjim osim da pravim IF u IF na primer
//tamo stoji:
if(polje1 == polje2 && polje2 == polje3 && polje3 == BAR) { total += 300; }
/* Ovako dodje da se provjeravaju 3 uslova za samo 1 komvinaciju. Za jednu sliku/ikonicu/vockicu :D postoji 5 kombinacija. 5*3 = 15;
Ukupno 10 ikonica/slika/vockica = 15*10 = 150;
3 Slota = 3 * 150 = 450;
Svaki uslov se uvijek provjerava.
*/
//Predlog
if (polje1 == polje2) {
if(polje2 == polje 3) {
if(polje3 == BAR) {
Total += 300;
}
if(polje3 == Zvono) {
Total += 120;
}
}
}
/* Na ovaj nacin bih odmah na prvom uslovu odredio da li se sledeci uslov ispituje. Ako su sva tri polja ista, onda se ispituje koja je ikonica.
U najboljem slucaju ukupno bi bilo 5 provjera po slotu, ispitale bi se samo sledece kombinacije:
polje1 == polje2 prvi red
polje4 == polje5 drugi red
polje7 == polje8 treci red
polje1 == polje5 jedna diagonala
polje7 == polje5 druga diagonala
a u najgorem 50 po slotu (ako me matematika dobro sluzi :D) za sta su male sanse.
Srednji slucaj bi bio oko 10 uslova po jednom slotu
*/
Sta vi mislite.. ??
(Ako me matematika dobro sluzi onda bi trebalo da bude tako kako sam napisao. Jedino nisam siguran da za ovo: if(a1 == a2 && a2 == a3 && a3 == something) >> Ako je uslov a1==a2 netacan, da li se ostali provjeravaju ili je tu odmah break ??)
//Predlog
if (polje1 == polje2) {
if(polje2 == polje 3) {
if(polje3 == BAR) {
Total += 300;
}
if(polje3 == Zvono) {
Total += 120;
}
}
}
Ovo je bolje od onog što si prvo put napisao, ali i ovde ti fali ako su 1. i 3. jednaki.
Evo kako bi npr. ja uradio:
if(polje1 == polje2 && polje2 == polje3)
{
if (polje1 == BAR)
total += 300;
else if(polje1 == zvono)
total += 120; //itd.
}
else if(polje1 == polje2 || polje1 == polje3)
{
if (polje1 == BAR)
total += 150;
else if(polje1 == zvono)
total += 60; //itd.
}
else if(polje2 == polje3)
{
if (polje2 == BAR)
total += 150;
else if(polje2 == zvono)
total += 60; //itd.
}
Po meni je ovo mnogo elegantniji pristup od tvog.
Sta vi mislite.. ??
(Ako me matematika dobro sluzi onda bi trebalo da bude tako kako sam napisao. Jedino nisam siguran da za ovo: if(a1 == a2 && a2 == a3 && a3 == something) >> Ako je uslov a1==a2 netacan, da li se ostali provjeravaju ili je tu odmah break ??)
Kakav crni break!!! Ovo ti nisu petlje, već uslovi. Ako prođe uslov, prošao je, a ako ne prođe zavšava uslov i ide na sledeći.
Dodam else if i jos vise smanjim (kao ti)!! :D
I u ovom slucaju sva 3 polja moraju biti jednaka (polje1 == polje2 i polje2 == polje3 ----- logicno je da je onda i polje1==polje3, sto ne mora da se pise)
Po ovome tvome (mislim) bi on dodao +300 na total ako su polje1 i polje3 na primer BAR a polje2 je npr Zvono.... Sva 3 polja moraju biti ista ikonica/slika/vockica...
if(polje1 == polje2)
if(polje2 == polje3) {
if(polje3 == BAR) Total += 300;
else if(polje3 == Zvono) Total += 120;
...
}
A ovo za break sam se izrazio pogresno, mislio sam na sledece
if(uslov1 && uslov2 && uslov3) { do() };
Ako je Uslov1: a1 == a2 : netacan da li ce on provjeriti uslov2 i uslov3 ?
Do sada sam uradio:
- Dodavanje poena na pocetku
- I onda sa eventima, biras slotove
- Provjera Totala
Uradicu:
- Meni
- Buttons
- Vi birate kontrole
- Gadjanje
- Mouse Events
Kakav crni break!!! Ovo ti nisu petlje, već uslovi. Ako prođe uslov, prošao je, a ako ne prođe zavšava uslov i ide na sledeći.
Sve ekspresije unutar if komande se evaluiraju pre nego sto se donese konacna odluka.
identicno je kao i matematika. Ukoliko napises 1 + (3 * (20+10)) prvo se izracuna 20+10, onda se izracuna 3 * 30 onda se izracuna 1 + 90 i na kraju dobije 91
isto tako se ponasa i if naredba, iz unutra ka spolja i na kraju evaluira sve.
ako nema unutrasnjih zagrada, isto kao i u matematici, ima redosled operacija.
mislim, osnove logike se uce pocetkom srednje skole, ako ne i u osnovnoj delom.
svi se valjda secate T i obrnuto T sa znakovima za operacije (i, ili, obrnuto)
ako ne, google i ucenje. nema programiranja bez poznavanja osnove logike.
a to ce vam pomoci i da nadjete elegantno resenje za zavrzlamu iz prethodnih postova
Kapiram ja to i, ili, TE i NETE i negacija :D
Samo me interesovalo to kako se IF komanda ponasa...
Dodam else if i jos vise smanjim (kao ti)!! :D
I u ovom slucaju sva 3 polja moraju biti jednaka (polje1 == polje2 i polje2 == polje3 ----- logicno je da je onda i polje1==polje3, sto ne mora da se pise)
Po ovome tvome (mislim) bi on dodao +300 na total ako su polje1 i polje3 na primer BAR a polje2 je npr Zvono.... Sva 3 polja moraju biti ista ikonica/slika/vockica...
Pogrešno misliš, pogledaj malo bolje.
if(polje1 == polje2)
if(polje2 == polje3) {
if(polje3 == BAR) Total += 300;
else if(polje3 == Zvono) Total += 120;
...
}
A ovo za break sam se izrazio pogresno, mislio sam na sledece
if(uslov1 && uslov2 && uslov3) { do() };
Ako je Uslov1: a1 == a2 : netacan da li ce on provjeriti uslov2 i uslov3 ?
Aha nisam te razumeo, a i bilo je kasno kada sam ga citao.
Da naravno da će proveravati sve, jer uslov gleda kao celinu jer on ne zna da li si koristio "I" ili "ILI" operator, da bi doneo konacnu odluku.
Sto se tice tvog koda u odnosu na moj, ne znam kako si zakljucio da je tvoj brzi i po kojoj logici. Pre svega imas jedan IF uslov vise od mene, ne proveravas polje1 i polje3. Moj kod moze jos da se unapredi ako zamenis redosled uslova, jer je procentualno veca verovatnoca de ce se izvuci 2 pogotka u odnosu na 3. Da ne kazem da je citljiviji.
Sve ekspresije unutar if komande se evaluiraju pre nego sto se donese konacna odluka.
identicno je kao i matematika. Ukoliko napises 1 + (3 * (20+10)) prvo se izracuna 20+10, onda se izracuna 3 * 30 onda se izracuna 1 + 90 i na kraju dobije 91
isto tako se ponasa i if naredba, iz unutra ka spolja i na kraju evaluira sve.
ako nema unutrasnjih zagrada, isto kao i u matematici, ima redosled operacija.
mislim, osnove logike se uce pocetkom srednje skole, ako ne i u osnovnoj delom.
svi se valjda secate T i obrnuto T sa znakovima za operacije (i, ili, obrnuto)
ako ne, google i ucenje. nema programiranja bez poznavanja osnove logike.
a to ce vam pomoci i da nadjete elegantno resenje za zavrzlamu iz prethodnih postova
Logika nije uvek tacna zavisi od kompajlera a i od operanata (da li su konstante ili promenjive) kako ce da optimizuje. Najbolje je da pogleda "Disassembly" za njegov kod pa da vidi sta se dogadja.
Oćeš da kažeš da svaki prevodilac drugačije tretira uslove. Verovatno si i u pravu. Za IL sam gotovo siguran da ovako tretira uslov, a za druge nisam. Verujem da i Bytecode radi na sličnom principu, ako ne i na istom.
@Todors
Da, svaki kompajler ima drugaciju semu kako ce da "prevodi" kod, ne postoji "standard" kako oni rade, sve zavisi od njihove implementacije.
@Cizola
Mislim da gledas pogresno mesto gde treba da radis optimizaciju, na brzinu sam pregledao kod pa da te pitam
zasto u petlji koristis ovo:
main.cpp
while(Quit == false)
{
DrawBuffer();
DrawOnNewSlot();
DrawBuffer();
if( j <= 9 )
{
...
}
else
{
clear_bitmap(NewSlot.bmp);
NewSlot.bmp = load_bitmap("data/NewSlot.bmp", NULL);//ova linija
DrawBuffer();
CalculateTotals();
...
}
ne znam kako radi funkcija "load_bitmap" ali se nadam da ne ucitava svaki put novu bitmap-u iako je vec ucitana? Ako je tako onda je greska koristiti ovo u petlji jer to oduzima "procesorsko vreme". Najbolje bi bilo da napravis kontenjer i ucitas sve u inicijalizacionom procesu (van petlje), recimo ovako:
#include <list>
...
struct BITMAPEx
{
BITMAP* bmp;
std::string name;
};
...
std::list<BITMAPEx*> lBitmaps;
...
//ucitava samo "unikatne" bitmape
BITMAPEx* LoadBitmap(std::string fileName, ostali argumenti)
{
bool haveBitmap = false;
list<BITMAPEx*>::iterator iBmp;
BITMAPEx* pBmp = 0;
if(!lBitmaps.empty())
{
for(iBmp = lBitmaps.begin(); iBmp != lBitmaps.end(); ++iBmp)
{
pBmp = *iBmp;
if(pBmp->name == fileName)
{
haveBitmap = true;
break;
}
}
}
if(!haveBitmap)
{
pBmp = new BITMAPEx;
pBmp.name = fileName;
pBmp.bmp = load_bitmap(fileName, NULL);
if(nije propalo ucitavanje bitmape)
{
//ubaci u listu
lBitmaps.insert(lBitmaps.end(), pBmp);
}
else
{
//odreaguj na gresku
pBmp = 0;
}
}
return pBmp;
}
...
//global
BITMAP *Icon[10];
BITMAP *Number[15];
...ostale BITMAP-e
...
void LoadBitmaps()
{
...
Icon[0] = LoadBitmap("data\\icon0.bmp");
if(0 == Icon[0])//greska
{
//odreaguj na gresku
}
...
}
void DestroyBitmaps()
{
for(i=0; i<10; i++)
destroy_bitmap( Icon[i] );
std::list<BITMAPEx*>::iterator iBmp;
BITMAPEx* pBmp;
for(iBmp = lBitmaps.begin(); iBmp != lBitmaps.end(); ++lBmp)
{
pBmp = *iBmp;
delete pBmp;
pBmp = 0;
}
...
}
Ovaj kod gore nije kompletan, mozda ima gresaka, treba da posluzi samo kao referenca.
Da ne bih ja nagadjao najbolje bi bilo da skines\uzmes neki profajler pa da vidis gde i sta ti najvise oduzima procesorsko vreme.
Koristim je za sledece:
Imas ukupno 9 kolona da popunis. (3 po slotu).
NewSlot.bmp je onaj slot koji ima samo 1 kolonu (3 reda). Na njega crtam slike koristeci funkciju draw_sprite(); Sada kada se popuni svih 9 kolona, taj slot mora da ostane prazan bez ikonice. Sobzirom da ja stalno crtam na njega, a nemam "gumicu" da izbrisem slike, ponovo lodujem taj slot da bi on bio prazan....
Mada sada pisem totalno novi kod sa Allegro 5. (i koliko do sad vidim ni tu nema "gumice").
@Todors
Da, svaki kompajler ima drugaciju semu kako ce da "prevodi" kod, ne postoji "standard" kako oni rade, sve zavisi od njihove implementacije.
Da naravno da je tako, samo što se svaki kompajler prilagođava ciljanom jeziku, odnosno jeziku na kojem taj kod treba da bude preveden. Što znači kada kompajler napravi kompilaciju (.exe fajl), asemblerski jezik je taj koji dalje prevodi instrukcije procesoru, a kompajler ovde ne igra nikakvu ulogu. Tako da je ovde bitnije kako asemblerski jezik čita i prevodi te instrukcije procesoru, a ne kako to radi kompajler.
NISAM NESTO SMART
9.1.2011, 19:44
Ali pazi postoji razlika izmedju prikazivanja slike na ekran i ocitavanje iz memorije, bar postoji u SDL neznam za Allegro ali pretpostavljam da je isti slucaj.Sad zasto jednostavno ne napravis ako vec hoces da nesto izbrises ako je neki uslov ispunjen ovako:
if(neki_uslov_tacan)
draw(sliku);
I to ubacis u petlju i ako uslov nije tacan nece se ni nacrtati dok ne bude tacno.
Ako sam te dobro ukapirao sta hoces? :D
//tamo stoji:
if(polje1 == polje2 && polje2 == polje3 && polje3 == BAR) { total += 300; }
/* Ovako dodje da se provjeravaju 3 uslova za samo 1 komvinaciju. Za jednu sliku/ikonicu/vockicu :D postoji 5 kombinacija. 5*3 = 15;
Ukupno 10 ikonica/slika/vockica = 15*10 = 150;
3 Slota = 3 * 150 = 450;
Svaki uslov se uvijek provjerava.
*/
//Predlog
if (polje1 == polje2) {
if(polje2 == polje 3) {
if(polje3 == BAR) {
Total += 300;
}
if(polje3 == Zvono) {
Total += 120;
}
}
}
/* Na ovaj nacin bih odmah na prvom uslovu odredio da li se sledeci uslov ispituje. Ako su sva tri polja ista, onda se ispituje koja je ikonica.
U najboljem slucaju ukupno bi bilo 5 provjera po slotu, ispitale bi se samo sledece kombinacije:
polje1 == polje2 prvi red
polje4 == polje5 drugi red
polje7 == polje8 treci red
polje1 == polje5 jedna diagonala
polje7 == polje5 druga diagonala
a u najgorem 50 po slotu (ako me matematika dobro sluzi :D) za sta su male sanse.
Srednji slucaj bi bio oko 10 uslova po jednom slotu
*/
Ne bi ništa postigao. U uslovu if(polje1 == polje2 && polje2 == polje3 && polje3 == BAR) evaluiranje ekspresije će se zaustaviti čim se naleti na false vrednost. Znači, ako je polje1 == polje2 vrati false, neće se trošiti procesorsko vreme da se uporede i ostali uslovi (pošto po definiciji operatora &&, ako je ijedan operand false, vrednost celog izraza je false).
Ovako radi u Allegro.
Lodujem sliku slota. Nacrtam je na ekranu. Izgleda kao prazni slot, sada koristim funkciju
draw_sprite(na_sta_crtam, sta_crtam, x, y);
Znaci, na sliku slota nacrtam ikonicu. Sad ta slika Slota (BITMAP) vise nije ista kao ona koju sam lodovao na pocetak.
To je isto kao na primer ovo:
Imas papir, nacrtas kucu,(krov, prozori, sve ,sve osim vrata). To je originalna slika (da je tako nazovemo). Sad zelis da imas i vrata, nacrtas vrata flomasterom. I sada ta vrata ne mozes da izbrises. Ako zelis kucu bez vrata, novi list, novo crtanje...
Mogucnost da ne koristim tu komandu jeste da ne crtam na slot, neko direktno na buffer.... Ali mi je ovako nekako lakse, da izracunam koordinate gdje treba da postavim sliku....
Ovako se crta...
screen <----- buffer <------ slot <------ikonica
@Todors
Isecak iz wiki stranice sta je kompajler:
The name "compiler" is primarily used for programs that translate source code from a high-level programming language to a lower level language (e.g., assembly language or machine code).
Kad sam rekao kompajler mislo sam na skupinu programa koje rade gore navedeni posao.
@Todors
...asemblerski jezik je taj koji dalje prevodi instrukcije procesoru...
on ne prevodi nego govori sta ce da izvrsi.
@clzola
Procitaj ponovo sto je "NISAM NESTO SMART" rekao!
Belphegor
12.1.2011, 14:29
Nije lose mada treba jos da poradis, kao prvo sto nisi stavio okolo neke labele za start kontrole itd, nema ih puno.
I sto nemoze na x da iskljuci igra, morao sam je u TM ubiti.
I sto zdere 50% dc procesora, strasno.
Radi na Win7 x64.
Mislim da znam zasto "zdere" 50% procesorskog vremena, posto sam i ja relativno pocetnik necu moci bas objasniti kako treba ali cu pokusati, kako ja to vidim:
Posto je igra uradjena "single threaded" a pretpostavljam da ti "zokocx" imas dvojezgarni procesor? To znaci da jedno jezgro radi 100%. Sto se tice windowsa (ne znam za linuks), cizola, najbolje bi bilo da probas da napravis win32 projekat umesto "console" i onda ubacis tvoju petlju u "message pump" tako da i ostali procesi dobiju nesto vremena, nesto kao:
...
//inicijlni proces
game->Init();
MSG msg = {0};
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//azurirajuci proces
game->Update();
}
}
//zavrsni proces
game->Close()
Win32 aplikaciju nisam nikad radio... i jesam pocetnik sto se tice programiranja, i ako ucim 4 mjeseca....
Inace i ja isto imam procesor sa dva jezgra,
Napisao sam nesto koda sa Allegro5 bibliotekama, u koliko vidim kod mene u SystemMonitor je opterecenje procesora oko 8-10% nekad skoci na 15, ali se brzo smanji. Ubacio sam evente...
Sad sam primjetio nesto drugo. Memorija koju ono zauzima je na pocetku oko 28MB i nepirekidno raste igranjem igrice...
(Sve ovo na Linux)
Memorija koju ono zauzima je na pocetku oko 28MB i nepirekidno raste igranjem igrice...
To ti je dokaz da funkcija load_bitmap() ipak ucitava prethodno ucitanu bitmap-u, jer svaki put skoci za po otrpilike 1mb kad se popuni svih 9 kolona pa se krene ponovo, za manje od 10 minuta igranja ostao bi bez slobodne memorije! To sam ti pokazao gore kako mozes da resis sa kontenerom unikatnih bitmapa, a ne bi morao da pravis mnogo izmena u kodu.
Ako hoces postavicu sutra kompletniji kod ( sad idem na spavanje :kreza: ).
to sam makao, sada samo na pocetku lodujem slike sa komandom al_load_bitmap(char *filename);
I vise ovu komandu ne koristim...
Evo source fajlovi na paste2bin:
main.cpp: http://paste2.org/p/1189362
system.h: http://paste2.org/p/1189364
globalVar.h: http://paste2.org/p/1189365
classes.h: http://paste2.org/p/1189366
Ako ces da ubacis zvukove preporucujem ti IrrKlang (http://www.ambiera.com/irrklang/) , veoma je lak za koriscenje, imas primer na ovom linku za c++ kako se integrise, sa samo par linija koda si gotov.
Radi na Windows-u, Linux-u i MacOX-u!
Hvala, samo ne znam da li moze da radi zajedno sa allegro biblioteka, a i zvuk moze da se ubaci pomocu samog allegra..
Evo sam odradio novu verziju za Windows: (Trebalo bi da vam radi)
Download Link:
http://www.sendspace.com/file/eh5t94
( Jedan moj drug je pokrenuo na Win7 i njemu radi lepo. Kaze da mu zauzima oko 20MB RAM Memorije - sto je i dalje dosta, bar ja tako mislim, a linija za opterecenje procesora je "mirna kao da je umro" :D )
Source codes:
main.cpp: http://paste2.org/p/1189362
system.h: http://paste2.org/p/1189364
globalVar.h: http://paste2.org/p/1189365
classes.h: http://paste2.org/p/1189366
Kazite vase misljenje, naravno, svaka kritika-preporuka dobrodosla.
Bravo, svaka cast:aplauz: resio si se glavnih bagova.:tapsh:
Radi i kod mene super (Win7 32bit). Procesor 0 - 4% :kreza:
...a i zvuk moze da se ubaci pomocu samog allegra.
E pa onda jos bolje.
Kad mozemo da ocekujemo verziju sa zvukom?
Sad treba da ubacim da sami birate komande... Pa tek kad to zavrsim i kad budem siguran da vise nema sta, ubacim zvuk, mozda za jedno nedelju i po, mada cisto sumnjam da cu uraditi sa zvukom...
vBulletin® v3.8.7, Copyright ©2000-2024, vBulletin Solutions, Inc.