Hi, ich habe mir einen kleinen Partikelemitter geschrieben, aber so richtig tut er es nicht.
man sollte zunächst einmal 2 keyframes angeben können (anfang und ende), die position, die richtung,
den grad der streuung, lebensdauer etc. aber ich sehe nichts, und als ich ein bild hatte, hats net so funktioniert wie es sollte und nach einiger zeit bekam ich eine fehlermeldung. jemand ne idee ?
TVector2D ist einfach ein record
Code:
function angle_to_v2d(angle:single): TVector2D;
begin
result := to_v2d(cos(degtorad(angle)),sin(degtorad(angle)));
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Vielleicht solltest du uns noch verraten, was für eine Fehlermeldung kommt, und an welcher Stelle sie auftritt.
Auch halte ich den Code hier für riskant:
Code:
for i :=0tohigh(FParticles)do
if FParticles[i].Age >= FLifeSpan then
begin
for j := i tohigh(FParticles)-1do
FParticles[j]:= FParticles[j +1];
setlength(FParticles,length(FParticles)-1);
end;
Hier hängt es wirklich vom (intelligenten) Compiler ab, ob der Code so läuft.
Und könnte es sein, dass du einfach Size zu klein und MaxDepth zu gross gewählt hast?
Vielleicht solltest du uns noch verraten, was für eine Fehlermeldung kommt, und an welcher Stelle sie auftritt. Auch halte ich den Code hier für riskant:
Code:
for i :=0tohigh(FParticles)do
if FParticles[i].Age >= FLifeSpan then
begin
for j := i tohigh(FParticles)-1do
FParticles[j]:= FParticles[j +1];
setlength(FParticles,length(FParticles)-1);
end;
Also in Delphi wird der Code wohl kaum wie erwünscht funktionieren, da die Parameter von FOR-Schleifen nur einmal berechnet werden. Er würde wohl funktionieren wenn du die erste schleife auf rückwärtszählen ändern würdest.
Trotzdem ist der Algo so nicht gerade effizient (O(N^2)) und dazu noch viele SetLength.
Probier mal folgendes (Achtung ungetestet), sollte aber funzen
Vielleicht solltest du uns noch verraten, was für eine Fehlermeldung kommt, und an welcher Stelle sie auftritt. Auch halte ich den Code hier für riskant:
Code:
for i :=0tohigh(FParticles)do
if FParticles[i].Age >= FLifeSpan then
begin
for j := i tohigh(FParticles)-1do
FParticles[j]:= FParticles[j +1];
setlength(FParticles,length(FParticles)-1);
end;
Hier hängt es wirklich vom (intelligenten) Compiler ab, ob der Code so läuft.
Und könnte es sein, dass du einfach Size zu klein und MaxDepth zu gross gewählt hast?
im moment tritt kein fehler auf, und ich dachte mir, dass diese stelle probleme macht, ich werde mal the-winners lösung testen
//EDIT: habs getestet, leider immer noch nichts zu sehen, das setup sieht so aus:
Code:
Emitter := TParticleEmitter.Create(Engine);
with Emitter do
begin
position := to_v2d(Engine.width/2, Engine.Height/2);
angle :=0;
emissionangle :=180;
Emissionrate :=5000;
ParticlesPerEmission :=12;
Texture :='spark';
LifeSpan :=5000;
with LifeBegin do
begin
velocity :=100;
alpha :=255;
size := to_v2d(25,25);
end;
with LifeEnd do
begin
velocity :=0;
alpha :=0;
size := to_v2d(25,25);
end;
end;
und an size und maxdepth liegt es nicht, da diese auch bei normalen objekten funktionieren,
korrekterweise muss beim zeichnen auch ein z / maxdepth + 1 dahin, statt + 2
maxdepth ist 512
man merkt aber, wie der emitter zunehmend fps schluckt und letztenendes konstant bleibt, nur irgendetwas
stimmt net....
es liegt an der interpolation von LifeBegin und LifeEnd, wenn ich das weglasse, funktioniert es zum teil, die größe ist dann einfach zu klein
ich verstehe nicht genau was du meinst, das translaten mache ich damit sich die größe am ende der fenstergröße anpasst, man kann dafür auch glScalef nehmen, aber ich hab das erstmal so gemacht.
man gibt ja die größe / geschwindigkeit etc für anfang und ende des lebens eines partikels an, und jetzt soll eben anhand des alters des partikels, die geschwindigkeit etc interpoliert werden, beispiel:
geg: geschwindigkeit am anfang: 100
geschwindigkeit am ende: 0
lebensdauer: 1000 ms
ges:
geschwindigkeit zum zeitpunkt X
bei 500ms wäre das dann 50
eine dokumentation gibts, wenn das alles fertig ist, bzw wenn text und partikel engine funzen, dann schreiben ich noch ein paar samples und dokumentier den ganzen kram, ich kann aber in die partikel unit noch ein paar kommentare setzen
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Seth hat geschrieben:
ich verstehe nicht genau was du meinst, das translaten mache ich damit sich die größe am ende der fenstergröße anpasst, man kann dafür auch glScalef nehmen, aber ich hab das erstmal so gemacht.
Du hast 2 Partikel. Das erste wird korrekt mit Abstand vom Ursprung gezeichnet (mit deiner Skalierung). Das zweite wird aber nicht mehr korrekt gezeichnet, da es nicht vom Ursprung aus verschoben wird, sondern von der Position des ersten Partikels.
Daher wirst du wohl alle Partikel gezeichnet haben, nur sind diese irgendwo im nichtsichtbaren Bereich.
ups, ich sehe, push und popmatrix müssen in die schleife ^^ ok hätten wir das gelöst ^^ dann fehlen noch die interpolationen
und bewegen tut sich auch grad nichts, aber wir werden sehen ^^
EDIT: ja es lag an der berechnung, es fehlte überall noch ein LifeBegin + davor
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.