Sprite wir nicht angezeigt

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Sprite wir nicht angezeigt

Beitrag von JG »

Hallo,
ich bins schon wieder...
Also wenn ich mich nicht bei den Befehlen geirrt hab, müsste es doch bei meinem Prog (s. unten) das sprite 2 bei anzeigen, oder????
Wo ist mein Fehler??

Code: Alles auswählen

;Inizierung:
;  Variablen:
Global Munition.w

Global Maus_Knopf.w 

Global Punkte.w

Global VogelX.w

Global VogelY.w

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

;   Grafiken Laden:
LoadSprite(0,"Grafiken\zielkreuz_0.bmp",0)
TransparentSpriteColor(0,255,255,255)

LoadSprite(1,"Grafiken\back.bmp",0)
TransparentSpriteColor(0,255,255,255)

LoadSprite(2,"Grafiken\xxx.bmp",0)
TransparentSpriteColor(0,255,255,255)

;   Variablen Werte zuweisen:
Munition = 10
Punkte = 0
VogelY = 200
VogelX = 200


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

Repeat
; Abfrage der Benutzer Eingaben
ExamineMouse()                              ; Neue Mausdaten einlesen
ExamineKeyboard()                           ; Neue Tastaturdaten einlesen

If Munition = 0 
Goto xxx
EndIf

If MouseButton(1) And Maus_Knopf = 0
Maus_Knopf = 1 
Munition = Munition - 1
EndIf


If MouseButton(1) = 0
Maus_Knopf = 0
EndIf

xxx:

If Munition = 0 
Gosub Munition
EndIf

ClearScreen(0,0,0)

DisplaySprite(1,0,0)


DisplayTransparentSprite(2,VogelX,VogelY)

StartDrawing(ScreenOutput())
DrawingMode(1)
Locate(700,570)
FrontColor(0,0,0)
DrawText("Munition:" + Str(Munition))
StopDrawing() 

StartDrawing(ScreenOutput())
DrawingMode(1)
Locate(700,20)
FrontColor(0,0,0)
DrawText("Punkte:" + Str(Punkte))
StopDrawing() 

DisplayTransparentSprite(0,MouseX()-15,MouseY()-15)

Gosub FPS

FlipBuffers()

Until KeyboardPushed(1)

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

FPS:
  If Val(FormatDate("%ss", Date()))=sek
    FPS+1
  Else
    FPS$=Str(FPS)
    FPS=0
  EndIf
  sek=Val(FormatDate("%ss", Date()))
 
  StartDrawing(ScreenOutput()) 
    DrawingMode(1)
    FrontColor(255,255,255)
    Locate(1,1)
    DrawText("FPS: "+FPS$)
  StopDrawing()
Return

Munition:
  If MouseButton(2) = 1
  Munition = 10
  EndIf
Return

Danke..

PS. Ist mein code sehr ducheinander???[/code]
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Also zu deinem Sprite-Problem hab ich gerade nichts gefunden, schau ich vielleicht nachher nochmal genau, aber du solltest Gosub und Goto besser weglassen, das ist sehr verwirrent und wirft den Code zu sehr durcheinander. Besser ist es da, per Prozeduren zu arbeiten.

Und noch etwas:

Code: Alles auswählen

StartDrawing(ScreenOutput())
DrawingMode(1)
Locate(700,570)
FrontColor(0,0,0)
DrawText("Munition:" + Str(Munition))
StopDrawing()

StartDrawing(ScreenOutput())
DrawingMode(1)
Locate(700,20)
FrontColor(0,0,0)
DrawText("Punkte:" + Str(Punkte))
StopDrawing() 
kannst du hierzu vereinfachen, 2 mal Startdrawing ist unnötig, wenn immer bei beiden malen auf die selbe Oberfläche gemalt wird. Dann pack lieber beides in eins rein:

Code: Alles auswählen

StartDrawing(ScreenOutput())
DrawingMode(1)
Locate(700,570)
FrontColor(0,0,0)
DrawText("Munition:" + Str(Munition))
Locate(700,20)
DrawText("Punkte:" + Str(Punkte))
StopDrawing()
Weiterhin könntest du deinen Code etwas mehr einrücken. Etwa nach IF immer 2 Leerstellen lassen, das bringt Übersicht rein:

Code: Alles auswählen

If MouseButton(1) = 0
  Maus_Knopf = 0
EndIf 
Ach ja, und diese Stelle kannst du anders ohne Goto besser lösen. Damit wird ja bewirkt, dass bei keiner Munition die Mausabfrage übersprungen wird.

Code: Alles auswählen

If Munition = 0
Goto xxx
EndIf

If MouseButton(1) And Maus_Knopf = 0
Maus_Knopf = 1
Munition = Munition - 1
EndIf


If MouseButton(1) = 0
Maus_Knopf = 0
EndIf

xxx:
So lässt es sich besser machen ohne im Code umherzuspringen:

Code: Alles auswählen

if munition > 0
  If MouseButton(1) And Maus_Knopf = 0
    Maus_Knopf = 1
    Munition = Munition - 1
  EndIf
endif

If MouseButton(1) = 0
  Maus_Knopf = 0
EndIf
Dann entfällt der Label und sobald keine Munition vorhanden ist, wird erst garnicht mehr abgefragt, ob die Maustaste gedrükt wurde oder nicht.

Vielleicht ließe es sich noch etwas besser optimieren wenn man nicht 2 seperate If Abfragen macht, sondern alles in einen Block macht:

Code: Alles auswählen

if munition > 0
  If MouseButton(1)
    if  Maus_Knopf = 0
      Maus_Knopf = 1
      Munition = Munition - 1
    Endif
  ELSE
    Maus_Knopf = 0
  EndIf
Endif
So wird, wenn die linke Maustaste nicht gedrückt wird, direkt Maus_Knopf auf 0 gesetzt. Ist er gedrückt, wird erst geprüft ob die Taste nicht vorher schon gedrückt war. Erst wenn beides passt, wird die Munition abgezogen und die Taste als gedrückt registriert.

EDIT:
Bei deinen Transparenten Spritefarben-Angaben hast du noch einen Fehler drinnen. Du nimmst immer wieder das erste Sprite (mit Nummer 0) und weißt diesem die transparente Farbe mit. Das 3 mal.
einfach TransparentSpriteColor(0,255,255,255) in TransparentSpriteColor(1,255,255,255) und TransparentSpriteColor(2,255,255,255) ändern).
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Weiter zu optimieren wäre die Sache mit der transparenten Sprite-Farbe. Da alle Sprites bisher die gleiche transparente Farbe haben (0,0,0) kann man das mit einer Zeiel als standard-transparente Farbe setzen:

Code: Alles auswählen

TransparentSpriteColor(-1,255,255,255)
Alle nachfolgenden Sprites werden dann mit dieser farbe als transparente eingeladen. ;)

Ich hab deinen Code mal ein wenig abgeändert und so geschrieben, wie ich es machen würde. So siehts dann aus, ohne Gosub und mit nur einmaligem StartDrawing() (alle anderen waren unnötig):

Code: Alles auswählen

;Inizierung:
;  Variablen:
Global Munition.w
Global Maus_Knopf.w
Global Punkte.w
Global VogelX.w
Global VogelY.w

;   Sonstiges:
InitSprite() And InitKeyboard() And InitMouse()

OpenScreen(800,600,16,"Game.exe")

;   Grafiken Laden:
TransparentSpriteColor(-1,255,255,255)

LoadSprite(0,"Grafiken\zielkreuz_0.bmp",0) 
LoadSprite(1,"Grafiken\back.bmp",0) 
LoadSprite(2,"Grafiken\xxx.bmp",0) 


;   Variablen Werte zuweisen:
Munition = 10
Punkte = 0
VogelY = 200
VogelX = 200

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

Repeat

  If Val(FormatDate("%ss", Date()))=sek
    fps+1
  Else
    FPS$=Str(fps)
    fps=0
  EndIf
  sek=Val(FormatDate("%ss", Date()))
     
  ; Abfrage der Benutzer Eingaben
  ExamineMouse()                              ; Neue Mausdaten einlesen
  ExamineKeyboard()                           ; Neue Tastaturdaten einlesen
  
  If Munition > 0
    If MouseButton(1)
      If  Maus_Knopf = 0
        Maus_Knopf = 1
        Munition = Munition - 1
      EndIf
    Else
      Maus_Knopf = 0
    EndIf
  EndIf
  
  If MouseButton(2) = 1
    Munition = 10
  EndIf
  
  ClearScreen(0,0,0)
  
  DisplaySprite(1,0,0)
  DisplayTransparentSprite(2,VogelX,VogelY)
  
  StartDrawing(ScreenOutput())
    DrawingMode(1)
    Locate(700,570)
    FrontColor(0,0,0)
    DrawText("Munition:" + Str(Munition))
    Locate(700,20)
    DrawText("Punkte:" + Str(Punkte))
    Locate(1,1)
    DrawText("FPS: "+FPS$)
  StopDrawing()
  
  DisplayTransparentSprite(0,MouseX()-15,MouseY()-15)
  
  FlipBuffers()
  
Until KeyboardPushed(1)
Im übrigen wird bei mir das Vogel-Sprite korrekt dargestellt (ich hab mir in Paint schnell eins hingekritzelt). Prüf bei dir mal, ob dein Sprite wirklich korrekt eingeladen wird. Also schau mal im "Grafiken"-Ordner ob es da wirklich ein xxx.bmp Sprite gibt. ;)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Beitrag von GPI »

Als transparente Farbe nach möglichkeit die Standard-Schwarz-Farbe nehmen. Wenn in Sprite Schwarz benötigt wird, RGB(8,8,8) nehmen.

Man vermeidet damit massive Transparent-Probleme...
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag von sbehrens »

Aber (1,1,1) reicht doch auch, oder?

mfG
Basti
enjoy life... while you can!
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Dann gibts warscheinlich Probleme wenn du das Sprite in 16bit umwandeln willst.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Danke

Beitrag von JG »

Danke!!! :mrgreen:
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

JG

Beitrag von JG »

Hallo,
Ich habs jetzt getestet und bei mir zeigts das Vogel Sprite trotdem nicht an...
Vieleicht weil ich die Testversion hab????
Achso TransparentSpriteColor usste ich auf 0,0,0 stellen.

JG
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Dann pack mal alles in ein Archiv (WinRar oder WinZip Archiv) samt Grafiken und den Code und stell ihn irgendwo hier online. Dann kann man es sich ja mal ansehen. Aber so wie es oben steht, wird das Vogelsprite korrekt bei mir angezeigt. Es sind dann 3 Sprites zu sehen, der Hintergrund, das Zielkreuz und irgendwo nahe der Mitte dieses Vogelsprite.
(An der Demoversion kann das eigentlich nicht liegen, sind ja soweit ich das sehe, keine WinAPI Befehle oder sonstige Demobeschränkungen drinne, dann würde er es dir auch sagen).
JG
Beiträge: 63
Registriert: 23.10.2004 17:08

Beitrag von JG »

Hallo,
ich kanns net hochladen weil ich bei den meisten Diensten im Web noch keinen Speicher bekomm...(bin 12, naja in 3 Monaten nemmer)

Wie wärs wenn ich es dir mail???


JG
Antworten