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

[SFML 2.1]Rozmieszczenie bloków w edytorze map.

Ostatnio zmodyfikowano 2014-06-28 21:49
Autor Wiadomość
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:

C/C++
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 );
        }
    }
}
C/C++
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:
C/C++
#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 );
            }
        }
       
    }
}
P-112876
pekfos
» 2014-06-28 15:04:37
C/C++
ActiveFieldX =( Mouse::getPosition( * wnd ).x / 30 );
ActiveFieldY =( Mouse::getPosition( * wnd ).y / 30 );
Nie odejmujesz tu 120.
P-112879
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?
P-112885
pekfos
» 2014-06-28 16:43:51
Jakie 120 ?
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.
C/C++
RealTimeMap[ ActiveFieldY ][ ActiveFieldX ] = ActiveBlock;
RealTimeMap[ ActiveFieldY ][ ActiveFieldX ].setPosition( ActiveFieldX * 30, ActiveFieldY * 30 );
To w sumie będzie lepsze miejsce, niż poprzednie zacytowane.
P-112889
GGG205
Temat założony przez niniejszego użytkownika
» 2014-06-28 17:47:23
Chodziło Ci o coś takiego ?

C/C++
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.
P-112892
pekfos
» 2014-06-28 21:03:25
Chodzi mi o indeksy. Od ActiveFieldX musisz odjąć 4.
P-112894
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.
P-112898
« 1 »
  Strona 1 z 1