Kollisionsfrage

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bloxel93

Betreff: Kollisionsfrage

BeitragMo, Apr 30, 2012 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitzbasic community,
Ich habe vor kurzem angefangen programmieren zu lernen und wollte dies mit blitzbasic tun. Ich beschäftige mich noch nich lange damit deswegen habt bitte nachsicht Smile
Jedenfalls ist mein Problem folgendes(2D-Game): Ich habe einen Spieler(eine kugel) den man frei auf dem screen bewegen kann. Hinzu habe ich ein objekt eingebaut (ein stein) und es mit einer for schleife mehrfach auf dem screen (immer zufällig) verteilt. Nun habe ich eine kollision mit diesem objekt eingebaut das wenn der Spieler mit dem Objekt kollidiert es die gleiche geschwindigkeit hat und in die gleiche richtung geht wie der Spieler. Dies geschieht mit allen objekten die zufällig verteilt sind und ich kann auch mehrere gleichzeitig verschieben und nun wollte ich fragen wie ich es schaffe dass nur das erste objekt das ich berühre bewegt wird und währenddessen die anderen objekte nicht mehr bewegt werden können bzw dass diese dann eine art wand sind also man kann nicht durch sie durch und auch nicht bewegen.

Hier ist der Code wie er derzeitig ist:
Code: [AUSKLAPPEN]
;----[Grundbau]----

Global xmax=1100,ymax=760
Global frametimer=CreateTimer(60)
Graphics xmax,ymax,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
ClsColor 70,100,160

;----[Graphiken]----

Global    Spieler=LoadImage("Graphiken\Kreis.bmp")
MidHandle Spieler
MaskImage Spieler,255,255,255

Global    Stein  =LoadImage("Graphiken\Stein.bmp")
MidHandle Stein
MaskImage Stein  ,255,255,255

;----[Variablen]----

Global xBewegung
Global yBewegung
Global xSp#       =xmax/2; X-Position des Spielers
Global ySp#       =ymax/2; Y-Postiion des Spielers

;----[Types]----
Type Position
   Field nr  ; Objekt Nummer
   Field xSt ; X-Position des Steins
   Field ySt ; Y-Position des Steins
End Type 

For S=0 To 3
   Steine.Position      = New Position
   Steine\xSt          = Rnd(0,1000)
   Steine\ySt           = Rnd(0,500)
Next 
   
   

;----[Hauptschleife]----


Repeat
   WaitTimer frametimer


   ;---[Kollision]---
   
       ;--[Kollision mit Stein]--
      DrawImage Spieler,xSp,ySp
   
      For Steine.Position= Each Position
      DrawImage Stein,Steine\xSt,Steine\ySt
         
            If ImagesCollide (Spieler,xSp,ySp,0,Stein,Steine\xSt,Steine\ySt,0) Then
               Text 10, 50, "kollision"
               Steine\xSt=Steine\xSt+xbewegung
               Steine\ySt=Steine\ySt+ybewegung
            
               If Steine\xSt<xmax-xmax+17 Then
                  Steine\xSt=xmax-xmax+17
                  xSp=Steine\xSt+31     
               EndIf
               If Steine\xSt>xmax-17 Then
                  Steine\xSt=xmax-17
                  xSp=Steine\xSt-31
               EndIf
               If Steine\ySt<ymax-ymax+17 Then
                  Steine\ySt=ymax-ymax+17
                  ySp=Steine\ySt+31
               EndIf
               If Steine\ySt>ymax-17 Then
                  Steine\ySt=ymax-17
                  ySp=Steine\ySt-31
               EndIf
            EndIf 
      
      Next
      ;--[Kollision mit Stein]--
      
      
      ;--[Kollision mit Rahmen]--
      If xSp<xmax-xmax+12.5 Then
         xsP=xmax-xmax+12.5
      EndIf
      If xSp>xmax-12.5 Then
         xSp=xmax-12.5
      EndIf
      If ySp<ymax-ymax+12.5 Then
         ySp=ymax-ymax+12.5
      EndIf
      If ySp>ymax-12.5 Then
         ySp=ymax-12.5
      EndIf
      ;--[Kollision mit Rahmen]--
   
   ;---[Kollision]---

 
   ;---[Bewegung]---
   xbewegung = 0
   ybewegung = 0
   If KeyDown(203) Then ; pfeiltaste links
      xBewegung=-3
      xSp=xSp+xBewegung
   EndIf
             
   If KeyDown(205) Then ; pfeiltaste rechts
      xBewegung=3
      xSp=xSp+xBewegung
   EndIf
               
   If KeyDown(200) Then ; pfeiltaste oben
      yBewegung=-3
      ySp=ySp+yBewegung
   EndIf   
         
   If KeyDown(208) Then ; pfeiltaste unten
      yBewegung=3
      ySp=ySp+yBewegung
   EndIf                 
   
   Text 10,10, "y1Bewegung:"+yBewegung
   Text 10,25, "x2Bewegung:"+xBewegung
   ;---[Bewegung]---
                       
   Flip
   Cls
 
   Until KeyHit(1)
End


Danke in voraus für jede hilfreiche Antwort
Gruß Bloxel

Xeres

Moderator

BeitragMo, Apr 30, 2012 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Willkommen.
Du möchtest, dass die Steine aneinander hängen bleiben? Du müsstest den vom Spieler bewegten Stein auf Kollision mit jedem anderen Stein testen und dann nur bewegen, wenn nichts im weg ist. Das ginge sehr viel einfacher mit einer Tilemap anstatt frei beweglicher Objekte.

Generelle Hinweise:
"ymax-ymax" ist immer 0, da kannst du einiges weg kürzen.
Einen timer benutzt du schon, jetzt solltest du nur noch Flip(0) benutzen.
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

BeitragMo, Apr 30, 2012 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...hp?t=38505

Da geht es um Kollision mit Stacheln. Ist ungefähr das Gleiche wie bei deinem Problem

Mfg. Addi
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62
 

Bloxel93

BeitragMo, Apr 30, 2012 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah also das mit der tilemap werde ich mir mal angucken aber das mit den linien schneiden ist auch sehr hilfreich im anderen thread ...nach sowas hatte ich auch gesucht nur was mache ich wenn mein Spieler kein viereck is also keine eindeutige seite besitzt ?...ich glaub ich wüsste schon was also dass man das bild was man steuern kann in eine durchsichtige Box sozusagen steckt(also das man trotzdem den hintergrund sieht auch wenn das von der Quadratfläche eingeschlossen wird) wie es auch bei vielen anderen spielen ist halt ne hitbox ... gibts dafür n speziellen befehl ?
Danke aufjedenfall schonmal
 

Bloxel93

BeitragMo, Apr 30, 2012 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ehm könntest du nochma genau sagen was du mit tilemaps meinst ? ich hab den begriff an sich noch nicht gehört ^^ hab da grad iwie was mit arrays gelesen find nich wirklich viel. Hast du vll einen Link der mir erklärt was du meinst ? wäre echt nett

Johannes´

BeitragMo, Apr 30, 2012 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst in einem Bild eine Farbe als transparent setzen, normalerweise sollte dies ganz schwarz sein (dazu: MaskImage, den Befehl benutzt du ja schon). Diese Farbe wird dann nicht angezeigt, trotzdem kannst du die unsichtbaren Bildränder als Kollisionsränder benutzen.
Ein guter Befehl zum Überprüfen dieser Kollisionsart bei einem Kollisionskasten wäre ImagesOverlap.
Zu der Tilemap liefert dir die Suche hier im Forum sicherlich Ergebnisse, ansonsten Google: http://lmgtfy.com/?q=Tilemap.
  • Zuletzt bearbeitet von Johannes´ am Mo, Apr 30, 2012 19:14, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, Apr 30, 2012 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal die Robsite RPG-Tutorials an siehe da. Die sind schon älter, aber sollten Kollisions behandeln.

Wie du dein Programm strukturieren solltest, hängt davon ab, was du erreichen willst...

Bitte gewöhne dir an, Beiträge zu editieren, doppelposting ist nicht erwünscht - danke.
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

BeitragMo, Apr 30, 2012 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal ein Youtube Tutorial gefunden was mir vor 3 Jahren auch sehr geholfen hat:

http://www.youtube.com/watch?v...ure=relmfu

Thema ist da, das Schreiben eines Jump & Runs.
Hoffe du kannst ausreichend Englisch Very Happy

Ps:
Soll keine Werbung sein Exclamation
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62
 

Bloxel93

BeitragDo, Mai 03, 2012 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten ham mir aufjedenfall geholfen... ich arbeite nicht so oft am programmieren deswegen kommt der post so spät ... das tutorial scheint eine gute hilfe zu sein auch wenn ich es öfters hören muss ums richtig zu verstehen Smile kann ich falls ich noch eine frage hab weiterhin in diesen thread schreiben ? oder sollte ich dann n neuen aufmachen ? ach und sorry dass ich nicht editiert hab mach ich absofort

Xeres

Moderator

BeitragDo, Mai 03, 2012 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Solange es noch der gleiche Code ist, spricht nichts dagegen, die Fragen dazu hier zu sammeln.
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)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group