Seite 1 von 1

Kollision mit Gebäuden

Verfasst: 30.06.2005 14:47
von Plankton
Hi Leute,
Also ich möchte das meine figur nicht durch gebäude hindurchlaufen kann.
(top-down perspektive)
If SpriteCollision(f1,x1,y1,f2,x2,y2)
Und weiter weiß ich nicht.
Wie könnte ich das machen?

PS: Wenn nicht unbedingt nötig bitte keinen Code posten sondern das prinzip erklären

Verfasst: 30.06.2005 14:55
von DarkDragon
Naja, also zuerst mal prüfst du ja ob ne taste gedrückt wurde, dass sich der Spieler bewegen soll und wenn da nix im weg steht lässte ihn also an die neue Position laufen.

Wenn der spieler also 1 hoch laufen soll:

Code: Alles auswählen

If SpriteCollision(#PLAYER, X, Y-1, #JEDES_MÖGLICHE_GEBÄUDE, GebäudeX, GebäudeY) ;Wenn keine kollision ENTSTEHT...
  Y - 1 ;soll der Spieler wirklich dahin laufen
EndIf
Ich habe das schon einigen erklärt:

Code: Alles auswählen

InitSprite()
InitKeyboard()

Procedure Collision(x.f, y.f)
  Result = 0
  Restore Map
  For my=0 To 17
    For mx=0 To 24
      
      a.b
      Read a
      If a = 1
        If SpriteCollision(0, Int(x), Int(y), 1, mx*32, my*32)
          Result = 1
          Break 2
        EndIf
      EndIf
      
    Next
  Next
  ProcedureReturn Result
EndProcedure

OpenScreen(800, 600, 32, "Test")

CreateSprite(0, 32, 32)
StartDrawing(SpriteOutput(0))
Box(0, 0, 32, 32, RGB(255, 0, 0))
StopDrawing()

CreateSprite(1, 32, 32)
StartDrawing(SpriteOutput(1))
Box(0, 0, 32, 32, RGB(0, 0, 255))
StopDrawing()

#SPEED = 1.5

X.f = 800/2
Y.f = 600/2

SetFrameRate(20)

Repeat
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Up)
    If Collision(X, Y-#SPEED) = 0
      Y - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    If Collision(X, Y+#SPEED) = 0
      Y + #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    If Collision(X-#SPEED, Y) = 0
      X - #SPEED
    EndIf
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    If Collision(X+#SPEED, Y) = 0
      X + #SPEED
    EndIf
  EndIf
  
  If KeyboardPushed(#PB_Key_Escape)
    Quit = 1
  EndIf
  
  ClearScreen(0, 0, 0)
  DisplaySprite(1, X, Y)
  
  Restore Map
  For my=0 To 17
    For mx=0 To 24
      
      a.b
      Read a
      If a = 1
        DisplaySprite(0, mx*32, my*32)
      EndIf
      
    Next
  Next
  FlipBuffers()
  
  Delay(10)
Until Quit = 1
End

DataSection
  Map:
  Data.b 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
  Data.b 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
EndDataSection

Re: Kollision mit Gebäuden

Verfasst: 30.06.2005 15:09
von Plankton
Vielen Dank, aber
Plankton hat geschrieben: PS: Wenn nicht unbedingt nötig bitte keinen Code posten sondern das prinzip erklären

Re: Kollision mit Gebäuden

Verfasst: 30.06.2005 15:14
von DarkDragon
Plankton hat geschrieben:Vielen Dank, aber
Plankton hat geschrieben: PS: Wenn nicht unbedingt nötig bitte keinen Code posten sondern das prinzip erklären
:? Ich habs doch auch erklärt :?

Verfasst: 30.06.2005 15:29
von Plankton
Ich hätte es auch verstanden wenn du keinen Code gepostet hättest

Verfasst: 30.06.2005 15:43
von Batze
Plankton hat geschrieben:Ich hätte es auch verstanden wenn du keinen Code gepostet hättest
Es soll aber auch Leute geben die später im Forum danach suchen und dann ein par mehr Informationen wollen. :wink:

Verfasst: 30.06.2005 18:44
von benpicco
Geht sowas nicht auch mit einem 2d Array?
Also ich hab bis jetzt immer diesen benutzt, was ist den parktischer und/oder schneller?

Verfasst: 30.06.2005 19:04
von DarkDragon
benpicco hat geschrieben:Geht sowas nicht auch mit einem 2d Array?
Also ich hab bis jetzt immer diesen benutzt, was ist den parktischer und/oder schneller?
Natürlich geht das auch so ;) . Praktischer ist ein 2D Array, wenn du die daten aus dateien lädst.

Verfasst: 30.06.2005 21:29
von benpicco
Gut, das mach ich nämlich ^^