Sprite soll sprite verdecken ^^

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Sprite soll sprite verdecken ^^

Beitrag von Nero »

Hiho,

Ich hab hier ein kleines problemchen und zwar erstelle ich mir eine
Tilemap aus einem Structure Array was ja eigentlich auch egal ist da das ja soweit prima funktioniert *g*

Mein problem ist folgendes ich speicher in der structure die layer und infos ob
das das sprite vor oder hinter dem Spieler gezeichnet werden soll, soweit ist ja auch alles in ordnung und wurde auch alles genau so wie es sollte
dargestellt.

Nun habe ich aus testzwecken mal ein charset hergenommen mir da das erste sprite rausgegrapt und mit darstellen lassen.
(Die größe der Sprites des Charsets ist aber in der höhe großer als die der Sprites der Tilemap)
Im ersten Moment dachte ich ok funktioniert alles prima da kann ich ja weitermachen, doch als ich in der structur dem Sprite auf dem der Player stand angegeben habe das dieses sprite nun vor dem Player dargestellt werden sollte so das seine beine vom sprite verdeckt werden muste ich feststellen, tjo leider steht er immernoch komplet in der landschaft rum ^^


Hier mal der Code der Beiden Proceduren für die darstellung
Hab ich da was falschgemacht oder irgent nen logik fehler?

Code: Alles auswählen

Procedure RunWorld()  

   CurrentChip.l = 0
   DisplayStart_x.l = pStart_x - ScreenTiles_x
   DisplayStart_y.l = pStart_y - ScreenTiles_y
   DisplayStop_x.l  = pStart_x + ScreenTiles_x
   DisplayStop_y.l  = pStart_y + ScreenTiles_y
   
  y_y.l = 0 
  For y = DisplayStart_y To DisplayStop_y
  
    x_x.l = 0
    For x = DisplayStart_x To DisplayStop_x
    
      CurrentTile.l = y * Size_X + x
      
      For l = 0 To LayerDepth             
        CurrentChip = World.Map(CurrentTile)\Tile[l] 
        
        If CurrentChip <> 0       
       
        If World.Map(CurrentTile)\BeforePlayer[l] = 0                
          DisplayTransparentSprite(6000 + CurrentChip - 1 ,  x_x * Gridsize_X, y_y * Gridsize_Y ) 
          DrawPlayer()
        Else          
          DrawPlayer()
          DisplayTransparentSprite(6000 + CurrentChip - 1,  x_x * Gridsize_X, y_y * Gridsize_Y ) 
        EndIf
       EndIf  
      Next    
     
      x_x + 1
    Next
     
    y_y + 1
  Next

EndProcedure

Procedure DrawPlayer()
   TransparentSpriteColor(5500, RGB(255,255,255))
   DisplayTransparentSprite(5500 ,  ScreenX / 2, ScreenY / 2 )    
EndProcedure

EDIT:
Ach ich sollte vieleicht noch erwähnen ich nutze das DX9 subbsytem von
Stefan
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich spekuliere mal ins blaue (habe nämlich nur die Hälfte gelesen):

Wenn ein Sprite über ein anderes gezeichnet werden soll, es also verdecken soll, reciht es aus, wenn man es darüber zeichnet. Du malst also zuerst das hintere Sprite, dann an derselben Position das, was nach vorn soll.

Du müsstest dir also so eine Art Z-Order ausdenken, welches Element also wie weit nach vorn oder nach hinten soll.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Auch irgendwie nicht besonders toll dokumentiert das ganze.

Du kannst es so machen. bastel deinen Char aus zwei teilen der Unterkörper wird dort dargestellt wo er verdeckt wird also unter dem obersten layer. Der oberkörper wird immer oberhalb aller layer dargestellt.
I´a dllfreak2001
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

bastel deinen Char aus zwei teilen der Unterkörper wird dort dargestellt wo er verdeckt wird also unter dem obersten layer. Der oberkörper wird immer oberhalb aller layer dargestellt.
ClipSprite()!?
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

jup clipsprite
I´a dllfreak2001
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Wenn ein Sprite über ein anderes gezeichnet werden soll, es also verdecken soll, reciht es aus, wenn man es darüber zeichnet. Du malst also zuerst das hintere Sprite, dann an derselben Position das, was nach vorn soll.
Jo das mach ich ja aber das ist ja das problem er macht es einfach nicht so wie es soll.

Habe eben noch ein wenig getestet und immer auf das selbe problem gestoßen

Wen ich in den Schleifen nur die sprites mit festen werten angebe

Code: Alles auswählen

          DisplayTransparentSprite(6003 ,   100 , 100)  
          DisplayTransparentSprite(6001 , 100 , 100)
dann funktioniert es dann kann ich das tauschen wie ich möchte und es
wird koreckt über oder unter dem sprite gezeichnet

nehme ich aber nun folgendes

Code: Alles auswählen

          DisplayTransparentSprite(6003 ,   ScreenX / 2 , ScreenY / 2)  
          DisplayTransparentSprite(6000 + CurrentChip - 1 , x_x * Gridsize_X, y_y * Gridsize_Y)
so kann ich beide zeilen vertauschen wie ich will es ändert sich nix
es wird immer

Code: Alles auswählen

DisplayTransparentSprite(6000 + CurrentChip - 1 , x_x * Gridsize_X, y_y * Gridsize_Y)
als unterstes sprite genommen auch wen ich das andere sprite zuerst zeichnen lasse.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Geht nicht.
Ich glaube eher das deine Sortierroutine eine an der Waffel hat.

Siehe => (If World.Map(CurrentTile)\BeforePlayer[l] = 0)

vielleicht aber so:

Code: Alles auswählen

for x = 0 to #mapwidth

for y = 0 to playerposy -1
 displaysprite(tile(x,y),x*#tilesize,y*#tilesize)
next

displaychar(x,y) 

for y = playerposy  to #mapheight
 displaysprite(tile(x,y),x*#tilesize,y*#tilesize)
next

next
Das ist dann natürlich nur ein Prinzip
I´a dllfreak2001
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Ja das habe ich auch erst vermutet das da etwas nicht stimmt
aber dann habe ich mal mal die überprüfungen weggelassen
und in der For einfach nur die Beiden Sprites Zeichnen lassen.
Also einmal normal die Sprites die die Map Darstellen und dann ohne jegliche
prüfung das Sprite das vor oder hinter dem dem Sprite der map dargestellt
werden soll das ding ist halt selbst wen ich es immer vor dem sprite der map
zeichnen lasse wird es über der map angezeigt :shock:


Ich hab das ganze mal in ne rar gepackt und online gestellt
http://www.communityworld.de/corona.rar

Aber vorsicht ich war etwas geizig mit Kommentaren >_>
Auf jedenfall sollte aber das eine sprite hinter dem Baum sein und nicht davor, ist es nur nicht *g*
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

läuft bei mir garnicht, wie soll ich die dll einbinden.

aber ich ahne da was.
Villeicht pfuscht dir dieses CurrentChip hinein also er nimmt nen layer zuviel Layerdepth = zu hoch. da zeichnet er den char und currentchip garnicht.
Irgendwie zeichnest du für jedes layer den char nochmal.
I´a dllfreak2001
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

schau hier

Code: Alles auswählen

For l = 0 To LayerDepth
Vielleicht geht der mit Layerdepth einmal zu hoch.
Für diesen Layer hat er also keine Info(er zeichnet nix) aber der Char wird ja trotzdem gezeichnet. Deshalb ist er wohl immer ganz oben.

weil sieht ja soa aus

char
layer 1
char
layer 2
char
layer 3
char
layer zuviel hat keine info also wird nix gezeichnet

somit ist der Char immer oben
I´a dllfreak2001
Antworten