Space Shooter

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragMi, Dez 17, 2003 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier habe ich noch was rausgesucht, in bezug auf die explosionenCode: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()
Timer=CreateTimer(50)
Dim Knall(20,9)



Repeat
 Cls
  If KeyHit(57) Then
       Freie_Explosi_suchen(Rand(10,750),Rand(10,750) )
  End If

   Explosionen()
  WaitTimer(Timer)
  Flip
Until KeyDown(1)
End


Function Freie_Explosi_suchen(x,y)
 For Zaehler1 = 0 To 20
     If Knall(Zaehler1,0) = 0  Then ; wenn nicht aktiv
          Knall(Zaehler1,0) = 1       ; aktivieren
          Knall(Zaehler1,1) = x      ;koordinaten übergeben
          Knall(Zaehler1,2) = y
          Knall(Zaehler1,3) = 0  ; raufzählen für explosionFrames
        Exit ; schleife verlassen da eine leere gefunden wurde
     End If
 Next
End Function

Function Explosionen()
      For Zaehler = 0 To 20
      If Knall(Zaehler,0) = 1  Then
      
      ; hier kannste die frame Bremse einbauen
         Knall(Zaehler,3)=Knall(Zaehler,3)+1

         
         If Knall(Zaehler,3)=20 Then
            Knall(Zaehler,0) = 0
         End If   
          Oval Knall(Zaehler,1) - Knall(Zaehler,3) ,Knall(Zaehler,2) -Knall(Zaehler,3),Knall(Zaehler,3)*2,Knall(Zaehler,3) *2 ,1
      End If
   Next
End Function

einfach mal ausprobieren
mit Space erstellst du an eine zufälligen Stelle eine

BladeRunner

Moderator

BeitragDo, Dez 18, 2003 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Das problem bei diesem lösungsansatz ist allerdings, das er auf einem Compi genauso funktioniert-nämlich deinem.
Wenn du konstante Rates haben willst, mußt du mit millisecs() arbeiten, damit du unabhängig von der Geschwindigkeit des Rechners bist.
@Freeman: bin jetzt etwas in zeitdruck- ich melde mich wohl heut abend nommal. Dann schaun wir mal, okay?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Julz

BeitragDo, Dez 18, 2003 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab ma die methode von Rallimen versucht aber die funst nicht, und ich kann mir gluab'ch auch schon denken warum weil immer wenn der gegner zerstört wird geht die variable eins hoch also sieht man bei jedem gegner kurz ein frame Confused

@bladerunner Also ich hab schon verstanden was du meinst aber wo soll jetzt die andre funcktion hin ??? die die gebremst werden soll ???

Code: [AUSKLAPPEN]

APPTITLE "Shooter"
graphics 640, 480
setbuffer backbuffer()

global monster = loadimage("monster.bmp")
global player = loadimage("player.bmp")
global schussbild = loadimage("schuss.bmp")
global background = loadimage("bg.bmp")
global explosion = loadanimimage("kaboom.bmp",60,48,0,6)

dim rakete(20,2)
dim enemy(5,2)

global treffer = 0
global hoehe = 200
global schuss = 0
global punkte = 0
global pos_y = 10
global sin_x = 0
global x = 300
global y = 300
global bg = 0
global i = 0
global v = 0
global frame = 0




repeat
cls

hintergrund()
steuerung()
schiesen()
gegner()
kollisionen()
spieler()
punkte()

repeat until millisecs() mod 33 = 0 ;<------------hab hier die verzögerung
                                                  ;<------------Muss hier jetzt die funktion hin ??
 
flip
until keydown(1)

function hintergrund()
bg = bg + 1
if bg = 200 then bg = 0
tileblock background, 0, bg
end function

function steuerung()
if keydown(205) then x = x + 4
if keydown(203) then x = x - 4
if keydown(200) then y = y - 4
if keydown(208) then y = y + 4

if x > 600 then x = 600
if x < 0 then x = 0
if y > 440 then y = 440
if y < 0 then y = 0
end function

function schiesen()
if keyhit(57) then
schuss = schuss + 1
if schuss = 21 then schuss = 1
rakete(schuss,0) = 1
rakete(schuss,1) = x + 8
rakete(schuss,2) = y - 16
endif

for l = 1 to 20
if rakete(l,0) = 1 then
drawimage schussbild, rakete(l,1), rakete(l,2)
rakete(l,2) = rakete(l,2) - 5
endif
next
end function

function gegner()

i = i + 1
sin_x = sin(i) * hoehe

for h = 1 to 5
enemy(h,0) = 1
enemy(h,1) = sin_x
enemy(h,2) = pos_y
if enemy(h,0) = 1 then
enemy(h,2) = enemy(h,2) + 3
enemy(h,1) = enemy(h,1) + 300
drawimage monster, enemy(h,1), enemy(h,2)
if enemy(h,2) > 641 then
enemy(h,0) = 0
punkte = punkte - 10
hoehe = rnd(200,300)
endif
endif
next
end function

function kollisionen()
for k = 1 to 20
for t = 1 to 5
if rakete(k,0) = 1 and imagesoverlap(monster, enemy(t,1), enemy(t,2), schussbild, rakete(k,1), rakete(k,2)) then
rakete(k,0) = 0
treffer = treffer + 1
endif
next
next

if treffer = 3 then
for g = 1 to 5
enemy(g,0) = 0
treffer = 0
punkte = punkte + 10
hoehe = rnd(200,300)
enemy(t,2) = -10
next
endif

for z = 1 to 5
if imagesoverlap(monster, enemy(z,1), enemy(z,2), player, x, y) then
punkte = 0
endif
next
end function

function spieler()
drawimage player, x, y
end function

function punkte()
text 400,10, "Du hast "+punkte+" Punkte"
end function

BladeRunner

Moderator

BeitragDo, Dez 18, 2003 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du repeat until verwendest wird der ganze Code gebremst. Nur einzelne teile bremsen klappt nur mit dem Vorgehen welches ich als Letztes in Erwägung gezogen hab.
Ach ja: die 2.te methode vergiß besser- da hatte ich nen denkfehler drin.
wäre allenfals adaptiert benutzbar, und selbst dann nur unzuverlässig.

EDIT:
Habs mal provisorisch reigeschraubt:

Code: [AUSKLAPPEN]

APPTITLE "Shooter"
graphics 640, 480
setbuffer backbuffer()

global monster = loadimage("monster.bmp")
global player = loadimage("player.bmp")
global schussbild = loadimage("schuss.bmp")
global background = loadimage("bg.bmp")
global explosion = loadanimimage("kaboom.bmp",60,48,0,6)

dim rakete(20,2)
dim enemy(5,2)

global treffer = 0
global hoehe = 200
global schuss = 0
global punkte = 0
global pos_y = 10
global sin_x = 0
global x = 300
global y = 300
global bg = 0
global i = 0
global v = 0
global frame = 0

Zeitgeber=millisecs()



repeat
cls

hintergrund()
steuerung()
schiesen()
gegner()
kollisionen()
spieler()
punkte()

if (millisecs()-Zeitgeber)>33 then
   Zeitgeber=millisecs()
   ;hier deine Explosionsfunction, oder besser: den Counter für
   ;die Frames um eines erhöhen und die Function welche die Explosion
   ;zeichnet oben in der schleife ausführen (zB explo(frame))
   ;-->hat den vorteil das die explo immer gezeichnet wird und nicht
   ;verschwinden kann.
end if 
flip
until keydown(1)

end ;<--verhindert das leidige "program has ended"

function hintergrund()
bg = bg + 1
if bg = 200 then bg = 0
tileblock background, 0, bg
end function

function steuerung()
if keydown(205) then x = x + 4
if keydown(203) then x = x - 4
if keydown(200) then y = y - 4
if keydown(208) then y = y + 4

if x > 600 then x = 600
if x < 0 then x = 0
if y > 440 then y = 440
if y < 0 then y = 0
end function

function schiesen()
if keyhit(57) then
schuss = schuss + 1
if schuss = 21 then schuss = 1
rakete(schuss,0) = 1
rakete(schuss,1) = x + 8
rakete(schuss,2) = y - 16
endif

for l = 1 to 20
if rakete(l,0) = 1 then
drawimage schussbild, rakete(l,1), rakete(l,2)
rakete(l,2) = rakete(l,2) - 5
endif
next
end function

function gegner()

i = i + 1
sin_x = sin(i) * hoehe

for h = 1 to 5
enemy(h,0) = 1
enemy(h,1) = sin_x
enemy(h,2) = pos_y
if enemy(h,0) = 1 then
enemy(h,2) = enemy(h,2) + 3
enemy(h,1) = enemy(h,1) + 300
drawimage monster, enemy(h,1), enemy(h,2)
if enemy(h,2) > 641 then
enemy(h,0) = 0
punkte = punkte - 10
hoehe = rnd(200,300)
endif
endif
next
end function

function kollisionen()
for k = 1 to 20
for t = 1 to 5
if rakete(k,0) = 1 and imagesoverlap(monster, enemy(t,1), enemy(t,2), schussbild, rakete(k,1), rakete(k,2)) then
rakete(k,0) = 0
treffer = treffer + 1
endif
next
next

if treffer = 3 then
for g = 1 to 5
enemy(g,0) = 0
treffer = 0
punkte = punkte + 10
hoehe = rnd(200,300)
enemy(t,2) = -10
next
endif

for z = 1 to 5
if imagesoverlap(monster, enemy(z,1), enemy(z,2), player, x, y) then
punkte = 0
endif
next
end function

function spieler()
drawimage player, x, y
end function

function punkte()
text 400,10, "Du hast "+punkte+" Punkte"
end function
 
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Dez 18, 2003 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum schlagt ihr euch mit millisec() rum,
Viel einfacher ist das um die Programmgeschwindigkeit festzulegen!


Timer = CreateTimer(50)
hiermit sagts du wie viele Bilder pro sekunde maximal angezeigt werden sollen
sollte im Anfang des Code stehen
Für Testzwecke setzte ich die auch schon mal auf 10


WaitTimer(Timer)
hier wird gewartet bis 1/50 Sekunde um ist
und steht normalerweise direkt vor flip

Code: [AUSKLAPPEN]
....
Timer = CreateTimer(50)
....
repeat
...
....
....
WaitTimer(Timer)
Flip
until keyhit(1)

Damit läuft dein Programm auch gleich schnell auf anderen Rechnern

BladeRunner

Moderator

BeitragDo, Dez 18, 2003 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
@Rallimen:

Julz sucht nach einem Weg, nur einen Teil des Programms zu bremsen- dafür muß man eben millisecs() verwenden, da timer den kompletten code pausiert.
hab ich aber schon mehrfach erklärt...(s.o.)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Alu-Folie

Gast

BeitragDo, Dez 18, 2003 20:20
Antworten mit Zitat
Freeman hat Folgendes geschrieben:
arrgg, ich hab nochne Frage an dich , is das nen weltraum shooter mit scrollen oda ohne? Und wenn ja, sind die maps dann so gemacht das du jedes Bild einzeln reinlädst oder per data 1,0,1......... Wenn das so is, dann wärs nett wennde mir ma verraten könntest wie man nen vernünftiges mapscrolling hinbekommt, achso, wo hastn das schießen her?


In seinem Code-Abschnitt macht er kein Scrolling.
Aber ich will dir mal kurz erklären wie du das ganze einfacher lösen kannst. Du kannst ein Bild nehmen, das Beispielsweise 200x200 Pixel groß ist, sagen wir mal auf dem Bild sind sterne. Dann schreibst du im Code

Code: [AUSKLAPPEN]
Tileimage Background, 0, Scroll
Scroll = Scroll + 1
If Scroll > ImageHeight(Background) then Scroll = 0


Du kannst das ganze auch mit Tilemaps machen, nur das würde dann auch etwas komplizierter sein. Wenn du weißt, wie man eine Map zeichnet, dann kannst du von den Positionen der Tiles ScrollX und ScrollY abziehen.

Code: [AUSKLAPPEN]
Drawblock Tileset, CountX*32-ScrollX, CountY*32-ScrollY, Map(CountX, CountY)


Wenn du noch mehr fragen hast, dann gibbet auf der robsite ein paar übsche Tutorials zum Thema Tilemaps.

Julz

BeitragDo, Dez 18, 2003 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab das ganze jetzt eingebaut aber irgenwie funst das immer noch nicht so ganz:

Code: [AUSKLAPPEN]

APPTITLE "Shooter"
graphics 640, 480
setbuffer backbuffer()

global monster = loadimage("monster.bmp")
global player = loadimage("player.bmp")
global schussbild = loadimage("schuss.bmp")
global background = loadimage("bg.bmp")
global explosion = loadanimimage("kaboom.bmp",60,48,0,6)

dim rakete(20,2)
global treffer = 0
global hoehe = 200
global schuss = 0
global punkte = 0
global boom = 0
global pos_y = 10
global sin_x = 0
global x = 300
global y = 300
global bg = 0
global i = 0
zeitgeber=millisecs()



repeat
cls

hintergrund()
steuerung()
schiesen()
gegner()
kollisionen()
spieler()
punkte()
explo(frame)

if (millisecs()-zeitgeber)>33 then
zeitgeber=millisecs()
frame = frame + 1
if frame = 6 then frame = 1
explo(frame)
end if

flip
until keydown(1)

function explo(frame)
if boom = 1 then
drawimage explosion, sin_x+300, pos_y, frame
boom = 0
endif
end function

function hintergrund()
bg = bg + 1
if bg = 200 then bg = 0
tileblock background, 0, bg
end function

function steuerung()
if keydown(205) then x = x + 4
if keydown(203) then x = x - 4
if keydown(200) then y = y - 4
if keydown(208) then y = y + 4

if x > 600 then x = 600
if x < 0 then x = 0
if y > 440 then y = 440
if y < 0 then y = 0
end function

function schiesen()
if keyhit(57) then
schuss = schuss + 1
if schuss = 21 then schuss = 1
rakete(schuss,0) = 1
rakete(schuss,1) = x + 8
rakete(schuss,2) = y - 16
endif

for l = 1 to 20
if rakete(l,0) = 1 then
drawimage schussbild, rakete(l,1), rakete(l,2)
rakete(l,2) = rakete(l,2) - 5
endif
next
end function

function gegner()
i = i + 1
pos_y = pos_y + 3
sin_x = sin(i) * hoehe
sin_x = sin_x + 300
drawimage monster, sin_x, pos_y
if pos_y > 641 then
punkte = punkte - 10
pos_y = 0
hoehe = rnd(200,300)
endif
end function

function kollisionen()
for k = 1 to 20
if rakete(k,0) = 1 and imagesoverlap(monster, sin_x, pos_y, schussbild, rakete(k,1), rakete(k,2)) then
rakete(k,0) = 0
treffer = treffer + 1
endif
next

if treffer = 3 then
boom = 1
treffer = 0
punkte = punkte + 10
hoehe = rnd(200,300)
pos_y = -10
endif

if imagesoverlap(monster, sin_x, pos_y, player, x, y) then
end
endif
end function

function spieler()
drawimage player, x, y
end function

function punkte()
text 400,10, "Du hast "+punkte+" Punkte"
end function

BladeRunner

Moderator

BeitragDo, Dez 18, 2003 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm...


du setzt in explo(frame) die var boom auf 0, das darf aber erst geschehen, wenn alle frames durch sind.

also: if frame=5 then boom=0

kanns nit richtig testen, da ich deine artworks nit hab, der Fehler is mir aber mal ins auge gesprungen.

EDIT:
du rufst in der Hauptschleife explo() auf und in der Bremse auch. einmal genügt.
(am besten in der Hauptschleife).
Es kann sein, das dann das erste anim.bild nit zu sehen ist, dann müsste frame auf 0 gesetzt werden zu beginn (da es ja automatisch erhöht wird).

Ausserdem erhöhst du frame unabhängig vom vorhandensein einer explo, d.h. alle Explos werden immer in der selben Phase sein (und mit Pech beginnt eine Explosion im letzten frame). Hier wäre es günstiger in der Bremse auf boom=1 zu prüfen bevor du frame änderst- das ist dann aber nur ein Anfang.
Ändere die Sachen und sag mir wie es dann geht, ok?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, Dez 19, 2003 0:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab da mal in unzähligen Stunden Very Happy
3 neue Functionen eingebaut

1x mit Bladerunners version Millisecs
1x mit variable
1x ohne pause, also ganz normal Code: [AUSKLAPPEN]
AppTitle "Shooter"
Graphics 640, 480
SetBuffer BackBuffer()
frameTimer=CreateTimer(50)                         ;--<<<<< neu

Global monster = LoadImage("monster.bmp")
Global player = LoadImage("player.bmp")
Global schussbild = LoadImage("schuss.bmp")
Global background = LoadImage("bg.bmp")
Global explosion = LoadAnimImage("kaboom.bmp",60,48,0,5)

Dim Knall(20,4)   ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu

Dim rakete(20,2)
Global treffer = 0
Global hoehe = 200
Global schuss = 0
Global punkte = 0
Global pos_y = 10
Global sin_x = 0
Global x = 300
Global y = 300
Global bg = 0
Global i = 0


Repeat
   Cls
   
   hintergrund()
   steuerung()
   schiesen()
   gegner()
   kollisionen()
   spieler()
   ;Hier kannste dir aussuchen welche du nimmst, mußt nur in der ersten funktion millisecs durch 0 ersetzen
   ;Explosionen_Variable()                   ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu
   Explosionen_Zeit() ;So wie BladeRunner beschrieben--<<<<<<<<<< neu
   ;Explosionen_malen()     ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu
   
   punkte()
   WaitTimer(frameTimer) ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu
   Flip
Until KeyDown(1)

Function Freie_Explosi_suchen(x,y) ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu
 For Zaehler = 0 To 20
     If Knall(Zaehler,0) = 0  Then ; wenn nicht aktiv
          Knall(Zaehler,0) = 1       ; aktivieren
          Knall(Zaehler,1) = x      ;koordinaten übergeben
          Knall(Zaehler,2) = y
          Knall(Zaehler,3) = 0  ; raufzählen für explosionFrames
        Knall(Zaehler,4) = MilliSecs() ;  Wichtig Wichtig Wichtig Wichtig Wichtig Wichtig Wichtig ,
                   ;hier muß = 0  stehen wenn eine der beiden anderen Function benutzt wird
        Exit ; schleife verlassen da eine leere gefunden wurde
     End If
 Next
End Function

Function Explosionen_malen() ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu
      For Zaehler = 0 To 20  ; maximal 20 verschiedene explosionen möglich
      If Knall(Zaehler,0) = 1  Then
      DrawImage explosion,Knall(Zaehler,1),Knall(Zaehler,2),Knall(Zaehler,3)
          Knall(Zaehler,3)=Knall(Zaehler,3) +  1 ;Frame raufzählen
         If Knall(Zaehler,3) = 5 Then  ; den Frame gibt es nicht ,bzw die Bilder sind durchgelaufen
            Knall(Zaehler,0) = 0  ; abschalten
         End If   
      End If
   Next
End Function
Function Explosionen_Variable() ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu
      For Zaehler = 0 To 20  ; maximal 20 verschiedene explosionen möglich
      If Knall(Zaehler,0) = 1  Then ; wenn aktiv dann zeichnen
      DrawImage explosion,Knall(Zaehler,1),Knall(Zaehler,2),Knall(Zaehler,3)
       If Knall(Zaehler,4) = 3   Then; 3 x gleiches Frame zeichnen und dann wechseln
       ; wenn der wert sehr hoch ist siehst du auch mehrere Explosionen
       ; da
          Knall(Zaehler,4)= 0             
         Knall(Zaehler,3)=Knall(Zaehler,3) +  1
       Else
          Knall(Zaehler,4)= Knall(Zaehler,4)+1
      End If
         If Knall(Zaehler,3) = 5 Then  ; den Frame gibt es nicht ,bzw die Bilder sind durchgelaufen
            Knall(Zaehler,0) = 0  ; abschalten
         End If   
      End If
   Next
End Function
Function Explosionen_Zeit()
      For Zaehler = 0 To 20  ; maximal 20 verschiedene explosionen möglich
      If Knall(Zaehler,0) = 1  Then
      DrawImage explosion,Knall(Zaehler,1),Knall(Zaehler,2),Knall(Zaehler,3)
         If (MilliSecs()-Knall(Zaehler,4))>33 Then ; jedes Frame wird min. 33Millisekunden gezeigt
               Knall(Zaehler,4)=MilliSecs()
            Knall(Zaehler,3)=Knall(Zaehler,3) +  1
         End If
         If Knall(Zaehler,3) = 5 Then  ; den Frame gibt es nicht ,bzw die Bilder sind durchgelaufen
             Knall(Zaehler,0) = 0  ; abschalten
         End If   
      End If
   Next
End Function

Function hintergrund()
bg = bg + 1
If bg = 200 Then bg = 0
TileBlock background, 0, bg
End Function

Function steuerung()
If KeyDown(205) Then x = x + 4
If KeyDown(203) Then x = x - 4
If KeyDown(200) Then y = y - 4
If KeyDown(208) Then y = y + 4

If x > 600 Then x = 600
If x < 0 Then x = 0
If y > 440 Then y = 440
If y < 0 Then y = 0
End Function

Function schiesen()
If KeyHit(57) Then
schuss = schuss + 1
If schuss = 21 Then schuss = 1
rakete(schuss,0) = 1
rakete(schuss,1) = x + 8
rakete(schuss,2) = y - 16
EndIf

For l = 1 To 20
If rakete(l,0) = 1 Then
DrawImage schussbild, rakete(l,1), rakete(l,2)
rakete(l,2) = rakete(l,2) - 5
EndIf
Next
End Function

Function gegner()
i = i + 1
pos_y = pos_y + 3
sin_x = Sin(i) * hoehe
sin_x = sin_x + 300
DrawImage monster, sin_x, pos_y
If pos_y > 641 Then
punkte = punkte - 10
pos_y = 0
hoehe = Rnd(200,300)
EndIf
End Function

Function kollisionen()
For k = 1 To 20
If rakete(k,0) = 1 And ImagesOverlap(monster, sin_x, pos_y, schussbild, rakete(k,1), rakete(k,2)) Then
rakete(k,0) = 0
treffer = treffer + 1
EndIf
Next

If treffer = 3 Then
Freie_Explosi_suchen(sin_x, pos_y)       ;--<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< neu

treffer = 0
punkte = punkte + 10
hoehe = Rnd(200,300)
pos_y = -10
EndIf

If ImagesOverlap(monster, sin_x, pos_y, player, x, y) Then
End
EndIf
End Function

Function spieler()
DrawImage player, x, y
End Function

Function punkte()
Text 400,10, "Du hast "+punkte+" Punkte"
End Function


natürlich ohne Pistole, sollte aber funzen

im Code hab ich noch einige Komenmtare reingetippt zum besseren verständnis

Julz

BeitragFr, Dez 19, 2003 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@Rallimen dein source funs allerdings ist das ganze spiel ziemlich gebremst, alles ruckelt, dafür läuft die explosion schön ab

@bladerunner bin grad dabei deins zu testen

wollte nur schon mal sagen das ich schon dick am testen bin ...hihihi.....

Also bi njetzt fertig mit testen ich habs fast allerdings noch ein problem wenn ich jetzt den ersten gegner kille dann erscheint bei allen gegnern ne explosion, d.h. es sind zwei images übernander der gegner und die explosion:

Code: [AUSKLAPPEN]

APPTITLE "Shooter"
graphics 640, 480
setbuffer backbuffer()

global monster = loadimage("monster.bmp")
global player = loadimage("player.bmp")
global schussbild = loadimage("schuss.bmp")
global background = loadimage("bg.bmp")
global explosion = loadanimimage("kaboom.bmp",60,48,0,6)

dim rakete(20,2)
global treffer = 0
global hoehe = 200
global schuss = 0
global punkte = 0
global boom = 0
global pos_y = 10
global sin_x = 0
global x = 300
global y = 300
global bg = 0
global i = 0
zeitgeber=millisecs()



repeat
cls

hintergrund()
steuerung()
schiesen()
gegner()
kollisionen()
spieler()
punkte()
explo(frame)

if (millisecs()-zeitgeber)>33 then
zeitgeber=millisecs()
if boom = 1 then
frame = frame + 1
if frame = 6 then frame = 1
endif
endif

flip
until keydown(1)

function explo(frame)
if boom = 1 then
drawimage explosion, sin_x, pos_y, frame
if frame = 6 then
frame = 1
boom = 0
endif
endif
end function

function hintergrund()
bg = bg + 1
if bg = 200 then bg = 0
tileblock background, 0, bg
end function

function steuerung()
if keydown(205) then x = x + 4
if keydown(203) then x = x - 4
if keydown(200) then y = y - 4
if keydown(208) then y = y + 4

if x > 600 then x = 600
if x < 0 then x = 0
if y > 440 then y = 440
if y < 0 then y = 0
end function

function schiesen()
if keyhit(57) then
schuss = schuss + 1
if schuss = 21 then schuss = 1
rakete(schuss,0) = 1
rakete(schuss,1) = x + 8
rakete(schuss,2) = y - 16
endif

for l = 1 to 20
if rakete(l,0) = 1 then
drawimage schussbild, rakete(l,1), rakete(l,2)
rakete(l,2) = rakete(l,2) - 5
endif
next
end function

function gegner()
i = i + 1
pos_y = pos_y + 3
sin_x = sin(i) * hoehe
sin_x = sin_x + 300
drawimage monster, sin_x, pos_y
if pos_y > 641 then
punkte = punkte - 10
treffer = 0
pos_y = 0
hoehe = rnd(200,300)
endif
end function

function kollisionen()
for k = 1 to 20
if rakete(k,0) = 1 and imagesoverlap(monster, sin_x, pos_y, schussbild, rakete(k,1), rakete(k,2)) then
rakete(k,0) = 0
treffer = treffer + 1
endif
next

if treffer = 3 then
boom = 1
treffer = 0
punkte = punkte + 10
hoehe = rnd(200,300)
pos_y = -10
endif

if imagesoverlap(monster, sin_x, pos_y, player, x, y) then
end
endif
end function

function spieler()
drawimage player, x, y
end function

function punkte()
text 400,10, "Du hast "+punkte+" Punkte"
end function

BladeRunner

Moderator

BeitragFr, Dez 19, 2003 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehlerteufel hat wieder zugeschlagen ... Twisted Evil Twisted Evil
Ersetze in explo(frame):
Code: [AUSKLAPPEN]
 if frame = 5 then ;wichtig: bei frame=6 wird in der bremse eine 1 draus....


das sollte helfen.
Bislang hast du nur einen Gegner aufm Bildschirm, das seh ich richtig, oder ?
Kannst du mir deine Pics mal senden, damit ich den Code richtig testen kann?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

dominik

BeitragFr, Dez 19, 2003 15:46
Antworten mit Zitat
Benutzer-Profile anzeigen
also wenn wir hier schon grad bei space shooter problemen sind dann hab ich da auch mal noch nen paar fragen also:

1. funzt meine collisionsabfrage von meinen raketen mit den gegnern nich obwohl ich des einfach mit imageoverlap gemacht hab.
der pc prüft irgentwie jeden durchlauf ob eine rakete mit einem gegner zusammengestoßen is aber wenn kein gegner nich da is dann bricht des programm mit "images does not exsist ab". also es startet eigentlich garnicht erst weil es ja schon beim ersten durchaluf passiert. aber eigentlich sollte dess programme doch ganznormal weiterlaufen wenn die beiden vilder nicht collidieren. tun es aber nicht.????????????????Ü Question

Julz

BeitragFr, Dez 19, 2003 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Blade Runner, ich hab leider kein web space wenn du mir allerdings deine e-mail geben würdest dann könnte ich es dir senden

@dominik wenn du uns dein source zeigst dann könnten wir dir eher helfen sonst ist das en bisschen schwierig

BladeRunner

Moderator

BeitragFr, Dez 19, 2003 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
@dominik:
Lade dein gegner/raketenimage vor der Hauptschleife, nicht erst wenn es im spiel erzeugt wird. dann funktioniert auch die Abfrage (imagescollide erwartet daß beide zu prüfenden Bilder existent sind).
Ansonsten hat julz recht- es ist schwierig code zu verstehen/verbessern wenn man ihn nit sieht 8)

@julz:
meine addy ist andreas.brennecke@planet-interkom.de , müßte aber auch in meinem profil sein.. Rolling Eyes

EDIT: nö isse wohl nicht ... Embarassed
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

BladeRunner

Moderator

BeitragFr, Dez 19, 2003 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
So... habs n bissl verschlimmbessert- frame ist zur erleichterung des Geschehens jetzt global, nun funzt die Sache soweit:
Code: [AUSKLAPPEN]


AppTitle "Shooter"
Graphics 640, 480
SetBuffer BackBuffer()

Global monster = LoadImage("monster.bmp")
Global player = LoadImage("player.bmp")
Global schussbild = LoadImage("schuss.bmp")
Global background = LoadImage("bg.bmp")
Global explosion = LoadAnimImage("kaboom.bmp",60,48,0,6)

Dim rakete(20,2)
Global treffer = 0
Global hoehe = 200
Global schuss = 0
Global punkte = 0
Global boom = 0
Global pos_y = 10
Global sin_x = 0
Global x = 300
Global y = 300
Global bg = 0
Global i = 0
Global Frame
Global zeitgeber=MilliSecs()



Repeat
Cls

hintergrund()
steuerung()
schiesen()
gegner()
kollisionen()
spieler()
punkte()
explo( )

If (MilliSecs()-zeitgeber)>100 Then
   zeitgeber=MilliSecs()
   If boom = 1 Then
      frame = frame + 1
   EndIf
EndIf

Flip
Until KeyDown(1)


Function explo()
   If boom = 1 Then
        DrawImage explosion, sin_x, pos_y, frame
        If frame >= 5 Then
           frame = 1
           boom = 0
        EndIf
   EndIf
End Function


Function hintergrund()
   bg = bg + 1
   If bg = 200 Then bg = 0
   TileBlock background, 0, bg
End Function


Function steuerung()
   If KeyDown(205) Then x = x + 4
   If KeyDown(203) Then x = x - 4
   If KeyDown(200) Then y = y - 4
   If KeyDown(208) Then y = y + 4

   If x > 600 Then x = 600
   If x < 0 Then x = 0
   If y > 440 Then y = 440
   If y < 0 Then y = 0
End Function


Function schiesen()
   If KeyHit(57) Then
      schuss = schuss + 1
      If schuss = 21 Then schuss = 1
      rakete(schuss,0) = 1
      rakete(schuss,1) = x + 8
      rakete(schuss,2) = y - 16
   EndIf

   For l = 1 To 20
   If rakete(l,0) = 1 Then
      DrawImage schussbild, rakete(l,1), rakete(l,2)
      rakete(l,2) = rakete(l,2) - 5
   EndIf
   Next
End Function


Function gegner()
   i = i + 1
   pos_y = pos_y + 3
   sin_x = Sin(i) * hoehe
   sin_x = sin_x + 300
   DrawImage monster, sin_x, pos_y
   If pos_y > 641 Then
      punkte = punkte - 10
      treffer = 0
      pos_y = 0
      hoehe = Rnd(200,300)
   EndIf
End Function


Function kollisionen()
   For k = 1 To 20
   If rakete(k,0) = 1 And ImagesOverlap(monster, sin_x, pos_y, schussbild, rakete(k,1), rakete(k,2)) Then
      rakete(k,0) = 0
      treffer = treffer + 1
   EndIf
   Next

   If treffer >= 3 Then
      boom = 1
      treffer = 0
      punkte = punkte + 30
      hoehe = Rnd(200,300)
      pos_y = -10
   EndIf

   If ImagesOverlap(monster, sin_x, pos_y, player, x, y) Then
      
      End
   EndIf
End Function


Function spieler()
   DrawImage player, x, y
End Function


Function punkte()
   Text 400,10, "Du hast "+punkte+" Punkte"
End Function
 


Hab mir erlaubt das Ganze etwas übersichtlicher zu Gestalten.

Bezüglich der Email: np- ich lern ja auch was dabei, bin selbst noch n00b.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, Dez 19, 2003 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
@Rallimen dein source funs allerdings ist das ganze spiel ziemlich gebremst, alles ruckelt, dafür läuft die explosion schön ab


das liegt an der Speedbremse die ich eingebaut habe
Begrenzung auf 50 x Flip pro sekunde
das bedeutet das das Programm auf jeden Rechner gleich schnell ist, außer der Rechner ist so lahm das er es nicht schafft die Bilder anzuzeigen in der eingestellten Geschwindigkeit

ersetzte zum testen den
Code: [AUSKLAPPEN]

Timer=CreateTimer(50)

durch
Code: [AUSKLAPPEN]
Timer=CreateTimer(150)
dann
rennt das Spiel wieder
läuft dann aber nur so schnell auf anderen rechnern die diese Geschwindigkeit halten können

du kannst das auch auf Millisecs basis machen
so wie Bladerunner das schon mal alles beschrieben hat

Julz

BeitragFr, Dez 19, 2003 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Ralimen großes thx an dich dein code funst einwandfrei Very Happy

@ bladerunner, also der code funst immer noch nich so ganz weil wenn die position der explosion übergeben wird dann wird die so schnell erneuert dass die explosion mit dem nächsten monster das erscheint mitfliegt....... Confused komisch...

und noch ne frage mit millisecs() was bekomm ich da für en wert ???
was bringt mir das und wie kann ich damit mein programm bremsen ??

Code: [AUSKLAPPEN]

If (MilliSecs()-zeitgeber)>100 Then
   zeitgeber=MilliSecs()
   If boom = 1 Then
      frame = frame + 1
   EndIf
EndIf


Cool wäre wenn du den code hier en bisschen dokumentieren könntest damit ich genauer verstehe was da eigentlich passiert Very Happy

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, Dez 19, 2003 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
mit Millisecs() liest du die interne StoppUhr aus
Diese startet mit dem rechner und liefert dir die Zeit in millisekunden
die der rechner schon läuft
z.B.: 3600000 was genau 1Stunde wäre

MilliSecs()-zeitgeber ; ist die Zeitspanne , die vergangen ist seit dem aufruf von
zeitgeber = MilliSecs()

;dieses bedeutet einfach
If (MilliSecs()-zeitgeber)>100 Then
wenn die zeitspanne größer 100 Millisekunden ist dann

If boom = 1 Then ; wenn der boom aktiv ist
frame = frame + 1
EndIf

kannste aber auch unter www.blitzbase.de nachsehen

Julz

BeitragFr, Dez 19, 2003 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so danke für die erklärung Very Happy jetzt hab ich gerafft

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group