Sprites verschwinden

Für allgemeine Fragen zur Programmierung mit PureBasic.
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Sprites verschwinden

Beitrag von JG »

Hallo,
bei meinem Game verschwindeen manchmal die Spites "Geschenke", nachdem sie am Boden aufkamen...
Ich weiß aber nicht warum...
Bitte helft mir.
Hier der Code:

Code: Alles auswählen

;Inizierung:
;  Variablen:
Global Geschenk1_X.w
Global Geschenk1_Y.w
Global Geschenk1.w

Global Geschenk2_X.w
Global Geschenk2_Y.w
Global Geschenk2.w

Global Geschenk3_X.w
Global Geschenk3_Y.w
Global Geschenk3.w

Global Geschenk4_X.w
Global Geschenk4_Y.w
Global Geschenk4.w

Global Schlitten_X.w
Global Schlitten_Y.w

;  Variablen Werte zuweisen:
Geschenk1_X = 75
Geschenk1_Y = 145

Geschenk2_X = 200
Geschenk2_Y = 120

Geschenk3_X = 300
Geschenk3_Y = 170

Geschenk4_X = 400
Geschenk4_Y = 150

Schlitten_X = 0
Schlitten_Y = 0


;   Sonstiges:
InitSprite() And InitKeyboard() And InitMouse()
OpenScreen(800,600,16,"Game.exe")

;   Grafiken Laden:
LoadSprite(0,"Data\Grafik\mouse.bmp",0)
LoadSprite(1,"Data\Grafik\back1.bmp",0)
LoadSprite(2,"Data\Grafik\wolke.bmp",0)
LoadSprite(3,"Data\Grafik\Geschenk_1.bmp",0)

TransparentSpriteColor(0,255,255,255)
TransparentSpriteColor(1,255,255,255)
TransparentSpriteColor(2,255,255,255)
TransparentSpriteColor(3,255,255,255)



;-------------------------------------------------------------------

; Abfrage der Benutzer Eingaben
Repeat
  ExamineMouse()                              ; Neue Mausdaten einlesen
  ExamineKeyboard()                           ; Neue Tastaturdaten einlesen
  
  If MouseButton(1) = 1 And MouseX() => 95 And MouseX() =< 143 And MouseY() => 165 And MouseY() =< 213
   Geschenk1 = 1
  EndIf
  
  If MouseButton(1) = 1 And MouseX() => 220 And MouseX() =< 266 And MouseY() => 140 And MouseY() =< 186
  Geschenk2 = 1
  EndIf
  
  If MouseButton(1) = 1 And MouseX() => 320 And MouseX() =< 366 And MouseY() => 190 And MouseY() =< 236
  Geschenk3 = 1
  EndIf
  
  If MouseButton(1) = 1 And MouseX() => 420 And MouseX() =< 466 And MouseY() => 170 And MouseY() =< 216
  Geschenk4 = 1
  EndIf
  
  
  If Geschenk1 = 1
   Geschenk1_Y = Geschenk1_Y + 2
   If Geschenk1_Y = 600
    Geschenk1 = 0
    Geschenk1_Y = 145
   EndIf
  EndIf
  
  If Geschenk2 = 1
   Geschenk2_Y = Geschenk2_Y + 2
   If Geschenk2_Y = 600
    Geschenk2 = 0
    Geschenk2_Y = 145
   EndIf
  EndIf
  
  If Geschenk3 = 1
   Geschenk3_Y = Geschenk3_Y + 2
   If Geschenk3_Y = 600
    Geschenk3 = 0
    Geschenk3_Y = 145
   EndIf
  EndIf
  
  If Geschenk4 = 1
   Geschenk4_Y = Geschenk4_Y + 2
   If Geschenk4_Y = 600
    Geschenk4 = 0
    Geschenk4_Y = 145
   EndIf
  EndIf

  DisplaySprite(1,0,0)
  DisplayTransparentSprite(2,5,-10)
  DisplayTransparentSprite(2,250,5)
  DisplayTransparentSprite(3,Geschenk1_X,Geschenk1_Y)
  DisplayTransparentSprite(3,Geschenk2_X,Geschenk2_Y)
  DisplayTransparentSprite(3,Geschenk3_X,Geschenk3_Y)
  DisplayTransparentSprite(3,Geschenk4_X,Geschenk4_Y)
  DisplayTransparentSprite(0,MouseX()-8,MouseY()-8)
    
  StartDrawing(ScreenOutput())
   DrawingMode(1)
   Locate(600,570)
   FrontColor(255,0,0)
   DrawText("MausX:" + Str(MouseX()) + ", MausY:" + Str(MouseY()))
  StopDrawing()
  
  FlipBuffers()
 
Until KeyboardPushed(1) 

JG
Ich benutze z. Zt. noch die Demo Version!
AMD Athlon 2800+ | 1024MB RAM | ATI Raedon 9800 Pro 128MB| 60GB HDD
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

An dem Code gibt es noch einiges mehr zu verbessern :wink:

Ich will hier mal mit einigen Sachen anfangen:

1) Du verwendest für jedes Geschenk drei eigene Variable. Was machst
du in späteren Levels, wenn da 10 Geschenke sein sollen? 30 Variablen?
Das ist etwas unpraktisch und außerdem unelegant. Du solltest die
Geschenke in eine strukturierte LinkedList packen. Das Aufbauen könnte
etwa so aussehen:

Code: Alles auswählen

Structure Geschenk
  XPos.l
  YPos.l
  Move.l
EndStructure

NewList Geschenke.Geschenk()

AddElement(Geschenke())
Geschenke()\XPos = 75
Geschenke()\YPos = 145

AddElement(Geschenke())
Geschenke()\XPos = 200
Geschenke()\YPos = 120

;. . . etc.
In der Mainloop arbeitest du dann alle Elemente per ForEach ab.

2) Wie dir vielleicht aufgefallen ist, habe ich in der Struktur Longs anstatt
deiner Words verwendet. Das liegt nicht daran, dass ich so gerne
Arbeitsspeicher verschwende, sonder hat performancetechnische Gründe.
32Bit Variablen werden auf 32Bit CPUs (was heute ja fast alle im
Homebereich sind, 64Bit kommt erst) schneller abgearbeitet als 16Bit
Variablen. Und der Speicher, der mehr verbaucht wird ist extrem gering.
Zählen wir durch: 12 Variablen, die je 16Bit mehr verbauchen. Das wären
dann 192Bit. Ist das wirklich wichitg in Zeiten des 1GByte Ram?

3) Wenn du jetzt schon ForEach benutzt, kannst du dir eigentlich auch den
Move Status sparen und direkt das entsprechene Geschenk bewegen.

4) [c]InitSprite() And InitKeyboard() And InitMouse()[/c] Dass das
funktioniert ist wirklich erstaunlich :shock:
Nichtsdestotrotz solltest du sämtliche Befehle auf ihren Rückgabewert
abfragen. Also [c]If InitSprite() And InitKeyboard() And InitMouse()[/c].
Das <> 0 wird dann ergänzt, ein If ohne weitere Abfrage checkt immer
auf <> #False. Auch prüfen solltest du, ob der Screen geöffnet werden
konnte und ob die Sprites geladen werden konnten.

5) Und jetzt zu deiner eingentlichen Fragestellung. Du setzt ein Geschenk
(später alle) auf die Y Position 145. Von da aus bewegst du das Geschenk
immer 2 Pixel nach unten. Und dann erwartest du, dass die Y Position
irgendwann genau 600 ist. Dämmert dir was? Indem du 2 zu 145 addierst,
wirst du nie auf GENAU 600 kommen. Du solltest also abfragen, ob die
Position >= 600 ist.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Beitrag von JG »

Danke. :allright:
Oh, ja, des hab ich ja ganz übersehen...
Ich weiß, dass der Code nicht der beste ist...
Und wengen den Geschenken, es wird im ganzen Game nur max 4 Geschenke geben.

[Edit]
Das

Code: Alles auswählen

InitSprite() And InitKeyboard() And InitMouse()
Hab ich von Sunny. (denke ich)
[/Edit]

JG
Ich benutze z. Zt. noch die Demo Version!
AMD Athlon 2800+ | 1024MB RAM | ATI Raedon 9800 Pro 128MB| 60GB HDD
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Beitrag von JG »

Hallo,
ich noch mal...
Kannst du mir das bitte nochmal erkären, wie ich dass mit meinen Variablen besser lösen soll? Des verstehe ich noch net so ganz...


JG
Ich benutze z. Zt. noch die Demo Version!
AMD Athlon 2800+ | 1024MB RAM | ATI Raedon 9800 Pro 128MB| 60GB HDD
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Wenn du die Sache mit der LinkedList meinst, kannst du meine
bemerkung dazu vergessen. Ich hatte mangels der Graphiken das
Spielprinzip missverstanden. So, wie es jetzt ausschaut, ist das so, wie es
ist, vollkommen in Ordnung.

Was ich allerdings noch ändern würde, ist, dass du für ein einzelnes
Geschenk nur noch eine Variable hast ([c]Geschenk1.Geschenk"[/c]), die
dann die oben genannte Struktur hat. Das sieht einfach besser aus und ist
praktischer.

Außerdem würde ich die "Move" Variable aller 4 Geschenke wegfallen
lassen und die Geschenke direkt in der Mausabfrage bewegen.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

...hmm

..so wie ich das verstehe, ist das was lars move nennt, ein flag, ob das geschenk fällt, oder noch oben hängt... insofern wirst du es eigentlich brauchen..(denke ich)

wenn du immer 4 geschenke hast, kannst du ne structure machen, wei lars sagte, die kannst du dann in ein array packen

Code: Alles auswählen

Structure Geschenk
    X.l
    Y.l
    M.l
EndStructure

Dim Geschenke.Geschenk(4)
...dann kannst du die abfrage und die bewegung in eine simple for-next schleife packen...

...und mit
TransparentSpriteColor(-1,255,255,255)
kannst du für alle sprites weiss auf transparent setzen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Beitrag von JG »

Hallo,
Also des Spielprinzip is das: Unten fährt ein Schlitten vorbei und oben an der Wolke hängen Geschenke, man muss die Geschenke anklicken und versuchen den Schlitten zu treffen. Ich versteh das nicht:

Code: Alles auswählen

Structure Geschenk
    X.l
    Y.l
    M.l
EndStructure

Dim Geschenke.Geschenk(4)
Kann mir des bitte jemand erklären???

JG
Ich benutze z. Zt. noch die Demo Version!
AMD Athlon 2800+ | 1024MB RAM | ATI Raedon 9800 Pro 128MB| 60GB HDD
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

....wohl verwirrend, wegen Geschenk + Geschenke
:) ...im prinzip ganz easy... structure ist eine 'verbundene variable'
also

Code: Alles auswählen

Structure Koordinate
    X.l
    Y.l
EndStructure
erzeugt einen 'typ' names 'Koordinate' der aus zwei long-variablen hintereinander besteht.
jetzt kannst du mittels

Code: Alles auswählen

Keks.Koordinate
eine Variable des Typs Koordinate mit namen Keks erzeugen.
mit

Code: Alles auswählen

Keks\X = 345
Keks\Y = 143
setzt du dann die werte auf das paar 345,143

analog bei dir:

Code: Alles auswählen

Structure Karton
    X.l
    Y.l
    M.l
EndStructure

Dim Geschenk.Karton(4)
erzeugt die variablen Geschenk(0) bis Geschenk(3), die aus ihren koordinaten und dem move-flag bestehen...

Code: Alles auswählen

Geschenk(0)\X = 75
Geschenk(0)\Y = 145
ist dann die positionierung deines ersten geschenks, das wird mit

Code: Alles auswählen

DisplayTransparentSprite(3,Geschenk(0)\X,Geschenk(0)\Y)
dargestellt, usw...

schleifen:

Code: Alles auswählen

For n = 0 to 3
    If Geschenk(n)\M = 1
        Geschenk(n)\Y +2
    EndIf
Next
und:

Code: Alles auswählen

For n = 0 to 3
    DisplayTransparentSprite(3,Geschenk(n)\X,Geschenk(n)\Y)
Next
alles klar ? :wink:

...musst dich vielleicht noch ein bisschen mehr durch die Help und die Examples wühlen....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Serge
Beiträge: 66
Registriert: 20.09.2004 20:44
Kontaktdaten:

Beitrag von Serge »

Strukturen und Felder sind am Anfang sicher einweng schwer zu verstehen ;]
Eine Struktur beinhaltet eine Ansammlung von Variablen.

Code: Alles auswählen

Structure test
  x.l
  y.l
endstructure
Damit erzeugst du noch keine echten Variablen sondern Definierst nur eine Struktur.
Nun kannst du neue Variablen erzeugen die dann die Oben genannte Struktur haben.

Code: Alles auswählen

Geschenk.test
Das mit .test definierst du, dass "Geschenk" nun 2 Untervariablen hat aus der Struktur "test", nämlich "x" und "y"

Ansprechen tust du sie jetzt Folgendermasen

Code: Alles auswählen

Geschenk/x=75
Geschenk/y=55
Der Vorteil ist, statt

Code: Alles auswählen

geschenk1x.l
geschenk1y.l
geschenk2x.l
geschenk2y.l
geschenk3x.l
geschenk3y.l
Kannst du nun

Code: Alles auswählen

Structure test
  x.l
  y.l
endstructure
geschenk1.test
geschenk2.test
geschenk3.test
Alle Geschenke haben nun die "Untervariablen" "x.l" und "y.l"

Mehr dazu kannst du auch in der Anleitung nachlesen.
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Beitrag von JG »

Danke! :allright:
In der Hilfe hab ich nachgeschaut, nur auch nicht so recht verstanden...



JG
Ich benutze z. Zt. noch die Demo Version!
AMD Athlon 2800+ | 1024MB RAM | ATI Raedon 9800 Pro 128MB| 60GB HDD
Antworten