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

Tworzenie obiektu operatorem new tego samego typu co inny obiekt

Ostatnio zmodyfikowano 2014-06-23 20:06
Autor Wiadomość
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-22 21:01:51
vektor pozostawi mi śmieci w pamięci a nie chce mi się bawić w tego obsługę. Dodakowo listą mam szybszy dostęp kazdego elementu, przytym na każdą cząsteczke wywołuje odpowiednie funkcje wiec potrzebuje raczej tego.
Particle.cpp
C/C++
void Particle::Update( sf::Time elapsed )
{
    if( m_emitting ) ///EMITTING SECTION
    {
        for( int i = 0; i < m_fuel; i++ )
        {
            P * p = new P;
           
            float angle =(( rand() % m_angle ) ) + m_angleOffset; // * PI / 180;
           
            p->lifetime = m_lifetime + milliseconds(( rand() % m_lifetimeVariation ) ); ///?!?!?!
           
            p->velocity.x = cos( angle * PI / 180 ) * m_speed +( rand() % m_speedVariation - m_speedVariation / 2 );
            p->velocity.y = sin( angle * PI / 180 ) * m_speed +( rand() % m_speedVariation - m_speedVariation / 2 );
           
            p->color = m_color;
            p->position = Vector2f( m_positionX, m_positionY );
           
            p->shape.setRadius( m_radius );
           
            m_particles.push_back( p );
        }
    }
   
    render.clear( Color( 0, 0, 0, 0 ) );
   
    for( m_it = m_particles.begin(); m_it != m_particles.end(); m_it++ ) ///UPDATING SECTION
    {
        ( * m_it )->lifetime -= elapsed;
       
        if(( * m_it )->lifetime <= Time::Zero )
        {
            delete( * m_it );
            m_particles.erase( m_it++ );
            continue;
        }
       
        ( * m_it )->velocity.y += m_gravity * elapsed.asSeconds();
       
        ( * m_it )->position.x +=( * m_it )->velocity.x * elapsed.asSeconds();
        ( * m_it )->position.y +=( * m_it )->velocity.y * elapsed.asSeconds();
       
        if(( * m_it )->lifetime <= seconds( m_dietime ) )
        {
            ( * m_it )->color.r = static_cast < Uint8 >((( m_color.r - m_colorDie.r ) *(( * m_it )->lifetime.asSeconds() / m_lifetime.asSeconds() ) ) );
            ( * m_it )->color.g = static_cast < Uint8 >((( m_color.g - m_colorDie.g ) *(( * m_it )->lifetime.asSeconds() / m_lifetime.asSeconds() ) ) );
            ( * m_it )->color.b = static_cast < Uint8 >((( m_color.b - m_colorDie.b ) *(( * m_it )->lifetime.asSeconds() / m_lifetime.asSeconds() ) ) );
        }
       
        if( m_diffusionBool )
        {
            ( * m_it )->color.a = static_cast < Uint8 >( m_diffusion *(( * m_it )->lifetime.asSeconds() / m_lifetime.asSeconds() ) );
        }
       
        ( * m_it )->shape.setFillColor(( * m_it )->color );
        ( * m_it )->shape.setPosition(( * m_it )->position );
        render.draw(( * m_it )->shape );
    }
    render.display();
   
}
///////DRAW/////////////////////////////////////////
void Particle::Draw( sf::RenderWindow * okno )
{
    // render.setView( okno->getView() );
    sprite.setTexture( render.getTexture() );
    //sprite.setPosition( okno->getView().getCenter().x - Core::WindowX/2, okno->getView().getCenter().y - Core::WindowY/2 );
    //sprite.move( -Core::WindowX/2, 0);
    okno->draw( sprite );
}
Ten kod tutaj to tak w razie co...
ale skupmy sie na problemie...

No dobra, RenderTexture nie jest kopiowane to co teraz? Mam napisać konstruktor kopiujący z wyłączeniem kopiowania RenderTextur czy poprostu klapa i nic nie zrobie?
P-112534
Monika90
» 2014-06-22 21:57:13
vektor pozostawi mi śmieci w pamięci a nie chce mi się bawić w tego obsługę. Dodakowo listą mam szybszy dostęp kazdego elementu, przytym na każdą cząsteczke wywołuje odpowiednie funkcje wiec potrzebuje raczej tego.
Ale dlaczego to jest lista wskaźników do P, a nie po prostu lista P?

No dobra, RenderTexture nie jest kopiowane to co teraz? Mam napisać konstruktor kopiujący z wyłączeniem kopiowania RenderTextur czy poprostu klapa i nic nie zrobie?
Nie wiem co zrobić z RenderTexture, bo nie wiem po co to tam jest.

Przy okazji, jak kopiujeszs sprite'a i teksturę, to chyba musisz tak to zrobić, żeby kopia sprite'a odnosiła się do kopii tekstury, a nie do oryginału.

Wiesz, w ogóle to wygląda na zbyt skomplikowane i pewnie niewiele z tego wyjdzie.
P-112538
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-22 22:03:47
podałem funckje w której obi "wątpliwości" sa wyjaśnione. Wskaźniki bo cząsteczki sa tworzeone operatorem new tyli ile "paliwo" (m_fuel) każe na obieg pętli (np. 8). Kazda cząsteczke (tez jest podany jej kod wcześniej) to struktura ze sf::Spritem i ten sprite jest dodawany do RenderTexture ( Upadte() ), a to zaś wyświetlane ( Draw() )

e1/ to może jadnak wrócić do rozpoznania tych typów?
P-112539
michal11
» 2014-06-23 01:27:16
Zastanów się może nad reorganizacją swojego kodu, Widzę, że teraz masz trochę problemów a czasem będzie ich tylko przybywało. Dodatkowo sprawdzanie typu obiektu w programie nie jest chyba najbardziej eleganckim rozwiązaniem.
P-112548
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-23 18:59:55
Nie ma rzeczy nie możliwych (nawet dla tego co idzie z motyką na słońce :D)
temat załatwiłem, nie wiem czy ma sens opisywać co zrobiłem ale tak pokrótce, jak pisałem, stworzyłem konstruktor kopiujący dla Particle z wyłączeniem kopiowania RenderTexture, potem wykorzystałem ten kod od Moniki90 tworzący kopie obiektów, pare innych wymagających zabiegów i rezultaty są przepiękne (jak to cieszą początkującego programiste ogromne i skomplikowane, jak na jego rozum, ale własne, mechanizmy). Kod reaguje elegancko, implementacja nowych klas też bardzo prosta bo ogranicza się do zmiany parametrow w konstruktorze i dodani jednego ifa... a właśnie, bo żeby obsłużyć item to musze robić tak:    (to jest przy tworzeniu itemów za pomocą komend konsoli)
C/C++
if( itemtype == "ItemBuffHp" )
{
    item = new ItemBuffHp;
}
else if( itemtype == "ItemBuffSp" )
{
    item = new ItemBuffSp;
}
else if( itemtype == "ItemAmmoWizardBasic" )
{
    item = new ItemAmmoWizardBasic;
}
Nie da rady tego jakoś zamienić na [/cpp] item = new string.c_str();[/cpp]? w sensie żeby nie robić ifów tylko tak jakby od razu wpisywać nazwe?

Jeszcze raz dziekuje, szczegolnie Monice90
P-112588
libed
» 2014-06-23 20:06:24
Factory method/Factory

Dziedziczenie powinno być ułatwieniem a nie utrudnieniem. Jeśli potrzebujesz sprawdzania typu i rzutowania w dół to coś jest nie tak.

P-112594
1 « 2 »
Poprzednia strona Strona 2 z 2