Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Irrlicht]Klon MC - białe bloki

Ostatnio zmodyfikowano 2012-04-16 16:26
Autor Wiadomość
bingo009
Temat założony przez niniejszego użytkownika
[Irrlicht]Klon MC - białe bloki
» 2012-04-16 14:40:46
Witam was serdecznie, piszę sobie z nudów prostego klona MC. Mam tablicę 3D i wypełniał ją do połowy wysokości jedynkami(ziemią). Reszta wysokości to powietrze. No i teraz próbuję ją sobie wyświetlić, ale ekran jest cały biały. Nie wiem o co biega, tutaj cały kod:

main.cpp
C/C++
#include <irrlicht.h>
#include <iostream>

#include "Blocks.h"

#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

using namespace std;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

ISceneManager * smgr;
IVideoDriver * driver;
IGUIEnvironment * guienv;

int main( void ) {
   
    srand( time( 0 ) );
   
    IrrlichtDevice * device =
    createDevice( video::EDT_OPENGL, dimension2d < u32 >( 640, 480 ), 16,
    false, false, false, 0 );
   
    if( !device )
         return 1;
   
    device->setWindowCaption( L"Buildier" );
    driver = device->getVideoDriver();
    smgr = device->getSceneManager();
    guienv = device->getGUIEnvironment();
    ICameraSceneNode * kam = smgr->addCameraSceneNodeFPS();
    kam->setPosition( core::vector3df( 0, 0, 0 ) );
   
    device->getCursorControl()->setVisible( false );
   
   
    //definiowanie cube
   
    const int lenght = 64, height = 20, width = 64;
    int map[ lenght ][ height ][ width ] = { 1 };
    irr::scene::IMeshSceneNode * cube[ lenght ][ height ][ width ];
    int x, y, z;
   
    //Wypelnianie mapy ziemia
    for( x = 0; x < lenght - 1; ++x )
    {
        for( y = 0; y < height / 2 - 1; ++y )
        {
            for( z = 0; z < width - 1; ++z )
            {
                map[ x ][ y ][ z ] = dirt;
            }
        }
       
    }
   
    //Wypelnij powietrzem
    for( int i = height / 2; i < height - 1; ++i )
    {
        for( int j = 0; j < lenght - 1; ++j )
        {
            for( int k = 0; k < width - 1; ++k )
            {
                map[ x ][ y ][ z ] = air;
            }
        }
    }
   
    //Rysuj
    for( x = 0; x < lenght - 1; ++x )
    {
        for( y = 0; y < height - 1; ++y )
        {
            for( z = 0; z < width - 1; ++z )
            {
                cube[ x ][ y ][ z ] = smgr->addCubeSceneNode( 1, 0, - 1, irr::core::vector3df( x, y, z ) );
               
                if( map[ x ][ y ][ z ] == dirt )
                {
                    cube[ x ][ y ][ z ]->setMaterialTexture( 0, driver->getTexture( "dirt.bmp" ) );
                    cube[ x ][ y ][ z ]->setMaterialType( video::EMT_SOLID );
                    cube[ x ][ y ][ z ]->setMaterialFlag( video::EMF_LIGHTING, false );
                }
            }
        }
       
    }
   
   
   
    while( device->run() )
    {
        driver->beginScene( true, true, SColor( 255, 100, 101, 140 ) );
       
        smgr->drawAll();
        guienv->drawAll();
        driver->endScene();
    }
    device->drop();
   
    return 0;
   
}

Blocks.h
C/C++
#ifndef BLOCKS_H_INCLUDED
#define BLOCKS_H_INCLUDED

enum { air, dirt, stone };

#endif

Proszę o pomoc, z góry dzięki. Opierałem się na innym kodzie(oczywiście tutaj wszystko napisałem sam), więc nie wiem co jest nie tak.
P-54626
m4tx
» 2012-04-16 15:29:27
Hah... Piszesz sobie z nudów zaawansowaną grę i masz problemy z podstawowymi rzeczami... W dodatku opierasz się na (czytaj: kopiujesz) kodzie z innych gier... Bardzo mądre i przemyślane :)

Z nudów grę sobie możesz robić. Nawet zaawansowaną. Tylko, jak nie potrafisz tej gry zrobić, nie zabieraj się za to. Napisz może coś prostszego?

cube[ x ][ y ][ z ] = smgr->addCubeSceneNode( 1, 0, - 1, irr::core::vector3df( x, y, z ) );

Jak chcesz mieć tak duży świat jak Minecraft i zamierzasz rysować każdy blok, to uwierz mi... Więcej jak 1FPS będzie ci ciężko wyciągnąć... Poczytaj trochę o vokselach, o technikach ich rysowania i innych związanych z tym tematem rzeczach...

cube[ x ][ y ][ z ]->setMaterialTexture( 0, driver->getTexture( "dirt.bmp" ) );

W BMP obrazków się nie trzyma :)
P-54629
bingo009
Temat założony przez niniejszego użytkownika
» 2012-04-16 15:47:55
Dzięki, ale nie mam wcale zamiaru robić gry Minecraftowo podobnej. Nie chce pisać generatora, bo chyba ci o to z tą zaawansowaną grą chodziło. Mam problem z tym, ale czy ja powiedziałem, ze jest super programista? Minecraft ma nieskończony świat, a ja wcale nie mam zamiaru robić nieskończonego świata. Narazie chce wyświetlić mape 64x64x20. I żeby nie było: Jak nie kopiuje kodu innych. Czytałeś cały post? Kod nie jest skopiowany, sam to napisałem, więc proszę mnie nie posądzac o plagiat. Sprawdziłem inny kod, aby mieć jakiś punkt zaczepienia i dzięki temu wymyślić własny kod. Nie skopiowałem go wcale, ja nie kradnę kodów, ja je sam pisze. A i nie wziąłem go z innej gry, tylko z forum programistycznego. Koleś miał z tym kodem problem, więc ja go tylko przejrzałem. Więc proszę cię bardzo, nie oskarżaj mnie o przepisanie kodu. Nie takiej pomocy oczekiwałem. A co do vokselach, dzięki za radę, poczytam o tym. A jeśli chodzi o FPS, to zamierzam optymalizować to, to jest tylko kod pisany w 20min.
P-54631
m4tx
» 2012-04-16 15:59:43
Z tymi blokami to chodziło mi o to, żebyś nie rysował ich jako sześciany. Dlaczego? Opiszę to na przykładzie.

Załóżmy, że mamy obszar 128x128x70, (zwykły, płaski teren) który musimy wyświetlić.

Twoim sposobem to wyjdzie tak:
Rysujemy każdy blok osobno jako sześcian. Wychodzi nam 1 146 880 bloków do wyświetlenia po 12 trójkątów na sześcian, czyli... Wyświetlamy 13 762 560 (słownie: trzynaście milionów siedemset sześćdziesiąt dwa tysiące pięćset sześćdziesiąt) trójkątów. Mało która karta graficzna to udźwignie.

Można to natomiast zrobić to tak:
Skoro teren jest płaski, to wystarczy... Tak naprawdę wyświetlić tylko 2 trójkąty (zakładając, że stoimy na tym terenie i oprócz górnej ściany nic nie widać) i przypisać im powieloną teksturę.

Oczywiście przykład ten odnosił się tylko do płaskiego terenu. Jak już mówiłem - poczytaj sobie o vokselach - będziesz wiedział, jak powinieneś rysować teren przy zachowaniu sensownej ilości FPS. I to wcale nie płaski.

I jeszcze jedno - Minecraft nie rysuje nieskończonego terenu. (który zresztą nawet nie jest nawet nieskończony - Odległe lądy - Minecraft Wiki). Cały ten teren trzyma sobie na dysku, natomiast wyświetla (i ładuje do RAM-u) jedynie jego część (jej wielkość zależy od aktualnej ustawionej odległości rysowania).
P-54634
bingo009
Temat założony przez niniejszego użytkownika
» 2012-04-16 16:09:22
Ok. ale jak będę chciał coś postawić, to tak czy siak i tak muszę narysować sześciań. W końcu to ma być blok jak w MC. I wiem, że w MC nie jest mapa nieskończona. Chodziło mi bardziej o pozornie nieskończoną, więc jak mam rysować mapę złożoną z bloków, bez sześcianów? Chyba nie rozumiem cie. Chyba, że chodzi ci o to, aby podłoże było płaskie, a reszta to była pustka, i tylko jakby gracz coś postawił, to sześcian bym rysował. No ale weźmy np. Minecraft Classic. Tam jest całkiem sporo bloków wyświetlonych naraz, i nic nie zamula, nawet na dużej odległości widzenia.
P-54635
m4tx
» 2012-04-16 16:23:12
No właśnie. Nie rozumiesz mnie.

Prosiłem cię, żebyś poczytał sobie o technikach rysowania vokseli. Jak przeczytasz, to zrozumiesz, o co mi chodziło :P

Tam jest całkiem sporo bloków wyświetlonych naraz, i nic nie zamula, nawet na dużej odległości widzenia.
Tak, ale inną techniką, niż Twoja.

I jeszcze jedno. Kiedyś też chciałem zrobić klon MC. Wiedziałem wtedy o vokselach tyle, ile ty teraz. Zgadnij, co z tego wyszło.
P-54638
bingo009
Temat założony przez niniejszego użytkownika
» 2012-04-16 16:26:25
Ok, poczytam o tych vokselach, może coś z tego będzie.

Edit: Faktycznie, udało mi się uruchomić grę i zamula jak diabli. Ale dziwne, bo w tym kodzie na którym się wzorowałem, wyświetlenie tyle cube nie zmulało aż tak mocno. A mapa była jeszcze większa. A i masz może linka, do jakiegoś dobrego tutka o vokselach?
P-54640
« 1 »
  Strona 1 z 1