Kollision will einfach nicht?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

scratsch

Betreff: Kollision will einfach nicht?

BeitragSo, Mai 18, 2008 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier habe ich den Quellcode mal hochgeladen:
https://www.blitzforum.de/upload/code.php?show=927

Ich bitte zu entschuldigen das der Code etwas unübersichtlich ist ^^

Hier nochmal die wichtigsten Teile:

Code: [AUSKLAPPEN]
         Type zobjekt
         
         Global zlist:TList = New TList
            Field empty
              Field zobjekt_x
               Field zobjekt_Y
         Global alist:TList = New TList
            Field player_x
            Field player_y
         End Type


und hier:

Code: [AUSKLAPPEN]
         'Schuss verarbeiten
         For i:zobjekt = EachIn zobjekt.zlist
         'i.zobjekt_Y = i.zobjekt_Y - 1      
            
            'Hier wird der Schuss bewegt
            i.zobjekt_Y = i.zobjekt_Y - 2
            'Hier wird der schuss gezeichnet
            DrawImage snipe, i.zobjekt_x, i.zobjekt_Y
            
            'Schuss löschen wenn er aus dem Bildschirmrand ist
            If i.zobjekt_Y < 0 Then
               zobjekt.zlist.Remove (i)
            End If
            
            'Falls Schuss mit Gegner Kolidiert
            If ImagesCollide (snipe, i.zobjekt_x, i.zobjekt_Y, 0, enemy, i.player_x, i.player_y, 0) Then
               zobjekt.zlist.Remove (i)
            End If
            
         Next



Die Kollision wird einfach ignoriert funktioniert nicht?

Mfg.
User posted image I like to play... with you!
http://weenie-games.6x.to

scratsch

BeitragDi, Mai 20, 2008 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab es heute nochmal versucht aber ich komme einfach nicht auf die Lösung?
User posted image I like to play... with you!
http://weenie-games.6x.to

Suco-X

Betreff: ......

BeitragDi, Mai 20, 2008 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Direkt schonmal vorweg: Schau dir doch bitte die Samples an, besonders die kleinen Spiele die dabei sind. Dein Code ist nämlich eine einzige Irrfahrt und du bist offensichtlich neu auf dem Gebiet, zumindestens was BlitzMax angeht.
Also mal los:
Du hast einen Type namens zobjekt und du benutzt diesen für die Schüsse und für die Feinde. Jedesmal wenn du einen Schuss oder einen Gegner erstellst, reservierst du sinnlos Speicherplatz in Form von zwei Integer-Variablen, da der Feind die Variablen zobjekt_x/y nicht benutzt und der Schuss die Variablen player_x/y nicht.
Jetzt gehst du die Schüsse durch und willst eine Kollision überprüfen. Aber player_x/y ist bei den Schüssen doch immer = 0.
Also schau dir erstmal die Beispiele an, ansonsten kann ich dir gerne weiterhelfen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

Dreamora

BeitragDi, Mai 20, 2008 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd empfehlen erst mal den code gescheit zu strukturieren.

Was hat da player und zobjekt drin zu suchen?
Entweder es ist ein player oder es ist ein Schuss.

->

3 Klassen:
Code: [AUSKLAPPEN]

Type TEntity
  ' enthält position, rotation, skalierung und bild und gegebenenfalls frame
  global _entityList:TList = new TList
  method move(x:int,y:int) abstract
  method draw() abstract
  method update() abstract
  method onCollision(other:TEntity) abstract
end type

Type TActor extends TEntity
  ' implementiert die obigen methoden
  global _actorList:TList = new TList
  field _actorLink:TLink
  field _entityLink:TLink

  field _health:int = 100

  method new()
    _actorLink = _actorList.addLast( self )
    _entityLink = TEntity._entityList.addLast( self )
  end method
  method drawCollision(layers:int)
    collideimage(_image,_x,_y,_frame,0, layers,self) ' schreibt uns in den collision layer inkl objekt referenz!
  end method

  method onCollision(other:TEntity)
    ' folgende lösung liese sich via reflection auf ein select reduzieren!
    if TBullet(other)
      self._health :- TBullet(other).getDamage()
    endif
    if self._health < 0
      ' wir wurden zerstört!!
      Print "Jetzt hats mich zerlegt ;-)"
      _actorLink.remove
      _entityLink.remove
    endif
  end method
end Type

type TBullet extends TEntity
  ' implementiert die TEntity methoden
  global _bulletList:TList = new TList
  field _bulletLink:TLink
  field _entityLink:TLink

  field _damage:int = 30

  method new()
    _bulletLink = _bulletList.addLast( self )
    _entityLink = TEntity._entityList.addLast( self )
  end method


  function testCollision(layers:int)
    ' nutzt die collideimage funktion um gegen einen bestimmten Layer bzw. eine layer kombination (layers)
    ' zu testen ob eine kollision besteht. Wenn ja, wird beim gefundenen objekt die onCollision aufgerufen.
    ' Annahme hier ist, das bullets net mit bullets kollidieren können sondern nur mit TActor
    local result:object[]
    for local bullet:TBullet = eachin _bulletList
      result = collideimage(_image,_x,_y,_frame,layers,layers,0)
      for local actor:TActor = eachin result
        actor.onCollision(bullet)
        ' nun müssen wir auch gehen
        print "Bullet zerstört"
        _bulletLink.remove
        _entityLink.remove
        exit
      next
    next
  end function
end Type


Die implementation der move draw etc hab ich mir gespart, denke die kannst du selbst Smile
Falls nicht, dann hast du vermutlich Assaris tutorials noch nicht gemacht, was so sehr zu empfehlen ist, wie es erwartet wird von neuen usern da es als grundwissen vorausgesetzt wird.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

scratsch

BeitragDi, Mai 20, 2008 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal für die Antworten!
Ich denke einfach mein Problem ist es mich in die OO-Phae ein zudenken weil ich es einfach nicht so gewöhnt bin!?
Nunja, ich hab nen schönes Tutorial gefunden aber eines verstehe ich bei den Types nicht, einmal kann ich so wie ich oben arbeiten und zum anderen kann ich Methoden nutzen - ich denke mal es ist jedem freigestellt was er nun nutzen will richtig?

Zu meinem Problem, ich verstehe trotz alledem immer noch nicht wieso ich nicht ein einfaches ImagesCollide zum Überprüfen / Abfragen anwenden kann!?

Achja, hier nochmal ein Code den ich nach geschrieben habe wollte ma Fragen ob der so ok ist:
Code: [AUSKLAPPEN]
               Type tank
                  Field x:Float, y:Float
                  Field speed:Float
               End Type
               
               Graphics 800, 600
               
               Global Tanklist:TList = CreateList ()     'Erstellt eine List für den Tank
               
               For i = 0 To 10
                  Local NewTank:tank  'Deklariert eine Variable für den Tank
                  NewTank = New tank  'Erstellt den mit der eben erstellten Variable deklarierten Tank
                  NewTank.x = Rand (0, 700)
                  NewTank.y = Rand (0, 500)
                  ListAddLast Tanklist, NewTank ' Fügt den eben erstellen Tank zur Liste hinzu
               Next
               
               Repeat
               Flip
               Cls
               
               For T:tank = EachIn Tanklist
                  DrawRect (T.x, T.y, 5, 5)
               Next
               
               
               Until KeyDown (KEY_ESCAPE)
               End


Mfg.

/Edit: Kann ich für die Kollision vielleicht CollideImage benutzen, würde das klappen?
User posted image I like to play... with you!
http://weenie-games.6x.to

Suco-X

Betreff: .....

BeitragDi, Mai 20, 2008 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
ImagesCollide ist wegen der leichteren Anwendung wohl erstmal besser für dich geeignet. Die Befehle funktionieren auch einwandfrei, nur dein Code ist halt falsch.
mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

scratsch

BeitragDi, Mai 20, 2008 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Und nochmal eins großes Danke!
Ich hab alles nochmal überarbeitet und mir wirklich Mühe gegeben nur das CollideImage will einfach nicht funktionierten, störrisches ding wie eine Frau man muss es nur richtig anpacken nur ich weiß nicht wie Very Happy

Ich hab mich in ICQ auch schon mit Vertex beraten doch selbst der wusste keine Antwort, bin mir aber sicher du weißt eine hier mal mein code welcher diesmal hoffentlich Ordentlicher ist ^^
(Ich hab mir wirklich viel mühe gegeben!)

Code: [AUSKLAPPEN]


            Graphics 800, 600

            Type Gegner
               Field x:Float, y:Float
            End Type
            
            Type Schuss
               Field x:Float, y:Float
            End Type
            
            
            Global Gegnerlist:TList = CreateList ()
            Global Schusslist:TList = CreateList ()
         
               SetMaskColor 255, 0, 0
               enemy = LoadImage ("images/enemy.png")
               player = LoadImage ("images/player.png")
               shot = LoadImage ("images/snipe.png")
               
               
            Repeat
            Flip
            Cls
            
            If Gegnerlist.Count() < 5 Then
            Local NewGegner:Gegner
            NewGegner = New Gegner
            NewGegner.x = Rand(80, 700)
            NewGegner.y = Rand(40, 200)
            ListAddLast Gegnerlist, NewGegner
            End If
            
            For G:Gegner = EachIn Gegnerlist
               CollideImage(enemy, g.x, g.y, 0, 0, 2)
               DrawImage enemy, g.x, g.y
            Next
            
            If KeyDown (KEY_SPACE) Then
               Local NewSchuss:Schuss
               NewSchuss = New Schuss
               NewSchuss.x = MouseX()
               NewSchuss.y = MouseY()
               ListAddLast Schusslist, NewSchuss
            End If
            
            For S:Schuss = EachIn Schusslist
               CollideImage(shot, s.x, s.y, 0, 0, 2)
               DrawImage shot, s.x, s.y
               S.y = S.y - 2
            Next
            
            'DebugStop()
            For temp:Object = EachIn CollideImage(enemy, g.x, g.y, 0, 0, 2)
            End
            Next
            
            Until KeyDown (KEY_ESCAPE)
            End
            


Danke schonmal für alles was bisher!
User posted image I like to play... with you!
http://weenie-games.6x.to

Suco-X

Betreff: .....

BeitragDi, Mai 20, 2008 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
So kannst du es mit ImagesCollide machen:

Code: [AUSKLAPPEN]

For S:Schuss = EachIn Schusslist
   For G:Gegner = EachIn Gegnerlist
      If ImagesCollide(shot, S.x, S.y, 0, enemy, g.x, g.y, 0)
         Print "SUDHHUSDHUHUSDDHUSHUSD"
      EndIf
   Next
Next



So mit CollideIMage:

Code: [AUSKLAPPEN]

ResetCollisions(1)

For S:Schuss = EachIn Schusslist
   CollideImage(shot, s.x, s.y, 0, 0, 1)
Next

For G:Gegner = EachIn Gegnerlist
   If CollideImage(enemy, g.x, g.y, 0, 1, 0)
      Print "BUUM"
   EndIf
Next


Bei Version zwei schreibst du halt erstmal die Schussdaten in die Schreibmaske und bei den Gegnern überprüfst du die Kollisionsmaske (In die die Schüsse zuvor geschrieben wurden) auf Treffer.

Getestet habe ich das jetzt nicht (Da du ja nicht auf die Idee kommst die Bilder hochzuladen) aber Theoretisch ist das auf jedenfall richtig.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

scratsch

BeitragDi, Mai 20, 2008 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
@Suco-X:
Danke!!! TAUSEND DANKE!!! Du glaubst nicht wie lange ich jetzt schon daran sitze!
Danek danke danke!


Kannst du mir vielleicht per PN mal deine ICQ-Nummer zukommen lassen?

Danke!
Super Support hier einfach Klasse!
User posted image I like to play... with you!
http://weenie-games.6x.to
 

Dreamora

BeitragDi, Mai 20, 2008 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wir bieten keinen Support. Das Board ist rein community betrieben und wird in keinster weise von BRL, dem macher von Blitz, unterstützt.

Und wie erwähnt, Assaris Tutorial (siehe sticky oben hier im board bzw. http://www.2dgamecreators.com/blitzmax/resources/ ) werden als bekannt und verstanden angesehen.


Wenn das zuviel Arbeit ist, beschäftige dich lieber mit etwas einfacherem.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Suco-X

Betreff: ....

BeitragMi, Mai 21, 2008 4:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:

@Suco-X:
Danke!!! TAUSEND DANKE!!! Du glaubst nicht wie lange ich jetzt schon daran sitze!
Danek danke danke!


Kannst du mir vielleicht per PN mal deine ICQ-Nummer zukommen lassen?

Danke!
Super Support hier einfach Klasse!


Kein Problem. ICQ habe ich nicht. Aber hier, bei den beiliegenden Beispielen und in diversen Tutorials findest du ausreichend Hilfe.



Zitat:

Wir bieten keinen Support. Das Board ist rein community betrieben und wird in keinster weise von BRL, dem macher von Blitz, unterstützt.

Ich denke er meint mit Support auch einfach nur die Unterstützung hier im Forum.

Zitat:

Und wie erwähnt, Assaris Tutorial (siehe sticky oben hier im board bzw. http://www.2dgamecreators.com/blitzmax/resources/ ) werden als bekannt und verstanden angesehen.

Wenn das zuviel Arbeit ist, beschäftige dich lieber mit etwas einfacherem.

Falls du es noch nicht gesehen hast, er versucht gerade sich mit etwas einfacherem zu beschäftigen. Du laberst ihm nur ständig mit Lektion 4 dazwischen, obwohl er nicht einmal Lektion 1-3 kennt und verstanden hat. Wie wär es also wenn du von deinem hohen Ross steigst und mal wieder ein Lächeln auflegst?
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
 

Dreamora

BeitragMi, Mai 21, 2008 8:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich laber net mit Lektion 4 rein, ich weise darauf hin das es erwartetetes Grundwissen ist.
Wer ImagesCollide nutzt kanns noch nicht gelesen haben, denn sonst weiss man das ImagesCollide nichts anderes macht als CollideImage nur mit dem massiven Problem das der Layer die ganze Zeit gelöscht wird -> massiver Überaufwand sobald man auch nur schon 2 Objekte gegen das gleiche Originalobjekt testet ... und im Fall hier werden alle Bullets dagegen getestet.
Insofern finde ich es durchaus wichtig, dass man auf die Tutorials aufmerksam macht, zumindest bis jeder neue BM User sie von selbst liest, da man besser daran tut das richtige zu lernen wenn er neu zu BM kommt, statt schrott zu lernen der nur für die 1:1 Codeconversion von Blitz3D/BlitzPlus integriert wurde und sich dann später schwierig damit zu tun es anzupassen an die richtige Nutzung.

Sobald ich nicht mehr Lächel, ist ein Thread für gewöhnlich weg. Da der Thread jedoch dem Lernwert des Users und künftiger User dient, habe ich keinen Grund nicht zu lächeln.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group