Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

SDL::C++ game-dev

[es] :: C/C++ programiranje :: SDL::C++ game-dev

[ Pregleda: 2571 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.78.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon SDL::C++ game-dev22.10.2007. u 14:17 - pre 200 meseci
Evo ja vec dosta solidno znam SDL i hteo bi da radim jendostavnu tile igricu :)

Znaci treba mi pomoc oko pravljenja table? preko tileova i kako da je pamtim u memoriji?

imam otprilike sliku u glavi ali je prilicno mutna, znaci nesto otprilike da svaki tile ima svoj broj (zid=1, pod=2...)
i onda te brojeve ucitavam od negde?
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
217.26.79.*

ICQ: 208550327


+14 Profil

icon Re: SDL::C++ game-dev29.10.2007. u 14:26 - pre 199 meseci
Ne znam SDL ali...

Ucitas za svaku vrstu tile-a sliku sa HDD samo jednom. Tablu pamtis kao, npr, dvodimenzionalan niz Celija. Svaka celija ima svoj ID. I kada se celija iscrtava, iscrtas sliku sa naznacenim ID-jem.

Code:


enum TILES { ZID, POD, VRATA, BROJ_TILEOVA };

static BITMAP g_pBitmaps[BROJ_TILEOVA];

//funkcija inicijalizacije tvoje aplikacije
InitApp()
{
      g_pBitmaps[ZID] = ... // ucitas bitmapu iz fajla
      g_pBitmaps[POD] = ... // --- || ---
}



Ne znam kako su bitmape prikazane u SDL ali, ovo je primer ucitavanja...

Posle samo menjas pozicije bitmape i iscrtavas ih... Uoci da se ISTA bitmapa moze crtati nekoliko puta a da ti, u stvari, ne treba da vise puta ucitavas jednu te istu mapu...

Code:


// jedna celija
g_pBitmaps[ZID].SetPosition(10, 10);
g_pBitmaps[ZID].Draw();

// druga celija
g_pBitmaps[ZID].SetPosition(60, 10);
g_pBitmaps[ZID].Draw();



Tablu pamtis kao dvodimenzionalni niz...

Najprostije:

int Tabla[duzina][sirina];

npr..

Tabla[0][0] = ZID;
Tabla[0][1] = POD;
Tabla[0][2] = ZID;
...

Iscrtavanje:

Code:

for(int i=0;i<duzina;i++)
{
     for(int j=0;j<sirina;j++)
     {
          g_pBitmaps[ Tabla[i][j] ].Draw();    // gde je Tabla[i][j] ZID ili POD ili VRATA...   
     }
}



Nadam se da sam pomogao malo :)
EOF
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.84.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: SDL::C++ game-dev30.10.2007. u 11:39 - pre 199 meseci
Svaka cast, ja sam radio slicno samo sto sam ucitavo matricu iz fajla, da bi bio kod flexibilniji.
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
217.26.79.*

ICQ: 208550327


+14 Profil

icon Re: SDL::C++ game-dev30.10.2007. u 23:06 - pre 199 meseci
Mozes cak i da napravis mali editor... U njemu samo nabacujes Tilove misem u nekom gridu... I posle samo export u text ili binary ... I samo stancas levels... Simpaticna stvarcica :)
EOF
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.233.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: SDL::C++ game-dev02.11.2007. u 22:51 - pre 199 meseci
e ljudi naleto sam na problem, krenuo sam da pisem kretanje mog tenkica doduse ovaj put kretanje po tilovima, jer mi se ovakvo obicno kretanje nije bas svidedlo.

Treba napraviti da se tenkic pritiskom na npr. levo dugme krece za pixel po pixel mada kada se otpusti to fdugme da se on centrtira na tile-u, to jest da njegova x i y koordinata bude deljiva sa dimenzijamam tilova u mom slucaju 40X40,

Znaci cilj mi je da se moj tenkci krecec veoma elegantno preko tih tilova prateci njihove linije,

Ja sam ovo probo da uradim mada sam dobio preskakanje iz tila u tajl!!! treba mi pomoc oko ressavanja ovog problema!!!
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.vozd.net.

ICQ: 208550327


+14 Profil

icon Re: SDL::C++ game-dev03.11.2007. u 01:48 - pre 199 meseci
Grrrrr... Pokusao sam da instaliram SDL... I sve je ok ( include i lib fajlovi su na dobrim mestima... ) ali, kada napravim console application, javlja mi link error da _main nije definisan a JESTE!!! Zasto??? ( Probao sam i u VC6 i u VC2005 ) :(
EOF
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.68.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: SDL::C++ game-dev03.11.2007. u 10:09 - pre 199 meseci
Pa SDL ne prihvata obican main(), kada pravis program u SDL-u moras mu stavitit:

int main( int argc, char* args[] ) ovakav main
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.vozd.net.

ICQ: 208550327


+14 Profil

icon Re: SDL::C++ game-dev03.11.2007. u 13:48 - pre 199 meseci
Snadjoh se nekako... :) I vec se na ekranu sija crveni "Hello world" pixel! :)


Sto se tice tvog problema:

1. Tenk na pocetku neka uvek bude na sredini nekog pocetnog tilea
2. Napravi promenljivu int velocity[2] ( za trenutnu x i y brzinu ) i int oldVel[2] koje pamti prethodnu brzinu. Kada pritisnes:

- na gore: velocity[0] = 0; velocity[1] = 2; ( ako je pozitivno y 'na dole' onda stavis - 2)
- na dole ( suprotno od gornjeg)
- na levo velocity[0] = -2; velocity[1] = 0;
- na desno velocity[0] = 2; velocity[1] = 0;

- treba nam i bool promenljiva slobodnoKreatanje koja je na pocetku false

3. Update

Code:

{
      BOOL dugmePritisnuto = FALSE;

      if(!bSlobodnoKretanje)
     {
            velocity[0] = velocity[1] = 0; // na pocetku je nula

             if( DUGME_PRITISNUTO )
             {
                    velocity se menja u zavisnosti koje dugme je pritisnuto
                    dugmePritisnuto = TRUE;
             }
     } 


      PomeriTenk();

      if(!dugmePritisnuto && ( oldVelocity != 0 ) )  // tenk je ostavljen na milost i nemilost grida :)
          ProveriPozicioniranost()

      oldVelocity = velocity;
}


Pomeranje tenka je simply pos = pos + velocity;

4. Sada proveravamo koje sve tileove preseca tenk ( IntersectRect() ce pomoci :) ). Posto on moze presecati i tile koji je iza njega, moze se desiti da se tenk vrati na prethodni tile, sto nama ne treba, vec bi trebao da nastavi ka 'prednjem' tile-u na koji nailazi. I zato nam treba oldVelocity da zapamtimo u kojem pravcu je isao..

Code:

ProveriPozicioniranost()
{
      // pomocu intersectRect nadjemo sve tileove koje presecamo ( najvise ce to biti dva ) 

       //od ta dva izaberemo onaj koji nam je u pravcu oldVel kretanja i proverimo da li smo u njegovom centru ( ako jesmo bSlobodnoKretanje je FALSE 
       // i ovde se slobodno kretanje zaustavlja )

       // ako nismo
       // postavljamo velocity na old velocity
}


Uoci da, kada je tenk u stanju slobodnog kretanja, igracnije u mogucnosti da ga pokrene sve dok se ne smesti.

Ovo nije testirano ali, nadam se da ce pomoci :)


EOF
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.16.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: SDL::C++ game-dev21.11.2007. u 12:50 - pre 199 meseci
E hvala ti puno, ja sam malo drukcje resio problem, ali sve jedno hvala na trudu.


U medjuvremenu mi se pojavio jedan problem, posto pravim animaciju tilova (za tajl koji svetli) i uspeo sam da napravim da lepo svetli ali mi se javlja problem kada se kamera pomera, posto ta animacija ima 20 frejmova a samo prvi frejm je na matrici posle toga samo dodeljujem vrednost prvom frejmu,

Kada god kamera pocne da se krece, ta animacija se krece zajedno sa kamerom DOK ne dodje do prvog frejma i onda se vrati na mesto i tkao stalno i dobije se utisak da skace!!!

Ja animaciju radima tako sto frejm vrednost povecam za jedan svake iteracije glavne while petlje, nista komplikovano i samo SDL_Rect clipu dodam vrednost sledeceg klipa i tako stalno...

Probo sam da resim problem tako sto bi svake iteracije while petlje ponovo ucito tajlove ali to nije radilo...?

 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
212.200.234.*

ICQ: 208550327


+14 Profil

icon Re: SDL::C++ game-dev21.11.2007. u 20:36 - pre 199 meseci
Tu je problem sa pozicioniranju koliko sam ja iz tvog teksta skapirao...

Evo kako bih ja odradio taj deo za animaciju...

Code:

class Animation
{
     int numFrames;
     int currentFrame;


     // ovo inicijalizujes sa svim frejmovima  
     SDL_Surface * pFrames;

     int x, y;
public:

     void Update()
     {
           currentFrame++; // 
 
           // provera da frejmovi ne odu preko numFrames

           // ovde update-ujes x i y poziciju
     }


     void Draw(SDL_Surface * pScreen, int x, int y)
     {
            SDL_Rect rect;
            rect.x = x;
            rect.y = y
 
            ApplySurface(pScreen, &rect, &pFrames[currentFrame], 0)
     }
}


Ovo bi trebalo da radi posto sam ja radio neku video igru u DirectDraw i koristio ovakav pristup i sve je bilo OK...

A da, ne znam da li radis sa klasama ili pure C...

Moguce je da se problem javlja i u pozicioniranju jer, ti u stvari, pomeras tile-ove a tenk stoji u centru...



EOF
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.223.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: SDL::C++ game-dev23.11.2007. u 11:57 - pre 199 meseci
Odlicno problem resen :) bio mi je problem u pozicioniranju i mestu upadatovanja pozicije :P thx...


E sada hteo bih da ubacim jednu lopticu koja ce se odbijati od zidova?
ja sam skido neke filove sa neta i svi nesto koriste neke komplikovane vectore i rade sa Win API-em?

Dali bi mogo neko da mi objasni kako to funckionise da imam neku osnovu?
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
212.200.234.*

ICQ: 208550327


+14 Profil

icon Re: SDL::C++ game-dev23.11.2007. u 13:15 - pre 199 meseci
hmmm... Sve je to kretanje.... Ono je komplikovano ako ti treba da bude komplikovano :)

Sto se tice loptice... Ne znam bas tacno sta ti treba...

Evo jednog primera da se odbija od sve 4 strane...

[code]

// w - sirina ekrana
// h - visina ekrana

int brzina = 5;

int dx = brzina;
int dy = brzina;

int xPos = w/2;
int yPos = h/2;

int xPrev = xPos; // pozicija u proslom frejmu ( Previous )... Moramo je imati jer, kada dodje do kolizije, postavljamo lopticu na poziciju pre kolizije da ne bi doslo do 'lepljenja' loptice... probaj bez xPrev pa ces videti :)

int yPrev = yPos;

void Update()
{
xPos += dx;
yPos += dy;

if( ( xPos < 0 ) || ( xPos > w ) )
{
xPos = xPrev;
dx = -dx; // "reflektujemo" brzinu po x osi tako da se sada loptica krece u suprotnom smeru i u reflektovanom pravcu
}

// isto i za y ( samo stavi h )


xPrev = xPos;
yPrev = yPos;
}


EOF
 
Odgovor na temu

[es] :: C/C++ programiranje :: SDL::C++ game-dev

[ Pregleda: 2571 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.