SDL_Surface jen na jedno pouziti? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

SDL_Surface jen na jedno pouziti? – C / C++ – Fórum – Programujte.comSDL_Surface jen na jedno pouziti? – C / C++ – Fórum – Programujte.com

 

24. 1. 2008   #1
-
0
-

Mam tuhle sprite, ktera ma vlastne zatim jen tri clenske promenne (sirka, vyska a bitmapa, coz je vlastne SDL_Surface). K ruznym objektum budu potom prirazovat tyto sprity a vykreslovat je podle toho. Problem je v tom, ze mi nejak moc nefunguje moje funkce drawSprite:

void graphics::drawSprite(sprite graphic, int x, int y)

{
SDL_Rect srcRect;
srcRect.x = 0;
srcRect.y = 0;
srcRect.w = graphic.width;
srcRect.h = graphic.height;

SDL_Rect dstRect;
dstRect.x = x-graphic.width/2;
dstRect.y = y-graphic.height/2;
dstRect.w = graphic.width;
dstRect.h = graphic.height;


SDL_BlitSurface(graphic.bitmap, &srcRect, m_screen, &dstRect);
return;
}
Volam ji treba takhle:
g_graphics->drawSprite(player_sprite, 150, 180);
Graphic je ta sprite, x a y jsou souradnice kam se to ma vykreslovat.

Problem je v tom, ze pri prvnim pruchodu gameloopem (kery uz jsem v ramci hledani chyby orezal JEN na jedno volani tehle funkce) je vse v poradku, pri druhem se to ale zasekne a je to v ******.

Pomoci debuggeru jsem prisel na to, ze chyba je prave nekde v te drawSprite. Ona totiz nejakym zpusobem pokazi tu SDL_Surface, ktera obsahuje ta data.

Vypada to asi tak, ze az do toho "return" (pri prvnim pruchodu) je vsechno v pohode. Kdyz si dam na nej breakpoint a podivam se do te struktury, tak je vporadku. Tesne po tom returnu (tj. kdyz si dam breakpoint na prikaz nasledujici hned po zavolani te drawSprite) uz ta struktura obsahuje same nesmyslne udaje. Tady je to videt:
-		bitmap	0x003a2ec8 {flags=3801704 format=0x003a0268 w=-17891602 ...}	SDL_Surface *

Hodnota flags 3801704 nebo w -17891602 jsou samozrejme picoviny a naprosto to nechapu - kde se to tam bere? Vzdyt ta funkce tu spritu vubec zadnym zpusobem nemeni!??

Ten return tam samozrejme byt nemusi, mam ho tam jen abych si mohl hodit breakpoint jeste mezi ten blit a konec funkce.

Diky

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Jura
~ Anonymní uživatel
637 příspěvků
24. 1. 2008   #2
-
0
-

Zdravím,

vzhledem k tomu, že jsi zde neuvedl definici třídy sprite, tak můžu střílet. Zkus tu proměnnou typu sprite předavát přes referenci. Je totiž možné, že vytváříš jen tzv. plytké kopie. Ale jak říkám bez kódu ani ránu.

Nahlásit jako SPAM
IP: 85.207.192.–
24. 1. 2008   #3
-
0
-

K cemu se ty sprity maji kopriovat, vzdyt se s nimi pracuje akorat jako se zdrojem dat?

Tady je header te sprite

class sprite{

public:
sprite(char* path,int width,int height);
sprite operator=(const sprite &original);
~sprite();
public:
int width, height;
char* path;
SDL_Surface* bitmap;
};
A cpp:
sprite sprite::operator=(const sprite &original){

bitmap=g_graphics->loadBitmap(original.path, 0,0,0);
sprite copy=sprite(original.path,original.width,original.height);
return copy;
}

sprite::sprite(char* path_p, int width_p, int height_p){
bitmap=g_graphics->loadBitmap(path_p, 0,0,0);
width=width_p;
height=height_p;
path=path_p;
}


sprite::~sprite(){
g_graphics->closeBitmap(bitmap);
}

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
24. 1. 2008   #4
-
0
-

Jestli ta třída obsahuje to co si myslim tak nevim nevim, jak to pak chceš používat.

Poradim ti:
Udělej si třídu třeba Sprite, kde bude picture, X, Y, Velocity, Draw a metoda Update, pak ještě pomocné metody jako SetPosition,.....
Update - tam dáš Position += Velocity, pak tam můžeš řešit i kolize.
Draw - tam to jenom vykreslíš.
Dej si pozor na všechny konstruktory a nastavovací metody, aby opravdu nastavovaly správně. To že mají ty proměnné divné hodnoty je tim že jsi jí asi někde špatně přidělil hodnotu. Ukaž tu třídu jak už řiká Jura.

EDIT: Kouakám už to tady je.

Nahlásit jako SPAM
IP: 85.160.93.–
Muj starý nick Tomik512
Jura
~ Anonymní uživatel
637 příspěvků
24. 1. 2008   #5
-
0
-

Jde o to, že proměnná graphics je v té funkci lokální a po ukončení funkce dojde k zavolní destruktoru dané třídy. A jak se tak koukám, tak nikde nevidím definovaný kopy konstruktor, tzn. ze vytváříš plytké kopie, z čehož plyne, že po zavolání destruktoru objektu graphics dojde ke samzaní té bitmapy(zavola se g_graphics->closeBitmap(..)). Zkus to přes tu referenci nebo si dodefinuj kopy konstruktor(pokud chceš ty objekty cpát do nějakého kontejneru, tak to stejně budeš muset udělat). Už ten samotný operátor přířazení má špatný návrh.

Nahlásit jako SPAM
IP: 85.207.192.–
24. 1. 2008   #6
-
0
-

Podle mě to má celý špatný navrh ;)
Já v SDL nedělám, ale programování her se věnuju hodně. Jak jsem už psal. Tu třídu sprite si udělej tak aby byla schopna vykreslení a pohybu bez jiných tříd. Jde oto, že když budeš mít několik tříd na sobě závislých můžeš udělat funkcní výsledek, ale veškeré úpravy jsem oto komplikovanější. Udělej si trochu inteligentní typ. Podvej.

struct POINT{
int x, y;
};

class sprite
{
private:
int width, height;
POINT Pos, Vel;
SDL_Rect rcPos;
char* path;
SDL_Surface* bitmap;

public:
// Constructor(s) and Destructor
sprite(char* path,int width,int height);
sprite operator=(const sprite &original);
~sprite();

// Generel methods
void Update();
void Draw();

// Helper methods
SetHeight(int Lheight){height = Lheight; };
GetHeight(){ return height; };
// . . . .
};

void sprite::Update()
{
Pos.x += Vel.x;
Pos.y += Vel.x;

rcPos = Pos.x;
rcPos = Pos.y;
rcPos = Pos.x + width; // možná jenom width
rcPos = Pos.y + height;
}

void sprite::Draw()
{
SDL_BlitSurface( .... &rcPos ....);
}
Jestli jsi to z toho pochopil, tak to zkus dopsat. V metodě update můžeš později řešit i kolize. Ten point si můžež nahradit lepším typem. Já nedělám v SDL tak jsem to vyřešil takle.

Nahlásit jako SPAM
IP: 85.160.93.–
Muj starý nick Tomik512
24. 1. 2008   #7
-
0
-

Jura napsal:
Jde o to, že proměnná graphics je v té funkci lokální a po ukončení funkce dojde k zavolní destruktoru dané třídy. A jak se tak koukám, tak nikde nevidím definovaný kopy konstruktor, tzn. ze vytváříš plytké kopie, z čehož plyne, že po zavolání destruktoru objektu graphics dojde ke samzaní té bitmapy(zavola se g_graphics->closeBitmap(..)). Zkus to přes tu referenci nebo si dodefinuj kopy konstruktor(pokud chceš ty objekty cpát do nějakého kontejneru, tak to stejně budeš muset udělat). Už ten samotný operátor přířazení má špatný návrh.



Diky, tohle snad bude ono. Me nenapadlo, ze se ta trida bude snazit tu spritu zlikvidovat. A s kopirovacima konstruktorama se docela peru. To v PHP nebylo.

Jeste k navrhu:
Oni ty sprity slouzi vylozene jen jako nosice informaci o grafice. Vlastni informace o tom danem hernim objektu jako je rychlost, pozice atd. potom nese (ponese :) jeste toho moc nemam) trida entity (ktera zaroven dedi tridu point, to aby se objekty chovaly zaroven jako body) a jeji potridy (enemy, projectile, player). Tem entitam se potom priradi sprita v zavislosti na tom, jak ma ten objekt vypadat.

Jestli k tomu mate nejake vyhrady, tak je rad uslysim. Jedna se o muj prvni C++ OOP navrh. Napriklad - mam tedy zaintegrovat to vykreslovani do tech entit? Mam do nich zaintegrovat i ty sprity?

A jeste jedna vec - jak je nejlepsi prochazet vsechny herni objekty abyžch je mohl vykreslit, hybat s nimi atd.? Ja to ted resim pomoci vectoru. Je to tak dobre?

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Jura
~ Anonymní uživatel
637 příspěvků
24. 1. 2008   #8
-
0
-

To CommanderZ :
Co se týká návrhu tak z toho si zatím nic nedělej, zkrátka OOP chce trochu více času a o to více to platí v C++. Kromě toho samotné C++ je velmi obtížné se naučit na dobré úrovni(počítej s tím, že ti možná nějaký rok vezme). Ale čím je dobré se řídit je třeba následující:

- pokud třída obsahuje atributy využívající zdroje(pointery-alokace!!, soubory, ...) tak je dobré u nich definovat kopy konstruktor, operátor přiřazení s příslušnou kopírovací semantikou(natvrdo kopirovat, nebo použít čítač referencí, nebo předavat vlastníka(pozor- to je ovšem nevhodné pro kontejnery viz. auto_ptr) atd.).

- pokud má být třída uchovávana v nějakém kontejneru definovat vlastní výchozí konstruktor, operator= a kopy konstruktor

- pokud třída obsahuje nějaké virtuální metody, nutně zavést virtuální destruktor

- ve třídě nevyužívat více jak jeden nezabalený zdroj(pointery, soubory, socket, atd) - je to kvuli vyjímkám, aby se správně objekty odstranily

- operátor= by měl vracet referenci na objekt samotný(*this), tím umožníš řetězit volání operátorů(a=b=c=d...) nebo void pokud chceš neche povolit tyto zápisy

- dále pokud z nějakého důvodu nechceš, aby někdo mohl kopírovat tvoje objekty(nechceš je vkládat do kontejneru), pak pouze deklaruj kopy konstruktor a operator= jako soukromy, ale nemusíš ho definovat

- a další pravidla, které mě teď v tuto hodinu nenapadly

Co se týče toho kontejneru, tak tam bych problém nehledal. Vector je dostatečně rychlý a je zbytečné si psát něco vlastního. Jen pokud ten vektor procházíš přes iterátory, tak k inkrementaci čítače používej prefixový operátor(zamezíš tím volání kopy konstruktoru viz. notace přetěžovaní pre. a post. operátorů):

vector<sprite> obj; 

for(vector<sprite>::iterator i = obj.begin(); i != obj.end(); ++i) <-- tohle
{ sprite &s = *i; // pro ulehceni
... neco s tim spritem delej..
}
....

Nahlásit jako SPAM
IP: 85.207.192.–
25. 1. 2008   #9
-
0
-

Ten návr, ukážu ti jak to řešim ve svym eginu. Ono tak jak to řešíš bz to mohlo fungovat, ale až jednou poynáš OOP kdy napíšeš "inteligentní třídu", která bude mít svůj obecný kód, pak jí můžeš použít i do třeba uplně jiného projektu s minimem až žádným množstvím úprav.
Pošlu ti to mailem.

Nahlásit jako SPAM
IP: 85.160.83.–
Muj starý nick Tomik512
25. 1. 2008   #10
-
0
-

Diky.

Jeste k tomu kopirovacimu konstruktoru. Mam tohle:

sprite::sprite(const sprite &original){

bitmap=original.bitmap;
width=original.width;
height=original.height;
}

Jak mam zajistit, aby se i ta SDL_Surface (bitmap) hluboce zkopirovala?

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Jura
~ Anonymní uživatel
637 příspěvků
25. 1. 2008   #11
-
0
-

No, když jsem se kouknul do manuálu a našel v něm poznámku:

The proper way to duplicate a surface is

  SDL_Surface *Srfc1, *Srfc2;

Srfc1= IMG_Load("foo.png");
Srfc2= Srfc1;
Srfc2->refcount++;
..
SDL_FreeSurface(Srfc1);
SDL_FreeSurface(Srfc2);

Tak bychnavrhoval následující řešení:

V kopy konstruktoru a operatoru přiřazení pouze přiřadit ukazatel na strukturu a zvýšit počet referencí.


sprite::sprite(const sprite& org)
{
bitmap = org.bitmap;
bitma->refcount++;
//dalsi inicializace
}

sprite& sprite::operator=(const sprite& org)
{
if(org != this)
{
bitmap = org.bitmap;
bitmap->refcounts++;
// dalsi inicializace
}
return *this;
}



Více viz. http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fSurface. Ovšem tamení nic napsáno o tom, že by SL_FreeSurface dekrementovala refcount, čili asi bude potřeba si to zjistit a pokud by náhodou nedekrementovala(což bych se divil), tak do destruktoru třídy sprite přidat řadek:



/*virtual*/ sprite::~sprite()
{
if(bitmap->refcount > 0) bitmap->refcount--;
// smazani
}

Nahlásit jako SPAM
IP: 85.207.192.–
25. 1. 2008   #12
-
0
-

Diky, nakonec se mi to ale povedlo udelat jednduseji:

Pouzil jsem funkci SDL_DisplayFormat. Ta bere Surface a vraci jeho kopii prizpusobenou pro aktualni zobrazovaci rezim. W00t.

Takze ten konstruktor je ted takhle:

sprite::sprite(const sprite &original){

bitmap=SDL_DisplayFormat(original.bitmap);
width=original.width;
height=original.height;
}


Diky vam obema.

Tomas_Dejmek: Ten navrh jeste urcite poradne prozkoumam. Co jsem se tak dival, tak je to v principu vlastne podobne tomu co delam ja, to moje je jen asi uzpusobene pro trochu jiny typ hry. Co presne s tim delas ty? (jen pro orientaci, abych si mohl pod jeho implementaci predstavit neco alespon trochu konkretniho)

Jura: Jak jsem se dival, tak uz jsi tady pomohl nejenom mne. Zaregistruj se, urcite tady budes znacnym prinosem ;)

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
26. 1. 2008   #13
-
0
-

Tak mam dalsi problem podobneho razu:

Pomoci tehle veci vytvarim projektily:

void playership::loop(void){

target.x=g_input->getMouseX();
target.y=g_input->getMouseY();

if((SDL_GetTicks()-lastFired)>cooldown){
projectile proj(this);
entities.push_back(&proj);
lastfired=SDL_GetTicks();
}
}


Tady je konstruktor a kopirovaci konstruktor toho projektilu:
projectile::projectile(playership *attacker){

graphic=&sprite_blue;
x=attacker->x;
y=attacker->y;
speed=300;
target.x=attacker->target.x;
target.y=attacker->target.y;
collision=COL_ENEMIES;
collision_size=graphic->width;
}

projectile::projectile(projectile &original){
graphic=original.graphic;
collision=original.collision;
collision_size=original.collision_size;
x=original.x;
y=original.y;
speed=original.speed;
target.x=original.target.x;
target.y=original.target.y;
}
Problem je, ze to pri pokusu o precteni toho projektilu z toho vekoru vyhodi Access violation. je mi jasne ze to je zase problem s temi plytkymi kopiemi. Jak mam prinutit ten vektoru, aby si ten projektil zkopiroval? On se ten kopirovaci konstruktor totiz ani nespusti.

Jo, tady je definice toho vektoru:
std::vector<entity*> entities;

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Jura
~ Anonymní uživatel
637 příspěvků
26. 1. 2008   #14
-
0
-

No,koukám, že se do topho začínáš pomalu zamotávat,co?

void playership::loop(void){ 

target.x=g_input->getMouseX();
target.y=g_input->getMouseY();

if((SDL_GetTicks()-lastFired)>cooldown){
projectile proj(this); // toto je LOKALNI proměnná!!!!!
entities.push_back(&proj); //
lastfired=SDL_GetTicks();
}
}

Nevím význam té smyčky, ale co je jasné je to,že ukladáš do vektoru jen adresy na LOKALNI proměnné, což je nesmysl. Takže ty objekty budeš muset vytařet na heapu. Čili:


target.x=g_input->getMouseX();
target.y=g_input->getMouseY();

if((SDL_GetTicks()-lastFired)>cooldown){

entities.push_back(new projectile(this));
lastfired=SDL_GetTicks();
}


A potom až nebudeš ten vektor potřebovat nebo případně jeho prvky, tak samozřejmě všechny(nebo všechny potřebné) pointery ve vektoru smazat. A ještě poznámka,pokud ukládáš do vektrou pointery,tak se nikdy operátor ani kopy konstruktor nezavola.

Nahlásit jako SPAM
IP: 85.207.192.–
26. 1. 2008   #15
-
0
-

Typ hry: Ono to moc s tím nesouvisí, dělám všeljaký 2D hry, pak to je otom jaké využíváš techniky při psaní hry. Ale 2D engine by ti měl umožnit udělat jak pexeso, tak střílečku a takový blbosti jako tetris, marrio, pacman. Já neznám SDL píšu ve Win32, tak nevim jak maj v SDL řešené práce z bitmapama(asi to bude s GDI podobný), jde oto že pak bylo obtížné ty obrázky animovat.

Když jsem se na to tvoje kouknul poprvé, tak jsem ještě nevěděl jaký máš plány s třídou graphics, uvědomil jsem si až pak, že nemuselo být špatné řešení.

Nahlásit jako SPAM
IP: 85.160.68.–
Muj starý nick Tomik512
27. 1. 2008   #16
-
0
-

A potom až nebudeš ten vektor potřebovat nebo případně jeho prvky, tak samozřejmě všechny(nebo všechny potřebné) pointery ve vektoru smazat. A ještě poznámka,pokud ukládáš do vektrou pointery,tak se nikdy operátor ani kopy konstruktor nezavola.



Jak je nejlepsi odebirat objekty z vektoru? Myslim odebirani ve smyslu, ze treba ta a ta prisera zemre a ja prave ji potrebuju vymazat z pameti. Je mi jasne, ze se to dela pomoci erase, ale jak zjistim ten itinerator? Musim pri tom prochazet cely ten vektor? Nebo staci nejak do toho objektu ukladat id pozice ve vektoru a podle toho ty polozky mazat?

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
yaqwsx+9
Posthunter
27. 1. 2008   #17
-
0
-

To CommanderZ : No na mazani je mnohem efektivnejsi kontejner list.....Vector je kontruovany na vkladani, cteni a matani z konce

Jiank tvuj dotaz jsem nepochopil.Vzdyt vis ze jsi zabil priseru s cislem 2 tak iteratorem je 2...

Nahlásit jako SPAM
IP: 85.160.69.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
27. 1. 2008   #18
-
0
-

To cislo bych prave musel nejak specialne ukladat - treba jako clenskou promennou id toho objektu. A navic...je jiste, ze se ten itinerator nemeni - treba kdyz smazu nejaky prvek z prostredka?

K tomu listu - divam se na nej, jdu to zkusit. Vypada zajimave.

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
27. 1. 2008   #19
-
0
-

Taks e mi povedlo ten list implementovat misto toho vektoru. Nemuzu ale prijit na to, jak ziskat itinerator posledni smazane polozky. Myslel jsem ze to bude list.end(), to ale vraci posledni objekt :(

EDIT: po loveni v dokumentaci a v tutorialech jsem objevil metodu remove(). Mam ale problem, ze potrebuju ty objekty odstranovat prave pri cyklickem prochazeni vsech objektu. tady je ten kod kterym to mazu (je skryt v podmince v metode loop):

		entities.remove(this);

delete this;
A timhle to prochazim:
	for(std::list<entity*>::iterator i=entities.begin();i!=entities.end();i++){

(*i)->move();
(*i)->loop();
g_graphics->drawSprite(*(*i)->graphic, (int)(*i)->x, (int)(*i)->y);
}
Tahle to vyhodi error (Debug assertion failed), ze "list iterator not dereferencable". Doslo mi, ze problem je v tom, ze se snazim ten objekt renderovat po tom, co byl smazan. Tak jsem metodu loop posunul za tu drawSprite. To pak zacalo vyhazovat dalsi chybu: "List iterator not incrementable". Tady uz si fakt nevim rady, protoze mi je jasne, ze to i se tim fyzycky smaze a pak se nemuze inkrementovat.

EDIT 2: takuz to mam. Do objektu jsem rpidal clenskou promennou bool remove a v konstruktoru ji nastavuju na false. No a pak stacilo po kazdem pruchodu loopem jeste dodatecne zavolat entities.remove_if s podminkou "return remove".

Jak se zjistuje, jestli je objekt inicializovan? to bcyh pak mohl dat pryc i tu promennou.

Nahlásit jako SPAM
IP: 81.30.238.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 55 hostů

Podobná vlákna

Aktivni jen jedno okno — založil bear.king

SDL_Surface* a vektory — založil Doomista

Průhledná SDL_Surface — založil yaqwsx

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý