Zu viele kometen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

emde

Betreff: Zu viele kometen

BeitragDi, Apr 10, 2007 11:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, bei meinem momentanen spiel schleicht sich ein fehler beim erstellen der kometen ein. Das programm soll nur einmal einen omet erstellen wen a=1 ist, aber er macht da irgendetwas komisches, er macht 2 vilder und die bewegen sich denn ganz merkwürdig. Wäre nett wenn ihr mir sagen könntet was das problem ist.
Code: [AUSKLAPPEN]

Graphics 640,480
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Type g

   Field xg
   Field yg
   Field energie
   
End Type

Type k

   Field xk
   Field yk
   Field energiek
   
End Type

Type k2

   Field xk2
   Field yk2
   Field energiek2
   
End Type

Type s

   Field xs
   Field ys
   
End Type

Type w

   Field xw
   Field yw
   
End Type

Type st

   Field xst
   Field yst
   
End Type

Global xp=100
Global yp=100

Global energiep=100
Global schusskraftp=100

Global fuelp=100
Global geldp=0

Global waffep=0

Global player=LoadImage("player.bmp")
MaskImage player,255,0,255

Global komet=LoadImage("meteor1.bmp")
MaskImage komet,255,0,255

Global komet2=LoadImage("meteor2.bmp")
MaskImage komet2,255,0,255

Global gegner=LoadImage("gegener.bmp")
MaskImage gegner,255,0,255

Global schuss=LoadImage("schuss.bmp")
MaskImage schuss,255,0,255

Global schrott=LoadImage("weltraumschrott1.bmp")
MaskImage schrott,255,0,255

Global stern=LoadImage("star1.bmp")
MaskImage stern,255,0,255

Global stern2=LoadImage("star2.bmp")
MaskImage stern2,255,0,255

Global anzeige=LoadImage("anzeige.bmp")

Global a=0


Repeat
Cls
   x#=x#-1
   FPS()
   
   TileImage stern,x#,30
   DrawImage player,xp,yp
      
   DrawImage anzeige,0,380   
      
      If KeyDown(200) Then yp=yp-1;hoch
      If KeyDown(208) Then yp=yp+1;runter
      
      If KeyDown(203) Then xp=xp-1;links
      If KeyDown(205) Then xp=xp+1;rechts
      
      If yp>234
      yp=234
      EndIf
      
      Text 100,0,x#
      
      If yp<-116
      yp=-116
      EndIf
      
      If xp<-51
      xp=-51
      EndIf
      
      If xp>516
      xp=516
      EndIf
      
   If KeyHit(57) ;And waffep=1
      sc.s=New s
      sc\xs=xp+40
      sc\ys=yp+42
      EndIf
      For sc.s=Each s
      DrawImage schuss,sc\xs,sc\ys
      sc\xs=sc\xs+2
   Next
   
   Text 200,0,a

   If x#=-100
   a=a+1
   EndIf
   If a=1
   komete.k=New k
   komete\xk=516
   komete\yk=Rnd(-116,234)
   EndIf
   For komte.k= Each k
   komete\xk=komete\xk-1
   DrawImage komet,komete\xk,komete\yk
   
   If komete\xk<-51
   Delete komete.k
   EndIf
   Next

   

   
Flip   
Until KeyHit(1)

Global Frames, FramesJeSekunde, ZaehlStart

Function FPS()
Frames = Frames + 1

 If ZaehlStart + 1001 < MilliSecs() Then
  FramesJeSekunde = Frames
  Frames = 0
  ZaehlStart = MilliSecs()
 EndIf 

Text 10, 10, FramesJeSekunde + " FPS"
End Function

Hagbard

BeitragDi, Apr 10, 2007 11:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

For komte.k= Each k
   komete\xk=komete\xk-1
   DrawImage komet,komete\xk,komete\yk
   
   If komete\xk<-51
   Delete komete.k
   EndIf
Next


In der ersten Zeile (im Beispiel) hast du dich verschrieben.
Es muss komete heißen.. einfach ein schreibfehler.

noch ein Tipp:
Nachdem x = -100 ist a = 1 und das ändert sich ja nicht.
Hier solltest du eine Begrenzung in der erstellung neuer Kometen einbauen, da es nicht nur sehr langsam, sondern auch sehr unübersichtlich wird.
 

emde

BeitragDi, Apr 10, 2007 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, leider ändert das nichts an dem fehler das immer noch zu viele kometen kommen

Hagbard

BeitragDi, Apr 10, 2007 11:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier kommen zwar zu viele, aber immerhin bewegen sie sich normal und es sind auch nicht nur zwei...

Hier sollte dann vielleicht noch eine Sperre für die Erstellung folgen.


Code: [AUSKLAPPEN]
Graphics 640,480
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Type g

   Field xg
   Field yg
   Field energie
   
End Type

Type k

   Field xk
   Field yk
   Field energiek
   
End Type

Type k2

   Field xk2
   Field yk2
   Field energiek2
   
End Type

Type s

   Field xs
   Field ys
   
End Type

Type w

   Field xw
   Field yw
   
End Type

Type st

   Field xst
   Field yst
   
End Type

Global xp=100
Global yp=100

Global energiep=100
Global schusskraftp=100

Global fuelp=100
Global geldp=0

Global waffep=0

Global a=0


Repeat
Cls
   x#=x#-1
   FPS()
   
   ;TileImage stern,x#,30
   Rect xp,yp, 25, 25
     
   ;DrawImage anzeige,0,380   
     
      If KeyDown(200) Then yp=yp-1;hoch
      If KeyDown(208) Then yp=yp+1;runter
     
      If KeyDown(203) Then xp=xp-1;links
      If KeyDown(205) Then xp=xp+1;rechts
     
      If yp>234
      yp=234
      EndIf
     
      Text 100,0,x#
     
      If yp<-116
      yp=-116
      EndIf
     
      If xp<-51
      xp=-51
      EndIf
     
      If xp>516
      xp=516
      EndIf
     
   If KeyHit(57) ;And waffep=1
      sc.s=New s
      sc\xs=xp+40
      sc\ys=yp+42
      EndIf

      For sc.s=Each s     
        Rect sc\xs,sc\ys, 15, 15
        sc\xs=sc\xs+2
      Next
   
   Text 200, 0, "a: " + a

   If x#=-100
     a = 1
   ElseIf x < -1000 Then
     a = 0
   EndIf

   If a = 1
    komete.k = New k
    komete\xk = 516
    komete\yk = Rnd(-116,234)
   EndIf
   
   For komete.k= Each k
    komete\xk = komete\xk - 1
    Rect komete\xk,komete\yk, 25, 25
   
    If komete\xk <= 51 Then
     Delete komete.k
    EndIf

   Next

   
  Text 20, 20, x


Flip   
Until KeyHit(1)

Global Frames, FramesJeSekunde, ZaehlStart

Function FPS()
Frames = Frames + 1

 If ZaehlStart + 1001 < MilliSecs() Then
  FramesJeSekunde = Frames
  Frames = 0
  ZaehlStart = MilliSecs()
 EndIf

Text 10, 10, FramesJeSekunde + " FPS"
End Function
 

emde

BeitragDi, Apr 10, 2007 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
UNd wie kann man denn eine sperre einbauen

Hagbard

BeitragDi, Apr 10, 2007 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
mal ein Denkanstoß...
Nach einer bestimmten Zeit sollen Gegner erstellt werden.
Bei dir erfolgt dies, wenn x = -100, dann wird a = 1.

Mach doch einfach a entweder nach einer bestimmten Zeit oder besser nach einer bestimmten Anzahl erstellter Kometen wieder 0.
zB könntest bei jedem erstellten Kometen eine Variable um 1 erhöhen, sodass sie die Anzahl der Kometen speichert. Wenn sie zB 20 erreicht hat, soll a=0 sein und damit hört die Produktion wieder auf.

Wenn ein Komet aus dem Feld geht oder er zerstört wird, wird die Variable, die die Anzahl speichert, um 1 niedriger, sodass wieder neue produziert werden bis wieder 20 erreicht sind... usw usw

Dass Problem an Zeit oder an deiner Methode, nämlich eine Variable runterzählen funktioniert nicht bei jedem gleich, sondern jeweils so schnell wie der Rechner "rechnen" kann, also wie gut er ist.
Ein Stichwort dazu ist "Frameunabhängiges Programmieren".
ich würe aber vorschlagen, dass du dir erstmal ein funktionierendes Grundgerüst zusammenbastelst und dann mal hier im Forum danach suchst.
  • Zuletzt bearbeitet von Hagbard am So, Apr 18, 2010 13:27, insgesamt einmal bearbeitet
 

emde

BeitragDi, Apr 10, 2007 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein denkanstoss hat bei mir gute wirkung gezeigt, dank. Aber nun noch eine frage. Ich habe es sso gemacht das wenn kein komte da ist wird einer erstellt und a auf 1 gesetzt und sobald er den bildschirm verlässt wird er gelöscht und a auf eins gestzt und ein neuer genacht. Nun möchte ich es aber gerne so haben das immer 3 kometen auf dem bildschrim sind, aber ich weiss nicht genau wie ich das anstellen soll.
Code: [AUSKLAPPEN]

If a = 0
komete.k = New k
komete\xk = 516
komete\yk = Rnd(-116,234)
EndIf

For komete.k= Each k
komete\xk = komete\xk - 1
DrawImage komet, komete\xk,komete\yk
a=1
If komete\xk <= -150 Then
Delete komete.k
a=0
EndIf

Next


danke für deine mühe

Hagbard

BeitragDi, Apr 10, 2007 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wichtig ist mir, dass du das auch verstehst... trotzdem poste ich jetzt mal den code für einen ansatz:

1. zwischen x = -100 und x = -1000, wird a = 1

2. Ist dies der Fall UND beträgt die Anzahl der Kometen weniger als 3, wird wieder neu erstellt und anzahl steigt um 1 ein.

3. Wenn ein Komet aus dem Feld geht, wird anzahl um 1 niedriger.

Code: [AUSKLAPPEN]

   If x#=-100
     a = 1
   ElseIf x < -1000 Then
     a = 0
   EndIf

   If a = 1 And anzahl < 3
    komete.k = New k
    anzahl = anzahl + 1
    komete\xk = 516
    komete\yk = Rnd(00,434)
   EndIf
   
   For komete.k= Each k
    komete\xk = komete\xk - 1
    Rect komete\xk,komete\yk, 25, 25
   
    If komete\xk <= 51 Then
     Delete komete.k
     anzahl = anzahl - 1
    EndIf

   Next


Übrigens:
Nicht wundern, wenn die Produktion der Kometen irgendwann aufhört, dann ist x < - 1000 und a wieder 0.
 

emde

BeitragDi, Apr 10, 2007 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, nun entsteht noch ein problem bei der collisions überprüfung.
BB sagt mir das das objekt nicht existiert.
Code: [AUSKLAPPEN]

If ImagesCollide(schrotte,schrott\xw,schrott\yw,0,schuss,sc\xs,sc\ys,0)
Delete schrott.w
Delete sc.s
EndIf

Tankbuster

BeitragDi, Apr 10, 2007 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Teste das mal mit ImagesOverlap!
PS:
Du kannst auch
Zitat:
Delete schrott

schreiben!
Twitter
Download Jewel Snake!
Windows|Android
 

emde

BeitragDi, Apr 10, 2007 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider sagt er immer noch das selbe Crying or Very sad

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group