Problem mit verdeckten Sprites

Anfängerfragen zum Programmieren mit PureBasic.
tina
Beiträge: 8
Registriert: 29.03.2005 01:47

Problem mit verdeckten Sprites

Beitrag 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
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag 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.
tina
Beiträge: 8
Registriert: 29.03.2005 01:47

Beitrag 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
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag 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 
tina
Beiträge: 8
Registriert: 29.03.2005 01:47

Beitrag von tina »

Funktioniert leider nicht
Benutzeravatar
MUDHead
Beiträge: 107
Registriert: 08.09.2004 11:00
Wohnort: Berlin

Beitrag 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!?
Malus, qui potest rerum cognoscere.
tina
Beiträge: 8
Registriert: 29.03.2005 01:47

Beitrag 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
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Einfach austauschen !

Code: Alles auswählen

Structure Daten.l
Prioritaet.l
x.l
y.l
id.l
Endstructure 
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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 
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten