Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

11

17.06.2008, 21:10

Du musst die Sprites zwischen dem Aufruf von begin() und end() der Spriteengine hinzufügen und nach end() rendern - außerdem solltest du die Partikel erst hinzufügen und dann mit einem Mal rendern - weil die im Gegenteil zu dem Sprites nicht gleich gelöscht werden und damit für jede Rakete neu gezeichnet werden würden ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    for(int i = 0; i < 20; i++) { 
        SpriteEng->Begin(Kamera, Kamerapos);   // Sprites löschen und aufs Hinzufügen Neuer vorbereiten

        
        for(int j = 0; j <= 15; j++) 
            SpriteEng->AddSprite(j, Rocket[i].Pos - tbVector3(0.0f, 0.0f, 30.0f), tbColor(1.0f), tbVector2(5.0f)); 

        Particle->AddParticle(1.0f, 0.0f, 15.0f, Rocket[i].Pos, tbVector3(0.0f)); 

        SpriteEng->End(); // Sprites aufs Rendern vorbereiten        

        if(Rocket[i].bExplode) {

     
            SpriteEf->Begin(); 
            SpriteEf->Pass(0); 
            D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity()); 
            SpriteEng->Render(0, 15);
            SpriteEf->End();
             
            //tbWriteToLog("Sprite rendern!"); 

            
        } 
    }
    // Partikel im Nachhinein EINMAL rendern - weil die Partikel im Partikelsystem gespeichert bleiben und sonst für jede Rakete neu gezeichnet werden

    //

    SpriteEng->Begin(Kamera, Kamerapos);   // Sprites löschen und aufs Hinzufügen Neuer vorbereiten

    Particle->AddToSpriteEngine(SpriteEng);
    SpriteEng->End(); // Sprites aufs Rendern vorbereiten

 
    SpriteEf->Begin(); 
    SpriteEf->Pass(0); 
    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity()); 
    SpriteEng->Render(0, -1); // Alle Partikel rendern

    SpriteEf->End();


Außerdem solltest du deswegen: https://www.spieleprogrammierer.de/phpBB…8738&highlight=

C-/C++-Quelltext

1
CORR_PARTICLES(g_pParticles);


hinter jeden Aufruf von AddParticle schreiben - sonst wird dein Programm abstürzen wenn die Particelengine voll wird ;)

C-/C++-Quelltext

1
2
3
// Implementierung

//

#define CORR_PARTICLES(pParticles) {    if(((DWORD*)(pParticles))[1] >= ((DWORD*)(pParticles))[0]){ ((DWORD*)(pParticles))[1] = ((DWORD*)(pParticles))[0];}}


Ich weiß - is ziemlich unsauber aber es hilft ;) - solange der Fehler nicht ausgebessert wird muss man wohl so auskommen
Hältst du nicht den Bug in Ehren, wird er dich noch manches Lehren.

Ein Gespräch setzt voraus, dass der andere Recht haben könnte.

Ich00nix

Frischling

  • »Ich00nix« ist der Autor dieses Themas

Beiträge: 63

Wohnort: Kaiserslautern

Beruf: Schüler

  • Private Nachricht senden

12

18.06.2008, 12:24

super vielen Dank ich werds sofort ausprobeiren!!!!!!

Ich00nix

Frischling

  • »Ich00nix« ist der Autor dieses Themas

Beiträge: 63

Wohnort: Kaiserslautern

Beruf: Schüler

  • Private Nachricht senden

13

18.06.2008, 14:15

jawoll das is ja schon ein deutlicher Fortschritt aber klappen tut es immer noch nicht ganz^^

ich habe die renderfunktion jetzt dank eurer Hilfe in bisschen um geschrieben sie sieht jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if(Rocket[0].bExplode) {
SpriteEng->Begin(Kamera, Kamerapos);
        Particle->AddParticle(1.0f, 0.0f, 15.0f,tbVector3(0.0f, 0.0f, 30.0f), tbVector3(0.0f), 1.0, 40.0f, 40.0f, tbColor(1.0f, 1.0f, 1.0f, 1.0f), tbColor(1.0f, 1.0f, 1.0f, 1.0f), 0.0f, 0.0f);
        Particle->AddToSpriteEngine(SpriteEng);
        SpriteEng->End();
        Rocket[0].bExplode = false;
    }
        
        SpriteEf->Begin(); 
        SpriteEf->Pass(0); 
        D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity()); 
        SpriteEng->Render(0, -1); // Alle Partikel rendern 

        SpriteEf->End();


meiner meinung nach sollte dieser code jetzt eine Explosion an der Stelle 0,0,30 erstellen tut er aber nich :(

ich habe überlegt ob es vllt. am effekt liegt und habe mir den mal angeschaut (ist im mom der galactica effekt) der sieht jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
TEXTURE Texture;

TECHNIQUE T1
{
    PASS P1
    {
        Texture[0]      = <Texture>;
        ZEnable                 = True;
        ZWriteEnable        = False;

        ColorOp[0]      = Modulate;
        ColorArg1[0]        = Texture;
        ColorArg2[0]        = Current;
        AlphaOp[0]      = Modulate;
        AlphaArg1[0]        = Texture;
        AlphaArg2[0]        = Current;
        ColorOp[1]      = Disable;

        AlphaBlendEnable    = True;
        SrcBlend        = SrcAlpha;
        DestBlend       = One;
        AlphaTestEnable     = True;
        AlphaFunc       = Greater;
        AlphaRef        = 7;

        Lighting        = False;
        ColorVertex     = True;
        CullMode        = None;
    }
}


wenn ich das so lasse sehe ich zwar den Sprite aber hinter allem anderen also hinter meinen modellen und so was ja eig. nicht beabsichtigt ist
wenn ich jetzt das ZWriteEnable auf True setzt ist der Sprite zwar an der richtigen Stelle allerdings nur als Textur also ohne alphablending was auch nciht so schön ist weil man dann nicht mehr sieht außer diesen Sprite

ein weiterer unangenehmer Effekt ist , dass die Explosion leider nicht explodiert sondern eben nur der Besagte Sprite gerendert wird was auch nich so dolle is^^

vllt. könntet ihr mir nochmal helfen
vielen Dank!

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

14

18.06.2008, 14:46

Dein Code erstellt ein Partikel und fügt es EINMAL zur Spritengine dazu - und da du Begin() (Löscht die bestehenden Sprites in der Spriteengine) nur einmal für jede Explosion aufrufst siehst du auch nur das ERSTE Sprite der Explosion(bzw. wenn gleich danach noch eine Rakete explodiert auch die aktuallisierten Sprites der alten Explosionen) ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SpriteEng->Begin(Kamera, Kamerapos);  // Alte Sprites löschen - aufs Hinzufügen neuer vorbereiten


if(Rocket[0].bExplode) { // bei Explosion einen neuen Partikel erstellen

     Particle->AddParticle(1.0f, 0.0f, 15.0f,tbVector3(0.0f, 0.0f, 30.0f), tbVector3(0.0f), 1.0, 40.0f, 40.0f, tbColor(1.0f, 1.0f, 1.0f, 1.0f), tbColor(1.0f, 1.0f, 1.0f, 1.0f), 0.0f, 0.0f);
     Rocket[0].bExplode = false;   // Partikel wurde erstellt und bleibt in der Partikelengine - nochmal Hinzufügen ist nicht mehr nötig

} 
Particle->AddToSpriteEngine(SpriteEng);  // Alle Partikel zur Spriteengine fürs Rendern hinzufügen

SpriteEng->End(); // Alles in der Spriteengine -> Aufs Rendern vorbereiten


        
SpriteEf->Begin(); 
SpriteEf->Pass(0); 
D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity()); 
SpriteEng->Render(); // () ist das selbe wie (-1, -1) -> Alle Partikel rendern 

SpriteEf->End();


Du solltest, wenn du mit Partikel arbeitest immer für jedes Frame die Spriteengine löschen - denn die Partikel werden ja immer aktuallisiert ;) - so wie du's versucht hast wird für jede Explosion die Spriteengine geleert - und die aktuallisierten Partikel hinzugefügt - da diese Explosionen vermutlich nicht so häufig sind bekommst du lauter Standbilder ;)

Außerdem - Sprites IMMER ganz am Schluss rendern(vermutlich sin deine Sprites deswegen verdeckt, weil sie nach den Modellen gerendert werden)

Zum Effekt - Wenn du ZWriteEnable auf True setzt heißt das so viel wie das Modelle HINTER dem Sprite NICHT gerendert werden (weil diese ja verdeckt sind) - also niemals in Kombination mit Alphablending (wenn etwas transparent is kann es ja die sicht nicht völlig verdecken) - Fazit - Transparentes immer erst am Schluss zeichnen ;)
Hältst du nicht den Bug in Ehren, wird er dich noch manches Lehren.

Ein Gespräch setzt voraus, dass der andere Recht haben könnte.

Ich00nix

Frischling

  • »Ich00nix« ist der Autor dieses Themas

Beiträge: 63

Wohnort: Kaiserslautern

Beruf: Schüler

  • Private Nachricht senden

15

18.06.2008, 20:42

perfekt! vielen Dank!

das mit dem nur einmal hinzufügen hatte ich inzwischen selbst rausgefunden das war natürlich dumm! aber mit dem rendern in verschiedenen reihenfolgen da wär ich glaub ich nich selbst drauf gekommen obwohls so logisch eig. is^^

naja also vielen Dank das war ging echt so super schnell und war so gut erklärt wie ich es noch die hatte!

Werbeanzeige