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

Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU

[es] :: GameDev - Razvoj Igara :: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU

Strane: 1 2 3 4 5 ... Dalje > >>

[ Pregleda: 20239 | Odgovora: 101 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU11.08.2004. u 20:37 - pre 239 meseci
Pravio sam male igre u Delphi-u (Yamb, puzle, x-o, poker...) i sad sam poceo da ucim C++ (MS Visual Studio .Net) i DirectX. Poceo sam da pravim sasvim obicnu i jednostavnu igru koju sam prvu napravio kad sam ucio i 2D crtanje - PONG. Verovatno znate sta je to. S obzirom da jos uvek dosta slabo poznajem i C++ i DirectX voleo bih kad bi se jos nekoliko pocetnika ukljucilo u pravljenje ove igre (iz pocetka, naravno :) ). Napravio sam neke modele za lopticu i plocice ( http://www.geocities.com/srki_82/Data.zip ) pa ako neko ima zelju da mi se pridruzi u pravljenju neka pise. Do kraja igre bi trebalo da koristimo Direct3D za crtanje loptice, plocica, terena po kojoj se loptica krece i pozadine, DirectInput za pokretanje plocica, DirectSound za... naravno, zvuk (kada loptica negde udari i za pozadinsku muziku), neke zakonitosti u kretanju lopte, i mozda DirectPlay ako budemo dosli do umrezavanja :P Da bi dosli do svega toga prvo treba da pocnemo :) Za one koji jos ne znaju kako se na najlaksi moguci nacin (valjda je najlaksi) pokrece i gasi DX aplikacije evo malo preradjenog primera iz SDK:

Code:

// Pong.cpp

#include <d3dx9.h>

//-------------------------------------------------------------------
// Global variables
//-------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;

//-------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    
    d3dpp.BackBufferWidth = 800;
    d3dpp.BackBufferHeight = 600;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.Windowed = FALSE;
    d3dpp.FullScreen_RefreshRateInHz = 75;
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT ;

    if( FAILED( g_pD3D->CreateDevice( 
      D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
      D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

    g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );

    return S_OK;
}




//-------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}




//-------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-------------------------------------------------------------------
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,
               D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        //Ovde crtamo nasu scenu
    }

    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}




//-------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}




//-------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "PongWindow", NULL };
    RegisterClassEx( &wc );

    HWND hWnd = CreateWindow( "PongWindow", "Pong", WS_POPUP,
      CW_USEDEFAULT, CW_USEDEFAULT,
      CW_USEDEFAULT, CW_USEDEFAULT,
      GetDesktopWindow(), NULL, wc.hInstance, NULL );

    if( SUCCEEDED( InitD3D( hWnd ) ) )
    { 
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );
        ShowCursor( FALSE );

        MSG msg; 
        ZeroMemory( &msg, sizeof(msg) );
        while( msg.message!=WM_QUIT )
        {
            if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            else
                Render();
        }
        ShowCursor( TRUE );
    }

    UnregisterClass( "PongWindow", wc.hInstance );
    return 0;
}


Ovo ce pokrenuti program u fullscreen 800*600*32 na 75Hz, pozadina ce biti crna i to je sve sto ce ovaj program raditi. Izlazi se sa Alt + F4 :) Ne umem jos da pronalazim koje sve modove podrzava odredjeni adapter pa bi bilo lepo da neko ovome doda i podrsku biranja odredjenog moda pre ulaska u fullscreen. Ako neko ima bilo kakve ideje u vezi sa ovom "lako za napraviti" igrom neka pise :) I, da... bilo bi lepo da ne koristimo MFC... ako moze, pls :)
 
Odgovor na temu

TvrdiMijo
Mijo Tvrdojević
Sl.BRod,Hrvatska

Član broj: 31037
Poruke: 52
*.cmu.carnet.hr



Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU11.08.2004. u 21:34 - pre 239 meseci
pa eto ja bi ti se volio pridružit ali ja nažalost ne znam ništa od directx-u i inim stvarima a pored toga "programiram" u delfiju.no,ako mi možeš pokazati te osnove directx-a ja ću ti rado pomoć ako se recimo nemoš sjetit nekog dobrog algoritma za problem koji te muči a ti onda kodiraj u c++-u.uzgred ako ima neko ko bi ovakvu ideju mogao i želio ostvariti u delfiju volio bi da popričamo...

i još nešto.srki_82 zašto si počeo učiti c++?zašto recimo tu igricu nepokušaš napravit u delfiju ako već znaš programirat u njemu?

no,budući da ću se i ja izgleda morati baciti na c++ ,kako si ti počeo učiti programirat u njemu?knjige ili što?

poz
Blago onom tko rano poludi,
pa mu život u veselju prođe
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU11.08.2004. u 21:34 - pre 239 meseci
Odlicna ideja!

Ja ne mogu da se obavezem da cu radim na igri, ali zato mogu da malo pomognem sa strane.

Najlakse je ako koristimo D3DX za ucitavanje objekata, matematiku i naravno effect system (ako dodjemo do toga). Takodje, mozda bi bilo zgodno koristiti DXUT framework umesto sirovog Win32. Postoje interestantnije stvari koje treba da se nauce od toga. :)

Znaci za pocetak je ta prica o podrzavanju razlicith modova manje bitna - to uvek moze da se uradi. Ajde da umesto toga izaberemo neku igru koju realno mozemo da uradimo. Sta mislis o Scramble za pocetak ( http://www.highwaygames.com/products/scramble.php )?

Ako se vec uci, onda treba da se uci iz novih izvora. Da li imas DirectX SDK Summer Update 2004?
 
Odgovor na temu

TvrdiMijo
Mijo Tvrdojević
Sl.BRod,Hrvatska

Član broj: 31037
Poruke: 52
*.cmu.carnet.hr



Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU11.08.2004. u 21:37 - pre 239 meseci
reljam,jel mi možeš preporučit nešto iz čega bi makar malo mogo zać u stvarčice koje si nabrojao,ili ako ti nije muka da i ti nešto kažeš o tome

please...
Blago onom tko rano poludi,
pa mu život u veselju prođe
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU11.08.2004. u 22:13 - pre 239 meseci
Mozemo i tu igru :) Bitno je samo da se uci.
Naravno da imam DirectX SDK Summer Update 2004 i Extras... patim od toga da uvek imam najnoviji softver :)

Pa... odakle predlazes da pocnemo?

P.S. Za TvrdiMijo:

Ovako... uglavnom se svi SDK-ovi pisu za C ili C++, skoro svi open source projekti su u C ili C++ i sad da ne nabrajam dalje. Dosadilo mi je da cekam da neko izbaci Delphi unit-e za recimo DirectX ili bilo sta drugo i resio sam da pocnem da ucim C++. Ucim iskljucivo iz helpa i preko foruma. Tako sam naucio i Delphi koji sad znam skoro perfektno :)
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU11.08.2004. u 22:41 - pre 239 meseci
@TvrdiMijo: prvo treba da savladas C++, tj. da mozes da se snalazis u jeziku. Znaci nadji neku od knjiga, odavno nisam citao C++ knjige, ali meni se dopadaju knjige za 21 dan i slicno. Mislim da su jako dobra polazna tacka jer ti u grubim crtama opisu bitnije delove jezika. Posle toga mozes da uzmes vec neku malo ozbiljniju knjigu. A u medjuvremenu pravi male konzolne programe, i vezbaj na tome.

@Srki
Ponavljam - ja ne mogu da se aktivno bavim pisanjem igre sada, ali zato mogu da pomognem kad zapne, da radim code review-ove, i slicno. Mislim da bi bio dobar pocetak da krenes od DXUTa, i da napravis za pocetak resource manager koji moze da ucitava mesheve i teksture, da ih vezuje za imena, i da ume da ih resolveuje. Ovo ce ti ionako trebati da bi poceo bilo sta netrivijalno kasnije da radis.

Ima li jos neko ko je za ovo zainteresovan?
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU11.08.2004. u 23:01 - pre 239 meseci
Ok... DXUT nisam do sad koristio jer sam se nekako navikao na DX8 gde toga nije bilo. Znao sam da se prvo prave neke opste klase za cuvanje objekata, uzimanje i oslobadjanje memorije i slicno... pa da se bacim na posao. Ako nekog bude zanimalo mogu slati source code onog sto uradim na ovu temu i, naravno, ako se nekom ne svidi ono sto budem uradio (verujem da ce mnogi imati bolja resenja od mene) neka pomogne da napravimo sto bolji program :) Pa... da se bacimo na kuckanje :)
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 00:58 - pre 239 meseci
Evo, imamo i podrsku od graficara sa foruma :)

http://www.elitesecurity.org/tema/64391/0#409777
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 01:29 - pre 239 meseci
Hmmmmm... ok... za sad jedan zainteresovan dizajner, jedan zainteresovan programer i nas menadzer :) Nadam se da ce do sutra malo vise ljudi da se zainteresuje... u svakom slucaju, bar cu ja nesto nauciti :P

Nije ovaj DXUT tako komplikovan... cak mi se i svidja... MNOGO JE DOBAR :)

Za koji dan (mozda vec i sutra) ce biti gotove klase za brod, rakete, laser i teren. Cim ih zavrsim stavicu ih ovde.

Lepo spavajte :)
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.client.comcast.net



+18 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 05:34 - pre 239 meseci
Drago mi je da ti se DXUT dopada - jedan od bitnih design goalova je da se lako koristi, jer ono sto je bilo ranije... ah, necemo o tome :)

Elem, da bi se iz ovoga izvuklo nesto, treba engine dizajnirati kao pravi - pocevsi od onog gorespomenutog resource managera, pa neki scene graph (koji ce u slucaju ove igri verovatni imati jedan nivo dubine, ali princip je bitan :) ), game loop, update za sve objekte u igri, itd. U svakom slucaju, zanimljivo!
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.49.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 19:54 - pre 239 meseci
Konacno sam nasao malo vremena za kuckanje... spremam se za more, znate vec kupovina, kupovina, kupovina... :)

Nego, ovako sam osmislio memory menager: postoji jedna klasa (CMManager) koja sadrzi listu svih objekata koji su kreirani, moze da dodaje nove, da ih brise i trazi po nazivu. To je otprilike sve sto ova klasa radi. Druga klasa (CMMObject) je klasa iz koje ce se izvoditi svi ostali objekti (mesh-evi, texture, zvukovi,...). Svaki objekat sadrzi svoje ime, mesto u listi objekata i refCount (objekat se ne brise iz liste sve dok je refCount>0). refCount sam dodao iz sledeceg razloga - u igri ce biti nas mali svemirski brod i vise malih raketica i burica sa gorivom. Da nebi svaka mala raketica ucitavala mesh i texturu iz fajla svaki put (bezveze se trosi vreme i memorija), mesh i textura se ucitaju samo jednom i onda im se samo povecava refCount kad god se neka raketica kreira. Pokusacu da napravim smart pointer (warper oko CMMObject) da bi ove klase bilo lakse. Source code je zakacen uz poruku.

P.S. Verovatno sam neke stvari uradio pogresno... ili je mozda moglo bolje pa neka neko malo sredi ove klase :)
Prikačeni fajlovi
 
Odgovor na temu

mjolnir

Član broj: 31754
Poruke: 10
*.ptt.yu



Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 20:01 - pre 239 meseci
Da malo pripomognem...
Malo sam prepravio drugi SDK tutorijal tako
da ima dijalog za rezolucije iznad 75Hz,
bez MFC-a, izlazi se i sa ESC ;>
Moglo bi jos da se malo poboljsa, ali neka
za pocetak...

Vidite attach.

Pozdrav,
mjolnir
Prikačeni fajlovi
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.49.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 20:52 - pre 239 meseci
Hvala, mjolnir, ali sad kad sam malo bolje pogledao DXUT vidim da je to prilicno lako :)

Ovo bi trebalo da posluzi kao smart pointer. U nedelju krecem na more pa me nece biti ovde oko 2 nedelje. Potrudicu se do tad da napravim neke osnovne klase za mesh-eve i texture.

Ima li neko ideju kako bi bilo najbolje da se iscrtava zemlja? Razmisljao sam da napravim triangle strig... otprilike ovako

Code:

*
                    *
     *                               *

*    *              *                *


Zvezde predstavljaju vertexe. Za svaki deo terena imamo definisana dva trougla, mozemo im dodeliti i U i V koordinate za texturu, a i odrediti koji se od delova terena vidi tako da ne moramo da crtamo ceo teren nego samo onaj vidljivi deo. Zna li neko laksi nacin da se postigne slican rezultat?
Prikačeni fajlovi
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 22:14 - pre 239 meseci
To sto si napisao zvuci sasvim dobro. Znaci postojace jedan vertex buffer sa svim vertexima za teren u nivo (ionako ih nema mnogo, <1000), i posle prilikom poziva DrawPrimitive samo treba otprilike izabrati koji se indexi crtaju.

Sto se tice memory managera, ima tu jedna zackoljica: ako na ekranu ne postoji ni jedna raketa, to ne znaci da mesh i tekstura za raketu treba da ima refcount 0 i da se izbaci iz menagera.

Vecina igara zna unapred koji su joj resursi potrebni za level i sve ih ucita, jer bi inace bilo sporo ucitavanje on the fly.

Mislim da bi bilo bolje da uradis MemoryManager za teksture i mesheve koji radi to sto si opisao samo bez refcounta. Takodje, uradi i scene graph koji sadrzi objekte koji u sebi imaju pointere na mesheve. Jer tebi informacija koliko imas referenci na teksturu rakete i nije bitna - sigurno neces brisati tu teksturu pre kraja nivoa.

Takodje razmisli o nekoj entity klasi koju bi mogao da smestis u scene graph. Svaki entity bi mogao da ima svoje Update i Draw metode. Onda bi mogao u render loopu da prodjes kroz celo stablo i da pozivas Update za svaki entity, i onda jos jedanput i da pozivas Draw.

Food for thought: Da li je potrebno imati odvojene scene graphove za Update i za Draw fazu? Ako objekat A zavisi od objekta B (recimo da A pokusava da prati B), onda ih treba tako poredjati u grafu. Ali mozda oni imaju drugaciju vezu kod iscrtavanja. Ok, ovo sve je suvise komplikovano za scramble, zato ovde i pricamo o nekoj lakoj igri za pocetak.

U svakom slucaju imas o cemu da razmisljas na moru ;)
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com



+18 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 22:23 - pre 239 meseci
Mislim da imas jedan bag u refcountu:

U konstruktoru CMMObjecta ne postavljas refCount na 1. To znaci da ako napravis objekat i odmah ga releasujes, on nece biti deletovan. :)
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.49.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU12.08.2004. u 22:50 - pre 239 meseci
Ja mislim da hoce... mozda ne poznajem dovoljno C++, ali kad pise:

void CMMObject::Release()
{
refCount--;
if (refCount <= 0)MemoryManager->RemoveObject( It );
};

znaci napravim objekat i refCount je 0, odmah ga releasujem refCount ce biti -1 i on ce se izbrisati iz memorije... zar ne?

Mogao bih da imam recimo listu objekata koji imaju refCount veci od nule i listu objekata koji imaju refCount = 0 tako da u svakom trenutku znam koji objekti nisu potrebni i ako ponestane memorije (sto je u ovoj igri malo verovatno, ali nema veze) mogu da oslobodim memoriju zauzetu nepotrebnim resursima. Kad se nivo zavrsi sve objekte oslobotim (tj dovedem ih do refCount = 0) i kada se novi ucitava prilikom kreiranja svakog objekta proverava se da li vec neki objekat postoji i povecava mu se refCount. Na kraju ucitavanja svi objekti sa refCount = 0 se brisu iz memorije. Nadam se da sam dobro napisao ono sto sam mislio :)

Posto jos uvek ne razumem bas najbolje sve izraze vezane za prikazivanje slike objasni mi, molim te, sta je to tacno scene graph?

P.S.
ispravio sam release tako da refCount ne moze biti manji od 0:
Code:

void CMMObject::Release()
{
    refCount--;
    if (refCount<0)refCount = 0;
    if (refCount = 0)MemoryManager->RemoveObject( It );
};

 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU13.08.2004. u 21:03 - pre 239 meseci
Privodim kraju klase za texture i mesh-eve, ali sam naisao na neke problemcice... pa ako ima nekog koga ne mrzi da pregleda malo kod (oznacio sam mesta koja mi predstavljaju problem) molio bih ga ili je da mi malo pomogne :)
Prikačeni fajlovi
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU13.08.2004. u 22:00 - pre 239 meseci
Ispravio sam fajl meshobj.h i sad bar kompajler ne prijavljuje gresku... nadam se da ce to i da radi :)

Code:

#ifndef __MESHOBJ_H__
#define __MESHOBJ_H__

#include "mmanager.h"
#include "spointer.h"
#include "textureobj.h"
#include "drawobj.h"
#include <d3dx9.h>

class CMMMesh : public CMMDrawObject
{
protected:
    LPD3DXMESH Mesh;
    D3DMATERIAL9* MeshMaterials; // TODO: Da li treba dodati objekat za materijale???
    CMMPointer<CMMTexture>* MeshTextures;
    DWORD dwNumMaterials;
    void CleanUp()
    {
        SAFE_DELETE_ARRAY( MeshMaterials );
        if( MeshTextures )
        {
            for( DWORD i = 0; i < dwNumMaterials; i++ )
            {
                MeshTextures[i] = NULL;
            }
        SAFE_DELETE_ARRAY( MeshTextures );
        }
        SAFE_RELEASE( Mesh );
    };

public:
    CMMMesh( LPSTR name, LPSTR type = "MESH" ) : CMMDrawObject ( name, type )
    {
        Mesh = NULL;
        MeshMaterials = NULL;
        MeshTextures = NULL;
        dwNumMaterials = NULL;
    };

    ~CMMMesh()
    {
        CleanUp();
    };

    HRESULT LoadMesh( LPCTSTR pFilename, DWORD Options, LPDIRECT3DDEVICE9 pD3DDevice )
    {
        CleanUp();

        LPD3DXBUFFER pD3DXMtrlBuffer;

        D3DXLoadMeshFromX( pFilename, Options, pD3DDevice, NULL,
            &pD3DXMtrlBuffer, NULL, &dwNumMaterials, &Mesh);
        
        D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
        MeshMaterials = new D3DMATERIAL9[dwNumMaterials];
        MeshTextures  = new CMMPointer<CMMTexture>[dwNumMaterials];


        for( DWORD i=0; i<dwNumMaterials; i++ )
        {
            MeshMaterials[i] = d3dxMaterials[i].MatD3D;
            MeshMaterials[i].Ambient = MeshMaterials[i].Diffuse;
            MeshTextures[i] = NULL;
            if( d3dxMaterials[i].pTextureFilename != NULL &&
                lstrlen(d3dxMaterials[i].pTextureFilename) > 0 )
            {
                if( !CMMObject::MemoryManager->FindObject<CMMTexture>( d3dxMaterials[i].pTextureFilename,
                    "TEX", (CMMTexture*)&MeshTextures[i], TRUE ) )
                {
                    MeshTextures[i]->LoadTexture( pD3DDevice, d3dxMaterials[i].pTextureFilename);
                };
            };
        };
        pD3DXMtrlBuffer->Release();
    };

    void Draw( LPDIRECT3DDEVICE9 pD3DDevice )
    {
        for( DWORD i=0; i<dwNumMaterials; i++ )
        {
            pD3DDevice->SetMaterial( &MeshMaterials[i] );
            pD3DDevice->SetTexture( 0, *(CMMTexture*)&MeshTextures[i] );
            Mesh->DrawSubset( i );
        };
    };
};

#endif //#ifndef __MESHOBJ_H__

 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU13.08.2004. u 23:51 - pre 239 meseci
Nesto definitivno ne valja u mojim klasama :) Ili samo ne znam da ih koristim...
Probao sam da na brzaka istestiram sve ovo, ali se ispostavilo da ne radi kako treba. Prvo: DXUT zahteva da projekat bude Unicode, a kad to ukljucim onda lstrcmp funkcija ne radi kako treba, a i svi stringovi su mi LPSTR, pa sam zato samo malo modifikovao jedan tutorial (samo dok ne vidimo zasto sve ne radi lepo pa cemo, ili CU, pokusati da sve nekako ubacimo u DXUT). Drugo: smart pointer izgleda ne radi kako treba... koliko sam citao help meni izgleda kao da je dobra klasa, ali... nece da radi :) Pa... posto ne znam kako vise da ispravljam kod prepustam nekom iskusnijem od mene da pokusa da ga malo sredi dok sam ja na moru... nema me dve nedelje... nadam se da ce se do tad bar neke stvari resiti :)
Izvolite i poslednji source za danas... naravno, nece da se kompajlira :P
Prikačeni fajlovi
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
212.62.47.*

ICQ: 246436949


+10 Profil

icon Re: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU14.08.2004. u 00:05 - pre 239 meseci
Nesto razmisljam... mozda bi bilo bolje da napisem sve iz pocetka bez template, refCount... sto je moguce lakse... mislim da ce tako i biti :)
 
Odgovor na temu

[es] :: GameDev - Razvoj Igara :: Za pocetnike (i one koje hoce da nas nauce) HAJDE DA PRAVIMO IGRU

Strane: 1 2 3 4 5 ... Dalje > >>

[ Pregleda: 20239 | Odgovora: 101 ] > FB > Twit

Postavi temu Odgovori

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