Problem mit 2-Dimensionalem Feld und Kollision

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Midimaster

BeitragSo, Okt 25, 2009 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

CrowSmith

ehemals "Fleisch"

BeitragSo, Okt 25, 2009 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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 =] )

CrowSmith

ehemals "Fleisch"

BeitragSo, Okt 25, 2009 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 25, 2009 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

Ich hoffe ferner, dass ich helfen konnte. Smile

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). Wink
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

BeitragSo, Okt 25, 2009 23:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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... Wink
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

n-Halbleiter

BeitragSo, Okt 25, 2009 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 25, 2009 23:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 26, 2009 2:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group