Types zucken

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

N0X

Betreff: Types zucken

BeitragSa, Jan 02, 2010 16:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich habe ein Weltraum Spiel, wo 20 Schiffe erstellt werden.
Bei der Abwärtsbewegung jedoch zucken die Bilder der Types.
Warum?

Code: [AUSKLAPPEN]
SeedRnd MilliSecs()

;Variablen
Global px        = 512
Global py        = 700

Global speed     = 8
Global gegspeed  = 5

Global sx        = 536
Global sy        = 705

Global points    = 0
Global lives     = 3

Global geganzahl = 20

Global time      = 120
Global stampMin
Global stampSec
Global timer

;--------------------------------------------------------------------------------------------|

Type schuss
   Field x
   Field y
End Type

Type gegner
   Field x
   Field y
   Field image
End Type

;--------------------------------------------------------------------------------------------|

Graphics 1024,768,32
SetBuffer BackBuffer()

Global ttimer = CreateTimer(60)

gegner_erstellen()

;--------------------------------------------------------------------------------------------|

While Not KeyHit(1)
   WaitTimer(ttimer)
   Cls
   
   If MilliSecs()-oldtime >= 1000 Then
      oldtime = MilliSecs()
      umrechnen()
   End If
   
   Schuss()
   Bewegen()
   GegUpdate()
   PlyUpdate()
   
   Flip 0
Wend
End

;--------------------------------------------------------------------------------------------|

Function Schuss()
   If KeyHit(57) Then
      s.Schuss = New schuss
      s\x = sx
      s\y = sy
      
      PlaySound shot
   EndIf
   
   For s.Schuss = Each Schuss
      s\y = s\y - speed

      Rect s\x,s\y,2,5
      
      If s\y < 10 Then Delete s.Schuss
   Next
   
   If Timer < MilliSecs() Then
         frame =(frame +1)Mod 16         ;Anzahl Bilder
         timer = MilliSecs() + 100000   ;Pausenzeit
   End If
   
   For s.Schuss = Each Schuss
         For g.Gegner = Each Gegner
            If RectsOverlap(g\x,g\y,40,40,s\x,s\y,2,5) Then
            DrawImage expl,g\x,g\y,frame
            Delete s.Schuss
            Delete g.Gegner
            g.Gegner = New Gegner
            g\x = Rnd(0,760)
            g\y = Rnd(-920,-20)
            g\image  = LoadImage("gfx\gegner.png")
            PlaySound treffer
            points=points+10
               Exit
            EndIf
      Next
   Next
End Function

Function gegner_erstellen()
   For a = 0 To geganzahl
      g.gegner = New gegner
      g\x         = Rnd(0,760)
      g\y         = Rnd(-900,-20)
      g\image  = LoadImage("gfx\gegner.png")
      MaskImage g\image,255,255,255
   Next
End Function

Function GegUpdate()
   For upd.gegner = Each gegner
      DrawImage upd\image, upd\x, upd\y
      MaskImage upd\image,255,255,255
   Next
   
   For g.Gegner = Each Gegner
      g\y = g\y +gegSpeed
      If g\y > 770 Then
         g\y=Rnd(-200,-20)
         g\x=Rnd(0,760)
         Exit
      EndIf
   Next
End Function

Function PlyUpdate()
   If px <2 Then
      px=2
      sx=26
   EndIf
   
   If px >770 Then
      px=770
      sx=786
   EndIf
   
   For g.Gegner = Each Gegner
      If (stampMin = 0 And stampSec = 0) Or g\image=False Or lives <= 0 Then Ende()
      If RectsOverlap(g\x,g\y,40,40,px,py,50,50) Then
         Delete g.Gegner
         PlaySound treffer
         lives=lives-1
            Exit
         EndIf
   Next
End Function


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragSa, Jan 02, 2010 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code sieht sehr übersichtlich aus. Lob!!!

Aber...

Die LoadImages müssen alle aus den Funktionen raus und vor der Spielschleife geladen sein. In den Funktionen kannst Du einfach das Handle des einmal geladenen Bildes übergeben:

BlitzBasic: [AUSKLAPPEN]
GegnerBild = LoadImage("gfx\gegner.png")


und dafür in den Funktionen:

BlitzBasic: [AUSKLAPPEN]
g\image = GegnerBild


solange es noch keine zwei unterschiedlichen Gegnerbilder gibt, wäre es sogar ganz ohne g\image möglich:

BlitzBasic: [AUSKLAPPEN]
Function GegUpdate()
For upd.gegner = Each gegner
DrawImage GegnerBild, upd\x, upd\y
...



gleich mehr...



Wozu dient das EXIT in der GegUpdate()?

Wo ist den der Code der Funktionen Umrechnen() und Bewegen() ?
  • Zuletzt bearbeitet von Midimaster am Sa, Jan 02, 2010 16:42, insgesamt einmal bearbeitet

hazumu-kun

BeitragSa, Jan 02, 2010 16:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, mehrere Sachen:

Erstmal das hier:
BlitzBasic: [AUSKLAPPEN]

If timer < MilliSecs() Then
frame =(frame +1)Mod 16 ;Anzahl Bilder
timer = MilliSecs() + 100000 ;Pausenzeit
End If

Du machst 100 SEKUNDEN Pause bis du den Frame wechselst.
Wieso?
------------------
BlitzBasic: [AUSKLAPPEN]

g\image = LoadImage("gfx\gegner.png")

Jedesmal wenn du einen Gegner erstellst lädst du das Bild neu, das ist uneffektiv, besser wäre das hier:
BlitzBasic: [AUSKLAPPEN]

Global img_gegner= LoadImage("gfx\gegner.png")
....
....
....
g\image= img_gegner

------------------
Und noch was:
BlitzBasic: [AUSKLAPPEN]

For upd.gegner = Each gegner
DrawImage upd\image, upd\x, upd\y
MaskImage upd\image,255,255,255
Next

Du maskest ein Bild JEDESMAL wenn es gezeichnet wird, du müsstest es nur einmal, nach "Global img_gegner" zum Beispiel, masken.

[...]Teil entfernt wegen mangelndem Sinn[...]

Gruß, Hazumu-kun.

------------------
EDIT:
Mist, zu langsam gewesen! Sad
------------------
P.S.:
Dein Code ist gut lesbar, aber ein paar Kommentare mehr können nicht schaden. Trotzdem dickes Lob von mir!
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
  • Zuletzt bearbeitet von hazumu-kun am Sa, Jan 02, 2010 17:36, insgesamt einmal bearbeitet

Midimaster

BeitragSa, Jan 02, 2010 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@hazumu kun

Das Umsetzen ist total ok. Er erreicht damit, dass der Gegner, wenn er unten aus dem Bild rausgeflutsch ist, weit oberhalb des Bildschirms mit Zufalls-X wieder eingesetzt wird. Und irgendwann wird er dann sichtbar.

So mach ich das immer bei meinen Schneeflocken...Dadurch braucht er das Type-Element nicht erst zu deleten und dann oben wieder herzustellen.

hazumu-kun

BeitragSa, Jan 02, 2010 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Trotzdem fehlt der Code zu Bewegen()
Bin sicher das es da liegt.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

N0X

BeitragSa, Jan 02, 2010 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also in Bewegen sind eig. nur die Tastenabfragen zum Bewegen des Players. Nichts für die Gegner.

Hier trotzdem nochmal der gesamte Code:
Code: [AUSKLAPPEN]
SeedRnd MilliSecs()

;Variablen
Global px        = 512
Global py        = 700

Global speed     = 8
Global gegspeed  = 5

Global sx        = 536
Global sy        = 705

Global points    = 0
Global lives     = 3

Global geganzahl = 20

Global highscore = 1

Global Ende      = 0

Global time      = 120
Global stampMin
Global stampSec
Global timer

;--------------------------------------------------------------------------------------------|

Type schuss
   Field x
   Field y
End Type

Type gegner
   Field x
   Field y
   Field image
End Type

;--------------------------------------------------------------------------------------------|

Graphics 1024,768,32
SetBuffer BackBuffer()

;Laden der Ressourcen
Global schiff  = LoadImage("gfx\schiff.png")
Global side    = LoadImage("gfx\sidebar.png")
Global expl    = LoadAnimImage("gfx\exp1.png",64,64,0,15)
Global shot    = LoadSound("sound\shot.wav")
Global treffer = LoadSound("sound\treffer.wav")
Global bgmusic = PlayMusic("sound\bg.wav")
Global ggge    = LoadImage("gfx\gegner.png")

font=LoadFont("Verdana",20)
SetFont font

;Vorbereitung der Ressourcen zur Nutzung
MaskImage schiff,255,255,255
MaskImage expl,255,255,255

ClsColor 0,0,0

Global ttimer = CreateTimer(60)

gegner_erstellen()

;--------------------------------------------------------------------------------------------|

While Not KeyHit(1)
   WaitTimer(ttimer)
   Cls
   
   If MilliSecs()-oldtime >= 1000 Then
      oldtime = MilliSecs()
      umrechnen()
   End If
   
   
   Schuss()
   Bewegen()
   Sterne()
   GegUpdate()
   PlyUpdate()
   
   
   DrawImage schiff,px,py
   DrawImage side,824,0
   
   Texte()
   
   If Ende=1 Then Exit
   
   Flip 0
Wend
End

;--------------------------------------------------------------------------------------------|

Function Schuss()
   If KeyHit(57) Then
      s.Schuss = New schuss
      s\x = sx
      s\y = sy
      
      PlaySound shot
   EndIf
   
   For s.Schuss = Each Schuss
      s\y = s\y - speed

      Rect s\x,s\y,2,5
      
      If s\y < 10 Then Delete s.Schuss
   Next
   
   If Timer < MilliSecs() Then
         frame =(frame +1)Mod 16         ;Anzahl Bilder
         timer = MilliSecs() + 100   ;Pausenzeit
   End If
   
   For s.Schuss = Each Schuss
         For g.Gegner = Each Gegner
            If RectsOverlap(g\x,g\y,40,40,s\x,s\y,2,5) Then
            DrawImage expl,g\x,g\y,frame
            Delete s.Schuss
            Delete g.Gegner
            g.Gegner = New Gegner
            g\x = Rnd(0,760)
            g\y = Rnd(-920,-20)
            g\image  = ggge
            PlaySound treffer
            points=points+10
               Exit
            EndIf
      Next
   Next
End Function

Function Bewegen()
   If KeyDown(203) Then px=px-3 sx=sx-3
   If KeyDown(205) Then px=px+3 sx=sx+3
End Function

Function gegner_erstellen()
   For a = 0 To geganzahl
      g.gegner = New gegner
      g\x         = Rnd(0,760)
      g\y         = Rnd(-900,-20)
      g\image  = LoadImage("gfx\gegner.png")
      MaskImage g\image,255,255,255
   Next
End Function

Function GegUpdate()
   For upd.gegner = Each gegner
      DrawImage upd\image, upd\x, upd\y
      MaskImage upd\image,255,255,255
   Next
   
   For g.Gegner = Each Gegner
      g\y = g\y +gegSpeed
      If g\y > 770 Then
         g\y=Rnd(-200,-20)
         g\x=Rnd(0,760)
         Exit
      EndIf
   Next
End Function

Function PlyUpdate()
   If px <2 Then
      px=2
      sx=26
   EndIf
   
   If px >770 Then
      px=770
      sx=786
   EndIf
   
   For g.Gegner = Each Gegner
      If (stampMin = 0 And stampSec = 0) Or g\image=False Or lives <= 0 Then Ende()
      If RectsOverlap(g\x,g\y,40,40,px,py,50,50) Then
         Delete g.Gegner
         PlaySound treffer
         lives=lives-1
            Exit
         EndIf
   Next
End Function

Function Sterne()
   For i=0 To 100
      Plot Rnd(0,1024),Rnd(0,768)
   Next
End Function

Function Texte()
   If KeyHit(41) Then
      GetKey()
   EndIf
   
   Text 920,165,+lives
   Text 920,290,+points
   Text 880,340, "Zeit: "+stampMin+":"+stampSec
End Function

Function umrechnen()
   time = time - 1

   stampMin = time/60
   stampSec = time - (stampMin * 60)
End Function


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragSa, Jan 02, 2010 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
was meinst Du nun mit "Zucken" genau? Hüpfen die zwischen zwei Positionen hin und her (z.b. um2 Pixel) oder läuft da so ein "Bruch" durch, wie man es früher manchmal bei schlechten Fernsehern hatte?

Das Exit ist ja immer noch im GegnerUpdate. Wozu ist es da?

Chester

BeitragSa, Jan 02, 2010 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Probiers mal mit Flip 1.

N0X

BeitragSa, Jan 02, 2010 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Die "zucken" immer so um 1 bis 2 Pixel nach oben/unten (kann man nicht genau sehen.
Das Exit hab ich nur vergessen raus zu nehmen. (Den Code hab ich aus alten Zeiten rausgekramt ^^)
Flip 1 ändert nichts.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Midimaster

BeitragSa, Jan 02, 2010 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
bringt es was, wenn man es rausnimmt?

der fehler ist seltsam:

Irgendwie scheinen entweder die y-werte deiner gegner an zwei stellen im code verändert zu werden.

Oder es werden versehentlich zwei Welten dargestellt. z.b. alles gemalt dann die Gegner bewegt und nochmal gemalt und dann erst der flip


werf mal bitte außerdem den neuesten code in deinen ersten beitrag von 15:06 Uhr


weitere Ungereimtheiten:

Bei mir springt das Programm gleich zu Beginn in die Ende(). Die fehlt aber leider im Code. Was passiert da?

Probiers mal mit einem DEBUGLOG wie hier:

BlitzBasic: [AUSKLAPPEN]
Function PlyUpdate()
If px <2 Then
px=2
sx=26
EndIf

If px >770 Then
px=770
sx=786
EndIf

For g.Gegner = Each Gegner
If (stampMin = 0 And stampSec = 0) Or g\image=False Or lives <= 0 Then
DebugLog " stampin " + stampin
DebugLog " stampSec" + stampSec
DebugLog " g\image " + g\image
DebugLog " lives " + lives
DebugLog " schon aus"
WaitKey
Ende()
EndIf
...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group