|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
FanBoy Mini JLI'ler
Anmeldedatum: 21.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 20.08.2003, 10:35 Titel: Scrolling - Transparenz - Surfaces |
|
|
HiHo, schon wieder ein Problem =(
Ich habe aus dem Scrolling2 Beispiel aus Christians Buch eine eigene Klasse gemacht. Nun wollte ich mehre Objekte davon anlegen und mehre Hintergründe hintereinander scrollen lassen. Zum Beispiel Wald vorne und Hinter langsam die Berge... müsste eignetlich gut aussehen. Aber dummerweise sieht man immer nur das erste Bild. Wo wird der Alphakanal ignoriert? Bei Surfaces allgemein? Bei D3DXLoadSurfaceFromFile? Bei StretchRect? Beim Zugriff auf die Pixel der gesperrten Oberflächen...?
Hat vielleicht sogar irgendwer eine Lösung für das Problem? |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 20.08.2003, 10:43 Titel: |
|
|
Bei mir wird der Alphakanal nur bei D3DXLoadSurfaceFromFile übernommen. Und dann wird von allen anderen Funktionen dieser Alphakanal verwendet... Wenn ich auch ne normale Oberfläche anlege kriege ich kein Alpha zustande. Wäre auch an der Lösung interessiert wie man einer LPDIRECT3DSURFACE9 Surface einen Alphakanal geben kann, wenn man kein Bild in die Surface lädt. _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
FanBoy Mini JLI'ler
Anmeldedatum: 21.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 20.08.2003, 11:01 Titel: |
|
|
moment mal...
wenn du etwas in der Richtung schreibst:
Code: |
m_lpD3DDevice->CreateOffscreenPlainSurface(SrcInfo.Width,SrcInfo.Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT,&m_lpTempSurface,NULL); //eine Oberfläche in der Größe des Bildes wird erzeugt
D3DXLoadSurfaceFromFile (m_lpTempSurface,NULL,NULL,filename,NULL,D3DX_FILTER_NONE,NULL,&SrcInfo); //Das Bild wird in die Oberfläche übertragen (größen gleich)
m_lpD3DDevice->StretchRect(m_lpTempSurface,NULL,m_lpBackBuffer,&r,D3DTEXF_NONE); //die Bild-Surface wird in den backpuffer geflippt
|
Dann erhälst du ein Bild, bei dem der Hintergrund transparent gezeichnet wird? hui... bei mir funzt das nicht, der (eigentlich unter PSP als transparent eingetragener) Hintegrund wird weiß/grau dargestellt.
Das gleiche Bild als Textur als Sprite genutzt funzt... |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 20.08.2003, 11:20 Titel: |
|
|
Langsam glaube ich, dass man Surfaces in DX9 keine ColorKeys geben kann...
also so funktioniert das mit dem Laden von Bildern mit tranzparenten Hintergrund, ist aber leider mit 3DSprite...
Code: | D3DXCreateTextureFromFileEx(lpD3DDevice,
Filename,
ImageFileInfo.Width,
ImageFileInfo.Height,
1,0,
D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,
D3DX_FILTER_NONE,
D3DX_FILTER_NONE,
D3DCOLOR_XRGB(theRGB.r,theRGB.g,theRGB.b),0,0,&lpTexture); |
theRGB setzt die transparente Farbe fest. _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 20.08.2003, 11:30 Titel: |
|
|
Wenn ich mich richtig erinnere unterstützt StrechRect() keine Alphakanäle. Ihr könntet z.B. mit dem Sprite-Interface arbeiten oder auch ein Rechteck aus zwei Dreiecken aufbauen und das Texturieren.
Christian |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 20.08.2003, 12:04 Titel: |
|
|
Bei mir geht das auch so nicht:
Code: | // Offscreen-Surface anlegen
own_lp3DDevice->CreateOffscreenPlainSurface(
own_width, // Breite der Oberfläche
own_height, // Höhe der Oberfläche
D3DFMT_A8R8G8B8, // Format
D3DPOOL_DEFAULT, // Pool
&own_Surface, // Zeiger auf die Oberfläche
0); // Handle muss 0 sein
|
Code: |
own_lp3DDevice->ColorFill(own_Surface,NULL,own_bgcolor);
DD_2D_Graphics.Text(x,y,own_textcolor,own_text,own_Surface); |
DD_2D_Graphics.Text ist eine TextEngine laut Zerbst. Indem ich nur die Pixel übermale die ich verändern muss. Also mit LockRect ...
own_bgcolor kriegt den Wert D3DCOLOR_ARGB(0,0,0,0)
Oder unterstützt ColorFill auch kein ALpha? _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
FanBoy Mini JLI'ler
Anmeldedatum: 21.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 20.08.2003, 12:41 Titel: |
|
|
Tja, schade eigentlich...
Jetzt scheitert das alles an StrechRect...
Mit Sprites arbeiten kommt beim Hintergrund eher nicht in Frage, dafür sind die Beschränkungen in Größe und Form zu heftig.
Und das mit den zwei texturierten Dreiecken würde Direct3D vorraussetzen und soweit bin ich eigentlich noch nicht...
Naja, vielleicht wage ich den Sprung mal. DX9 ist wirklich ein bisschen 2D Feindlich... wahrscheinlich sind die Zeiten wirklich vorbei. |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 20.08.2003, 13:06 Titel: |
|
|
Das Sprite-Interface arbeitet intern auch mit Dreiecken und Texturen. Es ist nicht kompliziert das selbst zu machen. Andererseits ist es auch kein Problem das Sprite Interface zu nutzen. Z.B. den oberen Teil des Hintergrunds (Himmel, Wolken) mit StrecthRect und die Berge dann aus 4 256*256 Texturen (Sprites) mit Alphakanal bauen? Warum sollte das nicht gehen?
Christian |
|
Nach oben |
|
|
FanBoy Mini JLI'ler
Anmeldedatum: 21.07.2003 Beiträge: 33
Medaillen: Keine
|
Verfasst am: 20.08.2003, 15:26 Titel: |
|
|
Du hast natürlich Recht =)
Aber es ist ein bisschen umständlich, mit Surfaces würde man einfach zwei Ebenen des Hintergrund malen. Mit Sprites muss man viele kleine Bilchen malen, man muss im Code angeben wo sie erscheinen sollen... alles nicht so leicht.
ABER: Weil mir auch keine andere Lösung einfällt habe ich es übrings ungefähr so gemacht wie du gesagt hast. Ich hab jetzt zwei Surfacehintergründe und da wo die Überschneidungen wären, verwende ich Sprites...
Muss man halt nur einen leistungsfähigen Leveleditor dazu schreiben, der das Arbeiten damit vereinfacht.
Problem gelöst THX@ALL =) |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|