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 void Particle::Update( sf::Time elapsed ) { if( m_emitting ) { for( int i = 0; i < m_fuel; i++ ) { P * p = new P; float angle =(( rand() % m_angle ) ) + m_angleOffset; 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++ ) { ( * 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(); }
void Particle::Draw( sf::RenderWindow * okno ) { sprite.setTexture( render.getTexture() ); 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? |
|
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. |
|
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? |
|
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. |
|
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) 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 |
|
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.
|
|
1 « 2 » |