Kollision will einfach nicht?
Übersicht

![]() |
scratschBetreff: Kollision will einfach nicht? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit 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! |
||
User posted image I like to play... with you!
http://weenie-games.6x.to |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group