Kollisionen!
Übersicht

SmellGreenBetreff: Kollisionen! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: 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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] For i = 1 To stachelcount Step 1
"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:
stachel(i) = LoadImage("stachel_klein.bmp") Next 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
SmellGreen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke,
Xeres, deinen Vorschlag hab ich mal angenommen und verändert! Und Tennisball deine Idee probiere ich mal aus! Klingt gut ![]() 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? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sicher, siehe Include![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
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]
32 ist die Größe deines Tiles Wenn du ein fast fertiges Beispiel haben willst, kann ich dir eines geben ![]() |
||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
SmellGreen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
SmellGreen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok ich guck mal ![]() Aber ich wollte auch keinen Code ich wollte einen Ansatz! Egal Danke. |
||
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group