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

[SFML]System cząsteczkowy

Ostatnio zmodyfikowano 2014-02-14 12:33
Autor Wiadomość
kokon
Temat założony przez niniejszego użytkownika
[SFML]System cząsteczkowy
» 2014-02-14 10:52:56
Witam,
ostatnio zacząłem pisać system cząsteczkowy do mojej gry, i utknąłem w martwym punkcie. Dokładnie chodzi o punkt, w który trzeba wyliczyć gdzie powinna się znaleźć cząsteczka po przejściu jednej kratki.
A przy okazji, mógłby powiedzieć mi, czy robię to poprawnie, czy powinienem to rozwiązać jakość inaczej? Bo to moja pierwsza próba jeśli chodzi o takie rzeczy ;)
Kod:

particles.hpp
C/C++
#ifndef PARTICLES_HPP_INCLUDED
#define PARTICLES_HPP_INCLUDED
#include <SFML/Graphics.hpp>
#include <iostream>

extern sf::RenderWindow oknoAplikacji;



class particle
{
public:
    void render( sf::RenderWindow * a );
    particle( short x2, short y2, short direction2, short power2 );
private:
    short x;
    short y;
    short direction;
    short power;
    short opadanie;
};

class emitter
{
public:
    void render( sf::RenderWindow * a );
    void emit( short x, short y );
private:
    particle ** pTab;
};
#endif // PARTICLES_HPP_INCLUDED

particles.cpp
C/C++
#include "particles.hpp"

void emitter::emit( short x, short y )
{
    this->pTab = new particle *[ 80 ];
   
    for( int i = 0; i < 80; ++i )
    {
        pTab[ i ] = new particle( x, y,( rand() % 360 ) + 0,( rand() % 15 ) + 0 );
    }
};

void emitter::render( sf::RenderWindow * a )
{
    for( int i = 0; i < 80; ++i )
    {
        pTab[ i ]->render( a );
    }
};

particle::particle( short x2, short y2, short direction2, short power2 )
{
    this->x = x2;
    this->y = y2;
    this->direction = direction2;
    this->power = power2;
};

void particle::render( sf::RenderWindow * a )
{
    std::cout << "Testowy particl sie melduje" << std::endl;
   
    sf::VertexArray kwadrat( sf::Quads, 4 );
    kwadrat[ 0 ].color = sf::Color::Red;
    kwadrat[ 1 ].color = sf::Color::Red;
    kwadrat[ 2 ].color = sf::Color::Red;
    kwadrat[ 3 ].color = sf::Color::Red;
   
    //Silnik pseudo-fizyki                              <=== Tu utknąłem
   
   
   
   
    kwadrat[ 0 ].position = sf::Vector2f( this->x, this->y );
    kwadrat[ 1 ].position = sf::Vector2f( this->x + 3, this->y );
    kwadrat[ 2 ].position = sf::Vector2f( this->x + 3, this->y + 3 );
    kwadrat[ 3 ].position = sf::Vector2f( this->x, this->y + 3 );
   
    a->draw( kwadrat );
   
};

Z góry dziękuję za wszelką pomoc.
P-104627
PsichiX
» 2014-02-14 12:33:00
Przede wszystkim particle to rzecz, która powinna być zoptymalizowana pod kątem jak najszybszego renderingu - czyli załatwiona jednym draw callem. Rozwiązanie jest proste ideologicznie: jeden wielki vertex buffer ze wszystkimi particlesami. Oczywiście ustawiasz sobie limit np. jednego miliona cząstek i operujesz ich skalą dla uzyskania funkcjonalności "żywa/martwa" cząstka. To tak odnośnie złego podejścia jakie zastosowałeś aktualnie, czyli rysowanie każdego z osobna. Serio, da się uzyskać 30fps dla miliona cząstek na ekranie, chociażby używając Float Textures do przechowywania danych o cząstkach.
P-104631
« 1 »
  Strona 1 z 1