Bomberman

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

DebbieDanger

Betreff: Bomberman

BeitragFr, Dez 15, 2006 2:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Blitze!

Ich bin mit meinem sokoban clone fertig und nun möchte ich etwas neues machen.
Ich will mein Sokoban auf Bomberman umprogrammieren, doch ich habe da ein kleines problem.

Die Bewegund von sokoban war feld für feld. Er hat immer getestet ob das nächste feld frei ist. Nun, bei bomberman soll er aber frei laufen können, aber wie kontroliere ich nun ob er gegen eine wand läuft?

Mit kollision werdet ihr sagen aber dann müsste ich ja für jeden block eine kollisonsabfrage machen gibt es nicht einen schöneren weg?

Die leveldaten, also wo wände sind sind in einem dim feld.

Danke für eure tips im vorraus.

Bob

BeitragFr, Dez 15, 2006 2:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
wenn doch die Daten der Wände in einem Dim Feld sind, und du die Position vom Bomberman hast weist du doch schon alles was du brasuchst.


If MeineMap(Bombermann\x,Bombermann\y) = Wand then Kollision.

Benutze die Positionsdaten deiner Figur im Array. Fertig.
 

DebbieDanger

BeitragFr, Dez 15, 2006 3:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon aber ich habe nur den startpunkt der wände soll ich jetzt die gesamte größe der wände in ein dim schreiben?

Danke erstmal.

DerHase

BeitragFr, Dez 15, 2006 3:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Prüfe einfach die 9 Felder die um den Spieler rum sind. Das kannst Du dann weiter optimieren, indem Du nur in die Richtung prüfst in die sich der Spieler bewegt. Hier ein kleiner >>>Ansatz<<<.
Play Satyr!
 

DebbieDanger

BeitragFr, Dez 15, 2006 3:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich werde damit mal rumspielen, ich poste nochmal wenn ich es nicht geschafft habe.


-Debbie
 

bruce85

BeitragFr, Dez 15, 2006 3:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
du meinst doch bestimmt pixel für pixel bewegen, oder?
wenn ja, dann könntest du das z.B. so machen:

Wenn deine Tiles z.B. 32*32 Pixel gross sind, dann benutze halt noch eine Variable z.B. px die halt immer bis 32 Pixel hoch zählen wenn du die spielfigur bewegst und wenn px >= 32 dann wird z.B. Feld X um eins erhöhet und px wieder auf 0 gesetzt.
So kannste prüfen auf welches Feld der Spieler dann gerade ist.
Beispiel:

Code: [AUSKLAPPEN]
;spieler nach rechts bewegen
if keydown(205) then
  ;wenn feld_x+1 frei ist, dann führe weiter aus
  if spielfeld(feld_x+1,feld_y) = 0 then
    px=px+2
    spieler_x=spieler_x+2
    if px >= 32 then
      feld_x=feld_x+1
      px=0
    endif
  endif
endif


MfG Andreas
AMD Athlon(tm) II X2 250, 8 GB DDR, MSI MSI 770-C45, GeForce GTS 250
 

DebbieDanger

BeitragFr, Dez 15, 2006 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch eine interessante variante, danke ich werde alles mal ausprobieren.

So ich habe nun also die Spalte und Zeile gefunden indem ich x und y durch 32 geteilt habe.
Nun mache ich eine abfrage:
wenn rechts gedrückt und level§(spielerzeile+1,spielerspalte) <>"M" [mauer] dann bewege spieler drei pixel nach rechts.

Das klappt auch er geht genau bis zur wand Razz
allerdings klappt es nicht für links.

Wenn ich nach links laufe stopt er schon 2 felder vor der wand.


Hier der Code, bitte um hilfe:
Code: [AUSKLAPPEN]
; bomber3.BB
Graphics 640,480
SetBuffer BackBuffer()
Global timer = CreateTimer(10)
Global sound1 = LoadSound("soundfx20.wav")
Global sound2 = LoadSound("soundfx11.wav")
Global kiste = LoadImage("Kiste.jpg")
Global kistez = LoadImage("Kistez.jpg")
Global mauer = LoadImage("mauer.jpg")
Global ziele = LoadImage("ziel.jpg")
Global leer = LoadImage("leer.jpg")
Global spieler = LoadImage("spieler.bmp")
; Level von Festplatte lesen

Dim Level$(15,20)
Dim LevelBackup$(15,20)
Global zielfelder
Global imziel
Global Zeile
Global Spalte
spielerx=192
spielery=100

leveldatei = ReadFile("sokoban.dat")
For Zeile= 0 To 14
 A$ = ReadLine(leveldatei)
 For Spalte=0 To 19
  B$ = Mid$(A$,Spalte+1,1)
  Level$(Zeile,Spalte) = B$
  LevelBackup$(Zeile, Spalte) = Level$(Zeile,Spalte)
  If LevelBackup$(Zeile, Spalte) = "S" Then LevelBackUp$(Zeile, Spalte) = " "
  If LevelBackup$(Zeile, Spalte) = "K" Then LevelBackUp$(Zeile, Spalte) = " "
  If Level$(Zeile,Spalte) = "Z" Then ZielFelder = ZielFelder + 1
 Next
Next
CloseFile leveldatei




Repeat
spielerspalte=(spielerx/32)
spielerzeile=(spielery/32)

; Level zeichnen

imziel=0
 For Zeile=0 To 14
  For Spalte=0 To 19
   Select Level$(Zeile,Spalte)
    Case "M" ; Mauer
     DrawImage mauer, Spalte*32, Zeile*32
    Case " " ; frei
     DrawImage leer, Spalte*32, Zeile*32
    Case "K" ; Kiste
     If LevelBackup$(Zeile, Spalte) = "Z" Then
      ImZiel = ImZiel + 1
      DrawImage kistez, Spalte*32, Zeile*32
     Else
      DrawImage kiste, Spalte*32, Zeile*32
     EndIf
    Case "Z" ; Zielfeld
     DrawImage ziele, Spalte*32, Zeile*32

   End Select
  Next
 Next

 If KeyDown(205) And level$(spielerspalte+1,spielerzeile)<>"M" Then spielerx = spielerx + 3

If KeyDown(203) And level$(spielerspalte,spielerzeile-1)<>"M" Then spielerx = spielerx - 3

  If KeyDown(200)  And level$(spielerspalte,spielerzeile-1)<>"M" Then spielery = spielery - 3
   If KeyDown(208)  And level$(spielerspalte,spielerzeile+1) <>"M"Then spielery = spielery + 3


DrawImage spieler,spielerx,spielery
Text 200,200,spielerspalte

 Flip
 
 WaitTimer(timer)
Until KeyHit(1)
End



EDIT:
oh ich habe zwei variablen falsch benannt, son mist naja jetzt geht er nach unten und oben aber er geht immer nach links zwei felder zu kurz.

Soll ich einfach -2 schreiben oder was?
Aber warum macht er das?
-Debbie
  • Zuletzt bearbeitet von DebbieDanger am Mo, Dez 18, 2006 3:50, insgesamt 2-mal bearbeitet
 

DebbieDanger

BeitragMo, Dez 18, 2006 3:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh durch edit springt die nachtricht nicht nach oben?

Ok dann eben so:
UP

Sorry for doubleposting

BladeRunner

Moderator

BeitragMo, Dez 18, 2006 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Glunsch, genau deshalb ist doppelposten nicht erlaubt - zum pushen.
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
 

DebbieDanger

BeitragDi, Dez 19, 2006 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal eine bessere version aber der feler exestiert immernoch.

Code: [AUSKLAPPEN]
; bomber3.BB
Graphics 640,480
SetBuffer BackBuffer()
Global timer = CreateTimer(10)
Global sound1 = LoadSound("soundfx20.wav")
Global sound2 = LoadSound("soundfx11.wav")
Global kiste = LoadImage("Kiste.jpg")
Global kistez = LoadImage("Kistez.jpg")
Global mauer = LoadImage("mauer.jpg")
Global ziele = LoadImage("ziel.jpg")
Global leer = LoadImage("leer.jpg")
Global spieler = LoadImage("spieler.bmp")
; Level von Festplatte lesen

Dim Level$(15,20)
Dim LevelBackup$(15,20)
Global zielfelder
Global imziel
Global Zeile
Global Spalte
spielerx=192
spielery=100

leveldatei = ReadFile("sokoban.dat")
For Zeile= 0 To 14
 A$ = ReadLine(leveldatei)
 For Spalte=0 To 19
  B$ = Mid$(A$,Spalte+1,1)
  Level$(Zeile,Spalte) = B$
  LevelBackup$(Zeile, Spalte) = Level$(Zeile,Spalte)
  If LevelBackup$(Zeile, Spalte) = "S" Then LevelBackUp$(Zeile, Spalte) = " "
  If LevelBackup$(Zeile, Spalte) = "K" Then LevelBackUp$(Zeile, Spalte) = " "
  If Level$(Zeile,Spalte) = "Z" Then ZielFelder = ZielFelder + 1
 Next
Next
CloseFile leveldatei




Repeat
spielerspalte=(spielerx/32)
spielerzeile=(spielery/32)

; Level zeichnen

imziel=0
 For Zeile=0 To 14
  For Spalte=0 To 19
   Select Level$(Zeile,Spalte)
    Case "M" ; Mauer
     DrawImage mauer, Spalte*32, Zeile*32
    Case " " ; frei
     DrawImage leer, Spalte*32, Zeile*32
    Case "K" ; Kiste
     If LevelBackup$(Zeile, Spalte) = "Z" Then
      ImZiel = ImZiel + 1
      DrawImage kistez, Spalte*32, Zeile*32
     Else
      DrawImage kiste, Spalte*32, Zeile*32
     EndIf
    Case "Z" ; Zielfeld
     DrawImage ziele, Spalte*32, Zeile*32

   End Select
  Next
 Next

 If KeyDown(205) And level$(spielerspalte+1,spielerzeile)<>"M" Then spielerx = spielerx + 3

If KeyDown(203) And level$(spielerspalte-1,spielerzeile)<>"M" Then spielerx = spielerx - 3

  If KeyDown(200)  And level$(spielerspalte,spielerzeile-1)<>"M" Then spielery = spielery - 3
   If KeyDown(208)  And level$(spielerspalte,spielerzeile+1) <>"M"Then spielery = spielery + 3


DrawImage spieler,spielerx,spielery
Text 200,200,spielerspalte
Text 200,220,spielerzeile
Text (spielerspalte)*32,spielerzeile*32,"h"
Text 200,240,level$(spielerspalte,spielerzeile)
 Flip
 
 WaitTimer(timer)
Until KeyHit(1)
End
 

Beatenvoy

BeitragMi, Dez 20, 2006 0:12
Antworten mit Zitat
Benutzer-Profile anzeigen
dann schalt mal dein Hirn an, und überlege!
Und hör auf deinen Thread hier so doof zu pushen!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group