|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
kaszu
Joined: 28 Dec 2004 Posts: 103 Location: Iceberg, Northpole
|
Posted: Wed Nov 02, 2005 12:39 am Post subject: viens mainigais visam klasem |
|
Es veidoju nelielu 2d dzineeju, bet man rodas problema, jo man ir dazadas klases Engine,Sprite,Font,... bet viniem visiem ir vajadzigs viens kopigs mainigais, kurs tiek izveidots iek klases Engine, kaa to panaakt? Engine klases instance ir tiki viena, bet Spraiti var buut n. Meginaju izveidot arpus visam klasem, tacu tad rada, ka tas jau ir nodefinets, jo tas h fails tiek izsaukts no katras klases, uzliku kaa static, bet tad rodas veel citas probleemas. Nevaru es vinu defineet ieks engine, jo tad paareejie netiek klaat.
Teoretiski kaa to vareetu realizeet? |
|
Back to top |
|
|
zutiic Indago dalībnieks
Joined: 12 Jan 2004 Posts: 140 Location: Rīga
|
Posted: Wed Nov 02, 2005 8:57 am Post subject: |
|
varbuut ssitas risinaajums nebuus tas iistais (jo neiedziljinaajos/neizpratu postu), bet dzinja .h faila saakumaa un beigaaas ieraksti sekojosho...
Code: | #ifndef DZINIS_H
#define DZINIS_H
...[dzinja kods]...
#endif
|
, kur vaarda 'DZINIS' vietaa liec sava .h faila nosaukumu. tam vajadzeetu glaabt programmu no vairaakkaarteejas .h faila nolasiishanas (ja vairaakos citos .h failos ir shitas .h "#includeets")
un kaapee veidot atsevisku klasi 'engine'? nav eertaak ja tu visas dzinja pamatfunkcijas un klases saliec "namespaacee" 'engine'?
Code: | namespace engine
{
...[klases, funkcijas]...
} |
..huh, un shito tev staasta kaads, kurss tikai pirms gada ar cpp saaka njemties:D |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Nov 02, 2005 9:32 am Post subject: |
|
Manuprāt jādara kautkas šāds:
iekš engine.h:
Code: |
class Engine {
static Engine* instance;
Engine(...); // privāts konstruktors, lai citi no ārpuses nevar jaunu uztaisīt
public:
static Engine* getInstance();
...
} |
Iekš engine.cpp:
Code: | Engine::instance = 0;
Engine* Engine::getInstance() {
if (instance != 0) instance = new Engine(...); // izmantojam privāto konstruktoru
return instance;
} |
(vienīgais mīnuss, ka destruktors izsauksies tikai terminējoties programmai, ja vajadzīgs ātrak destruktēt, vai otrādi - ātrāk konstruēt, nekā pirmais izsaukums, tad uztaisi friend klasi kautkādai citai klasi šo Engine, un lai tā klase tad izsauc privātos Engine konstruktoru/desktruktoru. Vai arī cits variants - taisi citu Factory klasi, kura pēc pieprasījuma uzkonstruēs šo Engine, tādējādi pilnīgi kontrolējot Engine radīšanu/dzēšanu tās factory klases konstruktorā/destruktorā)
Un tad iekš tiem visiem spraitiem, nevis katram taisi jaunu Engine objektu, bet gan dari šādi:
Code: | #include "engine.h"
Egine* engine = Engine::getInstance();
engine->....
|
static nodrošinās to, ka objekts ir pieejams neatkarīgi no izveidotajām Engine instancēm (līdzīgi kā publiskie mainīgie iekš procedūrām - vienmēr pieejami). |
|
Back to top |
|
|
gazz
Joined: 03 Jan 2004 Posts: 355 Location: Teika
|
Posted: Wed Nov 02, 2005 11:21 am Post subject: |
|
es ar uzskatu ka bubu piedaavaatais ir optimaals risinaajums. Ja gribas par to ko vairaak uzzinaat, tas saucaas Singleton pattern. Ideja ir taada ka singleton klasei var buut viena un tikai viena instance(objekts). Ieksh speelju dzineejiem singletonus parasti izmanto resursu menedzheriem, konfiguraacijai, loggeram un tavaa gadiijumaa noteikti render managerim. Singletonam jau var pievienot arii Init un Release vai kaut kaadas idejiski liidziigas methodes, kas nodarbotos ar Engine izveidi/izniicinaashanu.
Iesaku uzmest aci sheit: Enginuity, Part II Tur ir gan par smart pointeriem, gan funktoriem, gan arii jau piemineeto Singletonu |
|
Back to top |
|
|
EDDY
Joined: 07 Oct 2005 Posts: 1610 Location: Dzimtā zeme, Latvija
|
Posted: Wed Nov 02, 2005 11:36 am Post subject: Re: viens mainigais visam klasem |
|
kaszu wrote: | Es veidoju nelielu 2d dzineeju, bet man rodas problema, jo man ir dazadas klases Engine,Sprite,Font,... bet viniem visiem ir vajadzigs viens kopigs mainigais, kurs tiek izveidots iek klases Engine, kaa to panaakt? |
Uztaisi klasi Engine .
Un pievieno tai klasi Sprite kā friend tipa klasi.
Tā dari ar visām citām, jo tev Engine ir galvenā, bet pŗējais lai ir mantotās kā Friend klases.
Vai aizej uz www.humus.ca un papēti kādu OpenGL piemēru, no tiem tu vairāk sapratīsi, jo tas arī ir balstīts uz dzinēju. [/code] _________________ Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Nov 02, 2005 12:30 pm Post subject: Re: viens mainigais visam klasem |
|
EDDY wrote: | Uztaisi klasi Engine .
Un pievieno tai klasi Sprite kā friend tipa klasi. |
Un kā friend klases norādīšana (t.i. pieeja privātajiem un protected memberiem Sprite klasē no Engine klases) nodrošinās, ka Engine klase būs tikai vienā instancē izveidota? |
|
Back to top |
|
|
EDDY
Joined: 07 Oct 2005 Posts: 1610 Location: Dzimtā zeme, Latvija
|
Posted: Wed Nov 02, 2005 1:04 pm Post subject: |
|
Kāpēc visu sarežģīt?
Besī ārā tie programmētāji, kas visu sarežģī.
Es vienkārši atbildēju uz Kaszu jautājumu, ko darīt, ja vajag izveidot trijām klasēm pieeju pie viena mainīgā.
Tas ir - trīs draugi, kuri dala vienu ābolu.
Manā gadījumā ir klase cilvēks, firend klases ir Jānis, otrā friend klase Pēteris u.t.t..
To no galvas nevar tā pateikt.
Bet ideja slēpjās friend. Man bija tāda pati problēma, kad kādas citas klases mainīgie jāizdara pieejami otrai klasei.
Vieglāk uztaisīt galveno klasi, kaut vai ar nosaukumu 2D_Engine un tad kaut vai 100 klases, kas veic konkrētu darbu: Fonts, skaņa, modelis u.t.t.
Protams, to visu var atrast iekš kaut vai Māra Bulāna 3. tutoriāļa.
http://indago.gamez.lv/Izstradataji/Raksti/GLSL_Shadows/ShadowMaps.htm
Tur var atrast atbildi. Vajag tikai analizēt un domāt līdzi un pielāgot situāciju dzīvei, veidot shēmas un viss būs saprotami. _________________ Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Nov 02, 2005 1:54 pm Post subject: |
|
Ak tā, nu sapratu, ko tu biji domājis. Tas ir arī variants. Bet smuki tas gan nav. Nojauc visu ekapsulācijas būtību OOP programmēšanā. Pie tam, tas jau neatrisina to, ko viņš gribēja, tur tāpat jāuzmanās, lai nesanāk izveidot lieku (vēlvienu) Engine instanci.
Tavā gadījumā, to 2D_Engine jau labāk pataisīt par neimspeisu nevis publiski pieejamu klasi. Protams, ja tajā ir tikai mainīgie nevis metodes, tad jau vispār var labi iztikt ar veco labo struct. kautgan viss tāpat atkarīgs no tā kāds kods, un ko un kā tas dara.. Viena universāla risinājuma visam nav.
Un nemaz tik sarežģīti statiskie mainīgie nav.
Tavs gadījums par var būt sarežģītāks, kad viss vienā putrā būs samests (tb viss pieejams visiem), var pats sajukt kas ko sāk izmantot lieliem koda apjomiem. Tam jau tieši enkapsulācija domāta, lai noslēptu to, kas nav vajadzīgs. |
|
Back to top |
|
|
EDDY
Joined: 07 Oct 2005 Posts: 1610 Location: Dzimtā zeme, Latvija
|
Posted: Wed Nov 02, 2005 2:23 pm Post subject: |
|
Namespace ir raksturīgs C# valodai.(Es nesaku, ka C++ tā nav)
Bet, ja runā par C++, tad labāk izveidot kā teicu.
Galveno klasi kā grafisko renderu, bet par apakšklasēm izmantot tos, kas veido šo rendering system.
Un būs tev apakšklasēm pieejami visi tie mainīgie, kas ir mātes klasei.
P.S. Ir tāds nerakstīts teiciens - Jo labāks programmētājs, jo sliktāka tam grafika. _________________ Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Nov 02, 2005 5:05 pm Post subject: |
|
Nu nē. Ja tu par apakšklasi sauc mantoto klasi (child-parent), tad galīgi tev nepiekrītu. Apakšklases paredzētas skaistākai strukturizācijai nevis enkapsulācijai. Un par parentu jāizmanto kautkas tāds, kam ir kautkas kopīgs un apakšklasē paplašināt to. Taču rendereris ir viena lieta un objekti galīgi cita.
Turpertī ja tu par apakšklasi sauc pieaistīto klasi (vai ar pointeri, vai pēc vērtības), kā reāli to īstenībā nesauc, tad gan tev taisnība, tā ir labi rakstīti.
Un neimspeisi iekš C++ spēlē lielu lomu lielos projektos. Tik nenozīmīgi nemaz tie nav. Citādi varētu dikti daudz putroties datu tipos (klasēs).
Nu varbūt mazos/vidējos softos tie nespēlē tik lielu lomu, taču noderīgi gan tie ir. |
|
Back to top |
|
|
kaszu
Joined: 28 Dec 2004 Posts: 103 Location: Iceberg, Northpole
|
Posted: Wed Nov 02, 2005 7:37 pm Post subject: |
|
EDITED:
Bija problema ar linkeri, beidzot izdevaas atrisinaat
pareizi bija nevis:
Engine::instance = 0;
bet
Engine* Engine::instance = 0;
pustundu mekleeju sso joku.
Thanks bubu un visiem paarejiem. |
|
Back to top |
|
|
EDDY
Joined: 07 Oct 2005 Posts: 1610 Location: Dzimtā zeme, Latvija
|
Posted: Thu Nov 03, 2005 12:21 pm Post subject: |
|
Moins, Bubu, tu neesi analītiķis. _________________ Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday |
|
Back to top |
|
|
Kamazs Guru
Joined: 17 Jan 2003 Posts: 829 Location: The glorious ancient city of Loja
|
Posted: Thu Nov 03, 2005 1:34 pm Post subject: |
|
Varbūt patiesība ir tāda, ka nav "lekciju lasītāju" un "analītiķu", bet vienkārši labi programmētāji un ne tik labi? Profesionāļi un amatieri? _________________ ...un es uzskatu, ka Fallout ir etalons |
|
Back to top |
|
|
EDDY
Joined: 07 Oct 2005 Posts: 1610 Location: Dzimtā zeme, Latvija
|
Posted: Thu Nov 03, 2005 2:00 pm Post subject: |
|
Varbūt, bet runa nav par to. _________________ Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|