Seite 1 von 2

Problem mit verdeckten Sprites

Verfasst: 29.03.2005 02:18
von tina
Hallo,

Ich habe einen Zeiger als Sprite, der durch die Maus gesteuert wird. Wenn ich mit dem Zeiger über ein Sprite bin und die Maustaste drücke, möchte ich dieses Sprite teilweise über ein anderes mit der Maus schieben.

z.B. es sind 2 (sollen aber einige mehr werden) Sprites auf dem Screen. Nun möchte ich, daß mal Sprite 1, Sprite 2 teilweise überdeckt und auch umgekehrt.

Im Klartext: Ein angeklicktes Sprite soll über ein anderes geschoben werden.

Bei mir klappt das immer nur in eine Richtung. Sprite 1 kann ich über Sprite 2 legen aber, 2 nicht ÜBER 1. Nummer 2 verschwindet dann immer unter 1.

Würde mich sehr auf Antwort freuen!

Gruß
Tina

Verfasst: 29.03.2005 03:02
von Hroudtwolf
Es kommt auf die Reihenfolge deiner Spriteaufrufe an.



Beispiel:

Code: Alles auswählen

DisplaySprite (1,x,y)
DisplaySprite (2,x,y)
DisplaySprite (3,x,y)
DisplaySprite (4,x,y)
Andere Reihenfolge

Code: Alles auswählen

DisplaySprite (2,x,y)
DisplaySprite (1,x,y)
DisplaySprite (4,x,y)
DisplaySprite (3,x,y)
Du musst die Reihenfolge in deinem Programm anpassbar machen.

Verfasst: 29.03.2005 03:17
von tina
Vielen Dank nur,

wie sieht das mit der Priorität denn aus? Wenn ich 100 Sprites dargestellt habe und will, das Nr. 90, Nr.80 teilweise abdecken soll und nicht darunter verschwindet? Kannst Du mir mal da ein Code-Schnipsel geben anhand von 2 Sprites, die ich abwechselnd verdecken kann?

Vielen Dank
Tina

Verfasst: 29.03.2005 03:35
von Hroudtwolf
Habs jetzt nicht ausprobiert...Aber so muss es gehen.

Code: Alles auswählen

Structure Daten
Prioritaet
x
y
id
Endstructure

Dim SpriteLap.Daten(2)


If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf


If OpenScreen(1024, 768, 16, "Fenster")

For x=1 to 2
SpriteLap(x)\id=loadSprite(#pb_Any,"DeinSprite"+str(x)+".bmp")
SpriteLap(x)\x=10+(x*2)
SpriteLap(x)\y=10+(x*2)
SpriteLap(x)\Prioritaet=x
next x




Repeat    
FlipBuffers()
ClearScreen(0,0,0)


For x=1 to 2
If SpriteLap(x)\Prioritaet=x
DisplaySprite (SpriteLap(x)\ID,SpriteLap(x)\x,SpriteLap(x)\y)
endif 
next x

ExamineKeyboard()
if Keyboardreleased (#PB_Key_Up)
For x=1 to 2
if SpriteLap(x)\Prioritaet=2
break
SpriteLap(x)\Prioritaet=1
if x=2:SpriteLap(1)\Prioritaet=2:endif 
if x=1:SpriteLap(2)\Prioritaet=2:endif 
endif 
next x
endif 

Until x > 500 Or KeyboardPushed(#PB_Key_Escape)
Else
  MessageRequester("Error", "Can't open a 640*480 - 16 bit screen !", 0)
EndIf
CloseScreen()
End  
Endif 

Verfasst: 29.03.2005 12:29
von tina
Funktioniert leider nicht

Verfasst: 29.03.2005 12:37
von MUDHead
Auf welche Art funktioniert es denn nicht?
Fehlermeldung?

Ich hab es zwar nicht getestet, aber der Code scheint mir richtig zu sein.

Vielleicht liegt es auch daran, dass du die Demo hast!?

Verfasst: 31.03.2005 05:15
von tina
Keine Demo, habe 3.92

Fehlermeldung Zeile 2: A variable in a "Structure" need a declared Type

Prioritaet ".b" ! ?

Vielleicht hast Du Dich gefragt, warum ich mehr als 100 Sprites brauche, ganz einfach, ich möchte mir meine Lieblings - Patience programmieren!

Nun, wenn ich dann eine Karte über eine ander ziehen will und die dann immer "darunter" und nicht "darüber" erscheint... :-(

Ehrlich gesagt, benutze ich erst seit einer Woche "Purebasic" , davor nur ein bissel c++

Gibt es denn bei "Purebasic" kein einfachen Befehl, wenn ich ein Sprite anklicke, das dieses Sprite Priorität hat?

Tina

Verfasst: 31.03.2005 05:40
von Hroudtwolf
Einfach austauschen !

Code: Alles auswählen

Structure Daten.l
Prioritaet.l
x.l
y.l
id.l
Endstructure 

Verfasst: 31.03.2005 10:04
von DarkDragon
Hroudtwolf hat geschrieben:Einfach austauschen !

Code: Alles auswählen

Structure Daten.l
Prioritaet.l
x.l
y.l
id.l
Endstructure 
Nei, also wenn dann schon

Code: Alles auswählen

Structure Daten
Prioritaet.l
x.l
y.l
id.l
Endstructure 

Verfasst: 31.03.2005 21:00
von Kaeru Gaman
@tina

also, mal konkret für dein broblem:

stelle für jeden stapel die karten der reihe nach von unten nach oben dar
(ich meine die abfolge der display-befehle)
und die momentan bewegte karte stellst du immer als letzte dar,
damit ist sie immer über allen anderen.

denke an folgendes:

die "sprites" bei DX sind keine sprites wie auf dem C64 oder anderen maschinen,
sie sind grafik-teile, die zu dem zeitpunkt, zu dem ihr 'display' kommt,
auf dem screen gemalt werden.
alles was danach kommt, liegt drüber, alles, was vorher kommt, kann überdeckt werden.