Kollisionen!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

SmellGreen

Betreff: Kollisionen!

BeitragDo, Apr 12, 2012 14:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
Ich bin neu in BlitzBasic und programmiere momentan so ein bisschen rum...
Momentan probiere ich so ein mini! jump and run also nur springen, laufen und es gibt auch nur normale blöcke und stacheln an denen man stirbt. Ich habe auch schon ein bisschen Erfahrung im programmieren mit Visual Basic .Net.
Doch ich habe eine Frage zu den Kollisionen. Ich falle zwar nicht durch blöcke durch und kann auf denen laufen, aber ich kann auch von der Seite und von unten in den Block hinein. Kann man den irgendwie abfragen, von welcher Seite die Kollision kommt?

Ich hoffe ihr könnt mir helfen!
MFG
Lukas

BladeRunner

Moderator

BeitragDo, Apr 12, 2012 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Zeig uns doch mal deine Code wie Du ihn bislang hast, dann kann man eher Tipps und Tricks geben.
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
 

SmellGreen

BeitragDo, Apr 12, 2012 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
; Einstellungen

Global xmax=1280, ymax=1024
Graphics xmax, ymax, 32, 2 ; Spielfenster Zeichnen
SetBuffer BackBuffer()
Global frametimer = CreateTimer(60)





; Playervariablen

Global player = LoadImage("flubbihut_klein.bmp")
 playerx = 10
 playery = 465
 isjump = False
 canjump = True
 jumpcount = 0
 jumpcountmax = 50
 jumpheight = 100
 Gravity = 2
 ;gravitydelay = 1000
 applyGravity = True
 Global Deaths = 0



;Stachelvariablen
 stachelcount = 2
 stacheldifferenz = 160
Dim stachel(stachelcount)
Dim stachelx(stachelcount)
Dim stachely(stachelcount)

; Blockvariablen
 blockcount = 10
 blockdifferenz = 0
Dim block(blockcount)
Dim blockx(blockcount)
Dim blocky(blockcount)


For i = 1 To blockcount Step 1
block(i) = LoadImage("Block_klein.bmp")
Next

For i = 1 To blockcount Step 1
blockx(i) = blockdifferenz
blockdifferenz = blockdifferenz + 32
If i = 5 Then
blockdifferenz = blockdifferenz + 64
EndIf   
Next

For i = 1 To blockcount Step 1
blocky(i) = 500
Next

For i = 1 To stachelcount Step 1
stachel(i) = LoadImage("stachel_klein.bmp")
Next

For i = 1 To stachelcount Step 1
stachelx(i) = stacheldifferenz
stacheldifferenz = stacheldifferenz + 32
Next

For i = 1 To stachelcount Step 1
stachely(i) = 500
Next


;Transparenzen

MaskImage player,255,0,255
For i = 1 To stachelcount Step 1
MaskImage stachel(i),255,0,255
Next








; Spielschleife

Repeat
WaitTimer (frametimer)
Text 0, 0,"Super Block Jump Alpha 0.1"
Text 1200,10, "Tode:"
Text 1250,10, Deaths



;Drawing
DrawImage player, playerx,playery ; Zeichnet Player
For i = 1 To blockcount Step 1
DrawImage block(i), blockx(i),blocky(i) ; Zeichnet Blöcke
Next

For i = 1 To stachelcount Step 1
DrawImage stachel(i), stachelx(i), stachely(i) ;zeichnet Stacheln
Next




;Kollisionsabfrage
For i = 1 To blockcount Step 1
If ImagesCollide(player, playerx, playery,0, block(i), blockx(i), blocky(i),0) Then


applyGravity = False
canjump = True

Exit

Else
applyGravity = True
canjump = False

EndIf
Next

For i = 1 To stachelcount Step 1
If ImagesCollide(player, playerx, playery,0, stachel(i), stachelx(i), stachely(i),0) Then
playerx = 10
playery = 465
Deaths = Deaths + 1
EndIf
Next




;Eingabe-Abfrage
If KeyDown(30) Then playerx = playerx - 1
EndIf
If KeyDown(32) Then playerx = playerx + 1
If KeyHit(57) And canjump = True Then
isjump = True
EndIf






; Jump-Routine

If isjump = True Then
applyGravity = False
jumpcount = jumpcount + 1
playery = playery - 2
canjump = False

If jumpcount = jumpcountmax Then
isjump = False
applyGravity = True
jumpcount = 0
EndIf
EndIf
If applyGravity = True Then playery = playery + Gravity ;fragt ab ob man Springt sonst Schwerkraft













;Endbereich

Flip ;Buffer wechseln
Cls ;Unsichtbares löschen (Bildschirm von Unnötigen Sachen reinigen)
Until KeyHit(1)
End


So das ist er. Sind wahrscheinlich noch viele Fehler drin, aber aus Fehlern lernt man ja und immerhin funktioniert das ganze Wink
Ich weiß, dass man ImagesCollide nicht benutzen sollte, da fehler bei bestimmten Grafikkarten auftauchen können. Aber da ich es eh nicht veröffentlichen will und es bei mir funktioniert, reicht es zum rumprobieren!
 

SmellGreen

BeitragDo, Apr 12, 2012 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Dazu sei gesagt, dass die grafiken jeweils 32x32 Pixel groß sind. Und noch eine Frage, bei mir funktioniert z.b. playerx += 1 nicht. Geht soetwas bei BlitzBasic nicht?

Tennisball

BeitragDo, Apr 12, 2012 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Ich würde es so machen, dass du dem Spieler und jedem Block quasi je 4 Linien zuteilst, mit denen die Kollision geprüft wird. Der Spieler, und auch Blöcke, haben dann an der Oberseite eine Linie, an der linken Seite eine, etc. Für eine Kollision musst du dann für jeden Block prüfen, ob die Linie an der Oberseite des Blocks mit der Unterseite des Spielers kollidiert, die linke Seite des Blocks mit der rechten des Spielers etc. Je nachdem, ob und welche Linien miteinander kollidieren, weißt du "aus welcher Richtung die Kollision kommt".

Eine Funktion für die Kollisionsabfrage von Linien findest du hier: https://www.blitzforum.de/foru...hp?t=30063

Veranschaulichung:
user posted image
S ist der Spieler.
Du musst immer nur die gleichfarbigen Linien miteinander auf Kollision prüfen, denn die linke Seite des Spielers wird wohl nie die linke Seite eines Blocks berühren.

Zitat:
Und noch eine Frage, bei mir funktioniert z.b. playerx += 1 nicht. Geht soetwas bei BlitzBasic nicht?


Nein, das geht nicht.

Gruß,
Tennisball

Xeres

Moderator

BeitragDo, Apr 12, 2012 14:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
For i = 1 To stachelcount Step 1
stachel(i) = LoadImage("stachel_klein.bmp")
Next
"Step 1" könntest du weglassen, +1 ist Standartmäßig ein Zählschritt. Viel wichtiger aber: LoadImage belegt immer wieder neuen Speicher mit dem gleichen Bild. Ein mal Laden reicht voll aus. Entweder du sparst dir das Array für Bilder, oder du weist einfach das Bild zu:
Code: [AUSKLAPPEN]
Stachel_IMG = LoadImage("stachel_klein.bmp")
For i = 1 To stachelcount
stachel(i) = Stachel_IMG
Next


Für den Umgang mit Blöcken solltest du dich mal nach "Tilemap" umsehen, Robsite RPG Tutorials wären da sicher auch hilfreich. Siehe auch "Tipps für Neueinsteiger".

Edit: Bitte Editiere deine Beiträge nach, Doppelposts sind nicht erwünscht.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

SmellGreen

BeitragDo, Apr 12, 2012 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke,
Xeres, deinen Vorschlag hab ich mal angenommen und verändert!
Und Tennisball deine Idee probiere ich mal aus! Klingt gut Smile
Ok Doppelposts werde ich vermeiden
Noch eine Frage:
Kann ich manche Sachen, in andere Dateien verlagern? Also z.b. die Variablen in der Datei Variablen.bb und der Rest in spiel.bb oder so?

Xeres

Moderator

BeitragDo, Apr 12, 2012 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicher, siehe Include. Immer alles hübsch konsistent Benennen und Funktionen benutzen, damit es übersichtlich bleibt.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Addi

BeitragDo, Apr 12, 2012 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dir vorschlagen, die Map in nur eine Dim-Map zu packen.
Das ist übersichtlicher und benötigt weniger Code (und es ist einfacher einen Mapeditor zu schreiben).

Für die Collision würde ich dir empfehlen eine Pixelgenaue (oder war es Tilegenaue) Collision zu nehmen.
Das geht dann z.B. so:

BlitzBasic: [AUSKLAPPEN]

Global PlayerX
Global PlayerY

Global Layer = 1 ;Collisions Layer
Const Stachel = 1;Wert der Stacheln in der Dim-Map

;Wenn der Spieler mit den Füßen einen Stachel berührt ...
If Map(PlayerX/32,PlayerY/32+1, Layer) = Stachel Then
;...
End If


32 ist die Größe deines Tiles

Wenn du ein fast fertiges Beispiel haben willst, kann ich dir eines geben Wink
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62
 

SmellGreen

BeitragDo, Apr 12, 2012 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke,
wollte zuerst einen "World Editor" machen, aber mir viel einfach kein Ansatz ein. Kannst du mir da vieleicht auf die Sprünge helfen?
Und das was du mit der Dim-Map meintest versteh ich nicht so ganz.
If Map(PlayerX/32,PlayerY/32+1, Layer) = Stachel Then
und wieso y+1?
Sry bin erst Anfänger Smile

Xeres

Moderator

BeitragDo, Apr 12, 2012 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Arbeite ein Tutorial durch. Davon hast du mehr, als jeden Schritt einzeln nach zu fragen. Wenn dann noch etwas unklar ist, sind wir immer noch da.

Aus fertigem Code lernt man wenig (auch wenn alle immer was anderes behaupten).
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

SmellGreen

BeitragDo, Apr 12, 2012 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich guck mal Very Happy
Aber ich wollte auch keinen Code ich wollte einen Ansatz!
Egal Danke.

Addi

BeitragDo, Apr 12, 2012 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit Y+1 ist variabel, es kommt darauf an wie groß dein Spieler ist.

Ich bin Jetz von einem Spieler der auch 32*32 groß ist ausgegangen
und damit du auch wirklich überprüfst was unter dem Spieler ist,
musst du, da der Nullpunkt des Bildes standartgemäß bei 0,0 ist, der Fuß aber bei 0,32 also am unteren Rand des Spielers, PlayerY/32+1 machen.
Du kannst aber natürlich auch (PlayerY+32)/32 machen.

Hoffe es ist Verständlich Very Happy

Zum Editor:

Du hast ein leeres Dim-Array.
Nun überprüfst du, auf welchem Feld des Dim-Arrays sich die Maus gerade befindet und besetzt dieses Feld bei Mausklick mit einem Wert
z.B. mit 1.

Du brauchst dann nurnoch ein Tileset und eine Routine, die die Map zeichnet und dann bist du eig. auch fertig.

Edit:
Hab mal was von BladeRunner gefunden
https://www.blitzforum.de/foru...ht=robsite

Unter RPG-Tutorials 1-6 ist meines wissen nach auch ein Beispiel für einen Editor.
 

BIG BUG

BeitragDo, Apr 12, 2012 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Bzgl. Editor:

Du musst das nicht unbedingt selber machen, gibt auch genügend fertige 2D-Editoren.

Ich bin recht frischer Fan von diesem hier:
http://tilestudio.sourceforge.net/

Der Vorteil ist, dass Du das geschriebene Dateiformat selbst bestimmen kannst. Er kann sogar für BlitzMax und B3D direkt Inline-Code mit den Mapdaten generieren.

Oder Du verwendest folgende Konfiguration um simple binäre Maps zu speichern:
Code: [AUSKLAPPEN]
#tileset
#map
#binfile <MapIdentifier>.dat 32
<MapWidth:"32">
<MapHeight:"32">
#mapdata
<TSMidTile>
#end mapdata
#end binfile
#end map
#end tileset


Dieses simple Format kann man dann einfach wie folgt laden:
Code: [AUSKLAPPEN]
Function LoadMap( pMap$ )
   
   Local file, filename$, x, y

   filename$ = "lvl\" + pMap$ + ".dat"
   file = ReadFile( filename$ )
   If Not file Then RuntimeError "File " + filename$ + " not found"
   gMapWidth   = ReadInt(file)
   gMapHeight   = ReadInt(file)
   

   Dim map(gMapWidth, gMapHeight)
   
   For y =  gMapHeight-1 To 0 Step -1
      For x = 0 To gMapWidth-1
   
         map(x,y) = ReadInt(file)

      Next
   Next
   
   CloseFile file

End Function
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group