Map aus *.dat geladen, wie mache ich die Collision(Rect´s)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Schranz0r

Betreff: Map aus *.dat geladen, wie mache ich die Collision(Rect´s)

BeitragSo, Sep 03, 2006 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute

Hab mal wieder ein Problem.
Und zwar:
Ich habe eine Map geladen, 0 = nichts, 1 ist Spielstein, 2 ist wand
Habe den werten ein Rect zugweisen, klapt wunderbar.
Nur bekomme ich jetzt keine "collision" (RectsOverlap) mehr hin,
da ist null peil hat wie ich jetzt den x und y wert angeben soll?!!?

Hier die datei: LADE MICH RUNTER

für welche die es evtl schon am code erkennen:

BlitzBasic: [AUSKLAPPEN]


AppTitle "Tretze"
Graphics 800,600,0,2
SetBuffer BackBuffer()

Global PlayerX = 375
Global PlayerY = 275

Dim Level(39,29)

neu=ReadFile("levels\lvl1.dat")
For y=0 To 29
For x=0 To 39
Level(x,y)=ReadLine(neu)
Next
Next
CloseFile datei



Repeat
Cls


For y=0 To 29
For x=0 To 39




Select Level(x,y)
Case 0
;nichts
Case 1 ;----------- Spielstein
Color 255,255,255
Rect x*20, y*20, 20, 20, 1
Case 2 ;----------- WAND
Color 83,83,83
Rect x*20, y*20, 20, 20, 1
End Select

If RectsOverlap (x, y, 20, 20, PlayerX, 560 , 50, 10) Then Color 255,255,255 : Text 100,100,"HAB WAS"

Next
Next
Color 255,0,0

If KeyDown(200) Then
PlayerY = PlayerY - 5
ElseIf KeyDown(208) Then
PlayerY = PlayerY + 5
EndIf

If KeyDown(203) Then
PlayerX = PlayerX - 5
ElseIf KeyDown(205) Then
PlayerX = PlayerX + 5
EndIf




Rect PlayerX, 560, 50, 10, 1 ;Spieler unten
Rect 760, PlayerY, 10, 50, 1

Flip

Until KeyHit(1)

End


Danke schonmal für die Hilfe[/code]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Smily

BeitragSo, Sep 03, 2006 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre es möglich, dass du mal den Inhalt der lvl1.dat postest?
Bin hier gerade an einem anderen Rechner und hier gibts kein Winrar.

Wieso arbeitest du eigentlich mit Readline?
Ich würde Bytes verwenden, das ist Platzsparender.

mfg, Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Schranz0r

BeitragSo, Sep 03, 2006 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Nagut wennst dir hilft:

Die lvl1.dat : Lad mich
Einfach im Wordpad oder so öffnen.

Wie geht das mit Bytes, ich kenn nur die mit Readline...
Aber ist ja in dem fall egal, ich will ja nur eine Kollision zwischen dem Rect, und meinen Player Rect!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Smily

BeitragSo, Sep 03, 2006 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Der fehler liegt hier:

RectsOverlap (x, y, 20, 20, PlayerX, 560 , 50, 10)

Die Rects berühren sich einfach nicht.

X geht von 0 - 29
Y geht von 0 - 39

Also kann die Abfrage höchstens

RectsOverlap (29, 39, 20, 20, PlayerX, 560 , 50, 10)

sein

Da liegt der Fehler.

mfg, Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Schranz0r

BeitragSo, Sep 03, 2006 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Smily0412 hat Folgendes geschrieben:
Der fehler liegt hier:

RectsOverlap (x, y, 20, 20, PlayerX, 560 , 50, 10)

Die Rects berühren sich einfach nicht.

X geht von 0 - 29
Y geht von 0 - 39

Also kann die Abfrage höchstens

RectsOverlap (29, 39, 20, 20, PlayerX, 560 , 50, 10)

sein

Da liegt der Fehler.




mfg, Smily0412


Ist mir schon klar, das da der fehler ist.
Aber es muss doch gehen zu prüfen, ob ein Rect berührt worden ist

ein Wand -rect ist 20x20

Siehe ersten Post:
Schranz0r hat Folgendes geschrieben:

Nur bekomme ich jetzt keine "collision" (RectsOverlap) mehr hin,
da ist null peil hab wie ich jetzt den x und y wert angeben soll?!!?
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Spikespine

BeitragSo, Sep 03, 2006 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
bei rectsoverlap solltest du die x und y werte auch mit 20 multiplizieren.
Also

If RECTSOVERLAP (x*20, y*20, 20, 20, PlayerX, 560 , 50, 10) Then ...
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax

Smily

BeitragSo, Sep 03, 2006 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst die Rects so Prüfen, wie du sie auch Zeichnest.

Und du zeichnest die Rects doch nicht an der x und y position

dann würde der Befehl zum zeichen ja
Rect x, y, 20, 20, 1
sein

Erkennst du jetzt deinen Fehler?

Edit Spikespine war schneller Sad
Schade und ich hoffte, ich kann Schranz0r noch dazu bringen, dass er seinen Fehler selbst erkennt
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Schranz0r

BeitragSo, Sep 03, 2006 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Smily0412 hat Folgendes geschrieben:
Du musst die Rects so Prüfen, wie du sie auch Zeichnest.

Und du zeichnest die Rects doch nicht an der x und y position

dann würde der Befehl zum zeichen ja
Rect x, y, 20, 20, 1
sein

Erkennst du jetzt deinen Fehler?

Edit Spikespine war schneller Sad
Schade und ich hoffte, ich kann Schranz0r noch dazu bringen, dass er seinen Fehler selbst erkennt


Falsch^^ , bzw Halbrichtig

So muss ich es in die Case 2 schreiben:



Code: [AUSKLAPPEN]

      If RECTSOVERLAP (x*20, y*20, 20, 20, PlayerX-5, 560 , 50, 10) And KeyDown(203) Then PlayerX = PlayerX +5


da ich einen Lauf von immer 5 habe musste ich bei der abfrage erst PlayerX -5 und danach PlayerX+5 machen, damit der genau bündig abschliesst .....Komisch
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Hummelpups

BeitragMo, Sep 04, 2006 2:27
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hi

der Code ist ja urschrecklich eingerückt. Übernimmt das Code Gadget
hier keine Tabs oder rückst du einfach immer mit der Leertaste ein?
Dafür wurde Tab erfunden ^^.

Diese verschwendung an Performance via der Keydownbefehle ist nicht
nur unnötig, sondern bringt auch richtig schöne unordnung nahezu Chaos
mit rein.

Wenn du es dann versuchst mit Keyhit zu machen, bei was für einem
Spiel auch immer, wirst du dich wundern warum dein Code icht funktioniert
wenn du mehrmals in einer Schleife Keyhit abfragst, naja genug geschwafelt,
ab zum Code.

Code: [AUSKLAPPEN]
Apptitle "Tretze"
Graphics 800,600,0,2
Setbuffer Backbuffer()

Global PlayerX = 375
Global PlayerY = 275

Dim Level(39,29)

datei=ReadFile("lvl1.dat")
If datei Then
   For y=0 To 29
   For x=0 To 39
      Level(x,y)=ReadLine(datei)
   Next
   Next
   CloseFile datei
Else
   RuntimeError "Datei konnte nicht geladen werden"
End If

Repeat
   Cls
      
      ;Controls
      If KeyDown(200) Then
         PlayerY = PlayerY - 5
      ElseIf KeyDown(208) Then
         PlayerY = PlayerY + 5
      EndIf

      If KeyDown(203) Then
            oldx=playerx
         PlayerX = PlayerX - 5
      ElseIf KeyDown(205) Then
            oldx=playerx
         PlayerX = PlayerX + 5
      EndIf

      For y=0 To 29
      For x=0 To 39
      
         Select Level(x,y)
         Case 0      ;nichts
            
          Case 1       ;Spielstein
            Color 255,255,255
            Rect x*20, y*20, 20, 20, 1
         
         Case 2 ;   WAND
            Color 83,83,83
              Rect x*20, y*20, 20, 20, 1
            
            ;Kollision SpielerX      
            If RectsOverlap (x*20, y*20, 20, 20, PlayerX, 560 , 50, 10) Then
               ;Color 255,255,255
               ;Text 100,100,"HAB WAS"
               playerx=oldx
            End If
            
         End Select
             
      
      Next
      Next
      
      Color 255,0,0
      Rect PlayerX, 560, 50, 10, 1 ;Spieler unten
      Rect 760, PlayerY, 10, 50, 1

   Flip
Until KeyHit(1)

EndGraphics
End


Was der Smiley gesagt hat war vollkommen richtig, deklarier das nicht
als falsch, is ja schrecklich.

Das deine Kollision nicht funktionierte, würde man ganz leicht raus sehen
können wenn der Coide strukturierter gewesen wäre.
Man sollte sich immer überlegen ob man erst alles berechnet und dann
zeichnet oder umgekehrt. Da kann es zu fiesen Fehlern kommen.
(Ausnahmen b d R)

Anstatt das Movement komplett zu sperren würde ich auf die gute
alte old_x old_y Methode zurück greifen. Funzt wie immer wunderbar.

EDIT: Hach ja ^^ der Code in deinem Avatar is auch lustig X)

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group