Kollision mit Gebäuden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Plankton
Beiträge: 48
Registriert: 20.04.2005 19:48

Kollision mit Gebäuden

Beitrag 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
Wer andern eine Grube gräbt...
...hat ein Grubengrabgerät

http://plankton.hat-gar-keine-homepage.de/
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Plankton
Beiträge: 48
Registriert: 20.04.2005 19:48

Re: Kollision mit Gebäuden

Beitrag von Plankton »

Vielen Dank, aber
Plankton hat geschrieben: PS: Wenn nicht unbedingt nötig bitte keinen Code posten sondern das prinzip erklären
Wer andern eine Grube gräbt...
...hat ein Grubengrabgerät

http://plankton.hat-gar-keine-homepage.de/
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Kollision mit Gebäuden

Beitrag 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 :?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Plankton
Beiträge: 48
Registriert: 20.04.2005 19:48

Beitrag von Plankton »

Ich hätte es auch verstanden wenn du keinen Code gepostet hättest
Wer andern eine Grube gräbt...
...hat ein Grubengrabgerät

http://plankton.hat-gar-keine-homepage.de/
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag 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?
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

Gut, das mach ich nämlich ^^
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Antworten