GGG205 Temat założony przez niniejszego użytkownika |
[SFML 2.1]Rozmieszczenie bloków w edytorze map. » 2014-06-28 12:58:04 Zrobiłem edytor, który rysuje i wybiera blok. I teraz nie mogę narysować tyle bloków ile ustaliłem Obrazek 1[/img] jeżeli chciałbym dodać kolejny blok na puste pole to wyskoczy błąd, przepełnienie bufora(czy coś w ten deseń). Jeśli dodam ten kod RealTimeMap[ i ][ j ].setPosition( j * 30 + 120, i * 30 ); (te 120 to jest, aby przesuną się o 120 ponieważ, gdyby tego nie zrobił mapa była by w tym szarym polu) to efekt jest taki Obrazek 2[/img](Oczywiście ten pierwszy blok przy szarym polu to kursor) Metody odpowiadające za rozmieszczenie bloków i ich rysowanie na mapie to: void Editor::DrawBlock() { if( Mouse::isButtonPressed( Mouse::Left ) ) { if( Mouse::getPosition( * wnd ).x >= 121 ) { RealTimeMap[ ActiveFieldY ][ ActiveFieldX ] = ActiveBlock; RealTimeMap[ ActiveFieldY ][ ActiveFieldX ].setPosition( ActiveFieldX * 30, ActiveFieldY * 30 ); } } } void Editor::DrawMap() { for( int i = 0; i < MapSize.y; i++ ) { for( int j = 0; j < MapSize.x; j++ ) { RealTimeMap[ i ][ j ].setPosition( j * 30 + 120, i * 30 ); wnd->draw( RealTimeMap[ i ][ j ] ); } } } Teraz cały kod: #include "Editor.h"
Editor::Editor( std::string nTil, Vector2i size, RenderWindow & okno ) : NameTileset( nTil ) , MapSize( size ) { wnd =& okno; Field.setFillColor( Color( 100, 100, 100, 255 ) ); Field.setOutlineColor( Color::White ); Field.setOutlineThickness( 2 ); Field.setSize( Vector2f( 121, wnd->getSize().y ) ); Net.setFillColor( Color::Transparent ); Net.setOutlineColor( Color::Black ); Net.setOutlineThickness( 1 ); Net.setSize( Vector2f( 30, 30 ) ); if( Image.loadFromFile( nTil ) ) { Block.setTexture( Image ); Block.setPosition( 1, 1 ); } Level = new int *[ size.y ]; for( int i = 0; i < size.y; i++ ) Level[ i ] = new int[ size.x ]; RealTimeMap = new Sprite *[ size.y ]; for( int i = 0; i < size.y; i++ ) RealTimeMap[ i ] = new Sprite[ size.x ]; }
void Editor::CheckBlock() { if( Mouse::isButtonPressed( Mouse::Left ) ) { ActiveBlockPos.x =( Mouse::getPosition( * wnd ).x / 30 ) * 30; ActiveBlockPos.y =( Mouse::getPosition( * wnd ).y / 30 ) * 30; if( Mouse::getPosition( * wnd ).x <= 120 && Mouse::getPosition( * wnd ).x >= 0 && Mouse::getPosition( * wnd ).y <= wnd->getSize().y && Mouse::getPosition().y >= 0 ) { ActiveBlock.setTexture( Image ); ActiveBlock.setTextureRect( IntRect( ActiveBlockPos.x, ActiveBlockPos.y, 30, 30 ) ); } } }
void Editor::Update() { ActiveFieldX =( Mouse::getPosition( * wnd ).x / 30 ); ActiveFieldY =( Mouse::getPosition( * wnd ).y / 30 ); wnd->draw( Field ); wnd->draw( Block ); ActiveBlock.setPosition( ActiveFieldX * 30, ActiveFieldY * 30 ); wnd->draw( ActiveBlock ); }
void Editor::DrawBlock() { if( Mouse::isButtonPressed( Mouse::Left ) ) { if( Mouse::getPosition( * wnd ).x >= 121 ) { RealTimeMap[ ActiveFieldY ][ ActiveFieldX ] = ActiveBlock; RealTimeMap[ ActiveFieldY ][ ActiveFieldX ].setPosition( ActiveFieldX * 30, ActiveFieldY * 30 ); } } }
void Editor::DrawMap() { for( int i = 0; i < MapSize.y; i++ ) { for( int j = 0; j < MapSize.x; j++ ) { RealTimeMap[ i ][ j ].setPosition( j * 30 + 120, i * 30 ); wnd->draw( RealTimeMap[ i ][ j ] ); } } }
void Editor::DrawNet() { if( Keyboard::isKeyPressed( Keyboard::F2 ) ) { for( int i = 0; i < MapSize.y; i++ ) { for( int j = 0; j < MapSize.x; j++ ) { Net.setPosition( 120 + j * 30, i * 30 ); wnd->draw( Net ); } } } }
|
|
pekfos |
» 2014-06-28 15:04:37 ActiveFieldX =( Mouse::getPosition( * wnd ).x / 30 ); ActiveFieldY =( Mouse::getPosition( * wnd ).y / 30 );
|
Nie odejmujesz tu 120. |
|
GGG205 Temat założony przez niniejszego użytkownika |
» 2014-06-28 16:11:40 Jakie 120 ? Fakt zresztą efekt byłby taki sam jak w obrazku 2 tyle, że blok narysował by się dalej? |
|
pekfos |
» 2014-06-28 16:43:51 To sobie w pierwszym poście wyszukaj "120", jeśli na prawdę nie wiesz, skąd ta wartość.. Tu, czy gdzie indziej musisz to odjąć. To powoduje przesunięcie z obrazka 2 i błąd, gdy rysujesz za daleko na prawo. RealTimeMap[ ActiveFieldY ][ ActiveFieldX ] = ActiveBlock; RealTimeMap[ ActiveFieldY ][ ActiveFieldX ].setPosition( ActiveFieldX * 30, ActiveFieldY * 30 );
|
To w sumie będzie lepsze miejsce, niż poprzednie zacytowane. |
|
GGG205 Temat założony przez niniejszego użytkownika |
» 2014-06-28 17:47:23 Chodziło Ci o coś takiego ? RealTimeMap[ ActiveFieldY ][ ActiveFieldX ] = ActiveBlock; RealTimeMap[ ActiveFieldY ][ ActiveFieldX ].setPosition(( ActiveFieldX * 30 ) - 120, ActiveFieldY * 30 ); oraz część, gdzie mapa jest przesuwana RealTimeMap[ i ][ j ].setPosition( j * 30 + 120, i * 30 ); Bo jeśli tak to nic się nie dzieje. @Edit Wywaliłem RealTimeMap[ ActiveFieldY ][ ActiveFieldX ].setPosition( ActiveFieldX * 30, ActiveFieldY * 30 ); bo zauważyłem, że to nic nie daje, a chociaż powinno. |
|
pekfos |
» 2014-06-28 21:03:25 Chodzi mi o indeksy. Od ActiveFieldX musisz odjąć 4. |
|
GGG205 Temat założony przez niniejszego użytkownika |
» 2014-06-28 21:49:35 JJAAAA, ale ja głupi jestem. Ciągle próbowałem odejmować te 120 w setPosition. Dobra dzięki. |
|
« 1 » |