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 #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 ); 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; 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; } } } 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; } } } 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 #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. |
|
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 :) |
|
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. |
|
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). |
|
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. |
|
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. |
|
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? |
|
« 1 » |