Problem mit 2-Dimensionalem Feld und Kollision
Übersicht

![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
weil ichs halt schnell im blitz3d gecoded hab, das kann er ja weglassen
ah , seh schon da geht auch nur graphics. das wusste ich gar nicht, danke |
||
![]() |
CrowSmithehemals "Fleisch" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also...
ich werd das dann jetzt ausprobieren. Aber eines verstehe ich noch nicht, und zwar dashier: Code: [AUSKLAPPEN] Overlap = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,b-2,H-2) If Overlap > 0 Then ;jetzt gerne die Seiten: OverlapVonUnten = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H+H-2,B-2,1) OverlapVonOben = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,B-2,1) OverlapVonRechts = ImageRectOverlap (Ball, BallX,BallY,x*B+B-2,y*H,1,H-2) OverlapVonLinks = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H+H,1,H-2) ;trick alles zusammenzählen und BINÄR GesamtOverlap=OverlapVonUnten+OverlapVonOben*2+OverlapVonLinks*4+OverlapVonUnten*8 Select Case GesamtOverlap Case 1 ;von unter Case 2 ;von oben Case 4 ;von links Case 5 ;von links oben gleichzeitig !!!! ;... End Select Also. ich habe ja ein Bild mit 6 Steinen, jede zelle meines Feldes soll einen Frame zugewiesen bekommen. Sind die Cases jetzt die Frames? Wenn ja, wieso fehlt die 3 ?? Und wenn ja, wie wird das ausgelesen? Und wenn nicht... was hat es dann mit dem ganzen Source oben auf sich? Wie gesagt, da blicke ich nicht durch. Der Rest ist mir relativ klar. EDIT: Achso und was hat es mit B%=70 H%=30 auf sich? Weil das ja mit in die overlap Abfrage eingebunden ist. |
||
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald) Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012) Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit) Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] ) Notebook 3: Clevo X7200 (KOMMT BALD =] ) Desktop: (KOMMT BALD =] ) |
![]() |
CrowSmithehemals "Fleisch" |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also habe jetzt deinen Source(MIDIMASTER) auf meine Variablen umgeschrieben und ausprobiert, jedoch ohne Erfolg.
Im Gegenteil, bei diesem Source trat sogar ein Fehler auf, den ich bei meinem schon ausgebaut hatte. Fazit: funktioniert immernoch nicht. Mensch, es muss doch schonmal jemand einen Breakout Klon programmiert haben... wie haben die denn bitte alle die Kollision mit den Blöcken geschrieben? Das ist so ziemlich die letzte große Hürde die ich überwinden muss, alles Andere ist Kleinkram... Ich habe mich im Forum schon nach entsprechenden Threads umgesehen aber ich finde kaum passende. Ich bitte weiterhin um Hilfe... trotzdem danke MidiMaster MfG, euer Fleisch |
||
Worklogs: TotalWar2D
Wbsites: Privat / Entwicklerstudio / Gewerbe (Folgen bald) Smartphones: Samsung Galaxy S I9000 / Samsung Galaxy S2 I9100 / Samsung Galaxy S3 (Kommt 2012) Notebook 1: HP Pavillion DV6700 (AMD 64 X2 TL-60 @ 2.00GHz, 4GB DDR3 1333MHz, Nvidia GeFroce 8400M GS, Win Vista Home Premium 32Bit) Notebook 2: HP Pavillion DV6t Quad Edition (KOMMT BALD =] ) Notebook 3: Clevo X7200 (KOMMT BALD =] ) Desktop: (KOMMT BALD =] ) |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Fleisch hat Folgendes geschrieben: Also. ich habe ja ein Bild mit 6 Steinen, jede zelle meines Feldes soll einen Frame zugewiesen bekommen.
Sind die Cases jetzt die Frames? Wenn ja, wieso fehlt die 3 ?? Und wenn ja, wie wird das ausgelesen? Achso und was hat es mit B%=70 H%=30 auf sich? Aalso, letzte Frage (ausnahmsweise) zuerst: B und H sind die Breite bzw. Höhe der Blöcke. Deinen ersten Satz allerdings verstehe ich nicht ganz... Du hast ein 2Dimensionales Array, in dem gespeichert wird, ob an den jeweiligen Stellen Blöcke vorhanden sind. Es ist also sinnvoll, 0 und 1 zu speichern. 0 steht dafür, dass dort kein Block ist, bei 1 existiert ein Block. Du musst jetzt für jeden Block prüfen (das geht mit zwei verschachtelten For-Next-Schleifen, um jedes Feld des Arrays zu Bearbeiten), ob er a) überhaupt existiert und b), wenn er denn existiert, ob er mit dem Ball kollidiert. Letzteres tut der Code, es ist allerdings leicht versteckt formuliert: Code: [AUSKLAPPEN] Overlap = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,b-2,H-2) If Overlap > 0 Then ;jetzt gerne die Seiten: OverlapVonUnten = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H+H-2,B-2,1) OverlapVonOben = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,B-2,1) OverlapVonRechts = ImageRectOverlap (Ball, BallX,BallY,x*B+B-2,y*H,1,H-2) OverlapVonLinks = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H+H,1,H-2) ;trick alles zusammenzählen und BINÄR GesamtOverlap=OverlapVonUnten+OverlapVonOben*2+OverlapVonLinks*4+OverlapVonRechts*8 In der ersten Zeile wird geprüft, ob der Block an der Position x,y mit dem Ball kollidiert. Ist dies der Fall, wird weiter geprüft, mit welcher Seite der Block kollidiert ist. Dies ist der komplexere Teil. Hier wird das alles binär gespeichert (Hilfestellung: Dual-/Binärsystem). Dies hat den Vorteil, dass direkt auf alle verschiedenen Kollisionsarten reagiert werden kann. Ich möchte jetzt den Aufbau der Variable GesamtOverlap erklären: Wichtig sind die letzten 4 Ziffern, wenn wir uns die Variable im Dualsystem ansehen. Kollidiert der Ball beispielsweise nur von links, ist die Variable "GesamtOverlap" gleich 4, was einem Aufbau von 0100 entspricht ("OverlapVonLinks*4"). Kollidiert der Ball mit dem Block oben/links, ist der Aufbau 0101 ("OverlapVonUnten+OverlapVonLinks*4"). Dies ist in der Form möglich, da der Befehl mageRectOverlap eine sog. Bool-Variable zurückliefert. Mit "*2", "*4" und "*8" "bewegen" wir die 1 bzw. 0 lediglich um 1,2 bzw. 3 Stellen nach links. In der Select-Case-Abfrage wird nun nur geprüft, welche Seite kollidiert und darauf reagiert. Code: [AUSKLAPPEN] Select Case GesamtOverlap
Case 1 ;von unten Case 2 ;von oben Case 4 ;von links Case 8 ;von rechts Case 5 ;von links unten gleichzeitig (Dualsystem-Ansicht: 0101) Case 6 ;von links oben gleichzeitig (Dualsystem-Ansicht: 0110) ;... End Select Die drei ist nicht möglich, da dies einer Kollision von oben/unten entspräche (0011). Ich habe mir erlaubt, ein paar Flüchtigkeitsfehler im Code zu beseitigen. ![]() Ich hoffe ferner, dass ich helfen konnte. ![]() EDIT und P.S.: Fleisch hat Folgendes geschrieben: Mensch, es muss doch schonmal jemand einen Breakout Klon programmiert haben... wie haben die denn bitte alle die Kollision mit den Blöcken geschrieben?
Ich habe so etwas schon programmiert, allerdings mit einem ganz anderen Ansatz zur Kollision (also nicht mit den "Image..."-Befehlen oder so). ![]() |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
MIDIMASTERs Code hat einen Fehler drin. Er hat dort vergessen, beim der Berechnung der Gesamtkollision die Bewegung nach rechts zu beachten...
(n-halbleiters Nachricht kam, während ich schrieb... Da sind aber bei der Kollisionsprüfung immer noch Fehler drin...) Im Moment habe ich keine Lösung gesehen, die beachtet, was gemacht wird, wenn der Ball genau zwischen zwei Balken kollidiert. Für den Ball sollte diese Kollision wie die Kollision mit einer der beiden aneinandergereihten Seiten sein. Die Wirkung der beiden sich gegenüberstehenden, parallelen Kollisionsseiten heben sich auf. Vor der Kollisionsschleife: Code: [AUSKLAPPEN] Local SeitenKollision=0;rechts:+;links:-
Local HoehenKollision=0;oben:+;unten:- In der Kollisionsschleife: Code: [AUSKLAPPEN] If Block(x,y)=1 Then
;erst mal checken, ob ein Stein überhaupt berührt wird Overlap= ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,b,H) If overlap>0 Then ;jetzt die Seiten: OverlapVonUnten = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H+H-1,B,1);Kollision mit der unteren Kante? OverlapVonOben = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,B,1);Kollision mit der oberen Kante? OverlapVonRechts= ImageRectOverlap (Ball, BallX,BallY,x*B+B-1,y*H,1,H);Kollision mit der rechten Kante? OverlapVonLinks = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,1,H);Kollision mit der linken Kante? Seitenkollision=SeitenKollision+OverlapVonRechts-OverlapVonLinks HoehenKollision=HoehenKollision+OverlapVonOben-OverlapVonUnten DebugLog " overlap mit " + x + " " +y Block(x,y)=0 EndIf EndIf Nach der Kollisionsschleife kommt die Veränderung der Ballbewegung: Code: [AUSKLAPPEN] If SeitenKollision>0,rechts If HoehenKollision>0;oben ;Berechnungen für eine Kollision mit der oberen, rechten Ecke ElseIf HoehenKollision<0;unten ;untere, rechte Ecke Else ;rechte Kante EndIf ElseIf SeitenKollision<0;links If HoehenKollision>0;oben ;obere, linke Ecke ElseIf HoehenKollision<0;unten ;untere, linke Ecke Else ;linke Kante EndIf Else If HoehenKollision>0;oben ;obere Kante ElseIf HoehenKollision<0;unten ;untere Kante ; Else ;Hier gibt es keine Aktion, da es auch keine (vernünftige) Kollision gab. EndIf EndIf Ich hoffe, dass dies dir hilft. mfG mpmxyz P.S.: Nein, ich habe noch nie ein Breakout programmiert... ![]() |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mpmxyz hat Folgendes geschrieben: (n-halbleiters Nachricht kam, während ich schrieb... Da sind aber bei der Kollisionsprüfung immer noch Fehler drin...)
Inwiefern ein Fehler? Mir ist das gerade nicht klar (ich habe halt den Teil mit dem Overlap übernommen ohne zu überprüfen, ob er stimmt; ich ging einfach davon aus)... |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] OverlapVonLinks = ImageRectOverlap (Ball, BallX,BallY,x*B,y*H+H,1,H-2)
Das "+H" muss dort weg. Sonst wird die Kante vom Rechteck darunter geprüft. Außerdem frage ich mich, wie er auf das "H-2" bzw. "B-2" gekommen ist.. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
also das erste breakout, dass ich dir geschrieben habe, läuft doch oder? Alle Steine werden ordnungsgemäß entfernt und das mit den paar 20 Zeilen Code.
Du mußt natürlich Deine Breite und Höhe der Steine einsetzen bei B und H. Bei Dir wären das 20 und 40, wobei mir das seltsam vorkommt: sind deine Steine wirklich 20 Breit und 40 hoch? Meistens sind Steine doch breiter als hoch, oder? check das nochmal! Ich umgeh solche Fehler, indem ich die Werte nicht direkt als 20 in die die Abfragen schreibe, sondern Breite=40 definiere und später überall "Breite" schreiben kann, wo ich das benötige. Und manchmal verwendest Du den Arraynamen "Block()", manchmal "Anordnung()". Was gilt den nun. Vielleicht liegst ja dran, dass Du immer noch von beidem ein bißchen drin hast. Leg Dich hier mal fest! (Block%() ist besser) Du kannst mir mal den ganzen Code posten. den zweiten Code, habe ich nur als Anregung in pseudo code gesetzt um dir den Wweg zu zeigen, wie du die Kollisionen von verschiedenen Seiten unterscheiden könntest. Da fehlen natürlich noch etliche Zeilen. Aber insgesamt wird es so viel kürzer. Zunächst solltest Du aber erst mal ohne diesen Teil nur das korrekte Verschwinden der Steine hinbekommen. Haste mal den WaitKey() eingefügt, damit es schrittweise abläuft? @nHalbleiter: Danke für die Korrektur, ich hatte es tatsächlich nicht ausprobiert, sondern einfach direkt in das Forum geschrieben. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group