Problem mit 2-Dimensionalem Feld und Kollision

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

CrowSmith

ehemals "Fleisch"

Betreff: Problem mit 2-Dimensionalem Feld und Kollision

BeitragDo, Okt 22, 2009 1:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.

Bin Anfänger, ein Freund hat mir vor den Ferien Blitz3D gezeigt ich habs mir angeschafft und hab gleich mal losprogrammiert.

Ich arbeite derzeit an meinem Debut-Titel den ich sobald er fertiggestellt ist hier präsentieren will, jedoch stoße ich ab und an auf einige Schwierigkeiten.

Zum Beispiel jetzt.

Ich habe ein zweidimensionales Feld (Dim Anordnung(20,20)) und einen Punkt der mit den einzelnen Zellen dieses Feldes Kollidieren soll. Der Punkt bewegt sich von unten an die Zellen heran und trifft somit zuerst auf die unterste der 20 Zellen (Y).

Nachdem der Punkt eine Zelle "getroffen" hat soll er seine Richtung ändern (das hab ich fertig) und die Zelle soll auf "0" gesetzt werden damit der Punkt dort nicht nochmal Kollidieren kann, sondern erst eine Zelle darüber (Beispiel).

Mein Problem: Der Punkt prallt nicht ab und anstatt dass nur die eine Zelle verschwindet, verschwindet sofort die ganze Spalte, bzw alle Zellen in der Spalte, und das sogar wenn die Y-Koordinate der untersten Zelle noch nicht erreicht ist, nur die X-koordinate.

Ich weiss im Moment einfach nicht weiter, für hilfsbereite User: bitte PM an mich für eine genauere Beschreibung.

Danke, euer Fleisch

TimBo

BeitragDo, Okt 22, 2009 9:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich denke wenn ich das hier schreibe ist das besser als PM, da gerade auch andere Member das dann hier sehen können.
Ich denke dein Problem liegt daran, dass die Kugel ihre "Richtung" nicht ändert.

Am geeignetesten ist bei einem solchen Programm einem Objekt einem X bzw. Y Speed zuzuordnen. Das Objekt wird in jedem Frame um den X bzw. Y Speed versetzt.

Wenn deine Kugel wo trauf trifft (sagen wir auf eine Unterkante) so musst du den Y Speed*(-1) nehmen. Und den X Speed beibehalten

__ <-Kollision
/\ <-Flugrichtung d. Kugel

Lg
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Midimaster

BeitragDo, Okt 22, 2009 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Beobachtung mit dem Erreichen der x-Koordinate könnte darauf hindeuten, dass Deine Kollisionsroutine doch noch nicht wie erwartet funktioniert. Wenn Du Dich in die Kollisionswerkzeuge von Blitz einarbeitest, wird das am Anfang ein wenig mehr Arbeit, dafür ist das Abchecken der Kollisionen 100% perfekt.

Verwende unbedingt die Lösung von TimBo für deinen Ball.

TimBo

BeitragDo, Okt 22, 2009 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

ich denke für dein Problem könnte meine Funktion "LineIntersect" auchganz nützlich sein. Funktionieren tut sie , wie der Befehl line, nur dass man 2 Linien eingib. Anstatt das diese auf den Bildschirm kommen, wird eine 1 oder 0 für Kollision oder nicht Kollision zurückgegeben. Hört sich jetzt nach viel Arbeit an, alles mit dem Befehl LineIntersect abzuchecken, geht aber ;D

Mir fällt gerade keien andere Lösung ein. Außer ImagesCollide ImagesOverlap ImageRectOverlap (diese ganzen Befehle sollen ja verbugt sein)

Edit:
ein weiterer Vorteil: du weißt , je nachdem welche Strecke Kollidiert, ob du den Balken von oben unten oder den seiten getroffen hast Wink

Lg
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Noobody

BeitragDo, Okt 22, 2009 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
TimBo hat Folgendes geschrieben:
Mir fällt gerade keien andere Lösung ein. Außer ImagesCollide ImagesOverlap ImageRectOverlap (diese ganzen Befehle sollen ja verbugt sein)

Ich hörte mal Gerüchte über einen Befehl namens RectsOverlap Wink

Das Programm hört sich hier sehr stark nach Breakout an. Grundsätzlich gehst du so vor, wie von TimBo vorgeschlagen: Für jedes Feld in deinem Array, das auf 1 gesetzt ist, überprüfst du die Kollision (da es ja scheinbar sowieso ungedrehte Rechtecke sind, ist RectsOverlap zu empfehlen). Falls es eine Kollision gab, setzt du das Feld auf 0, multiplizierst die Y-Geschwindigkeit mit -1 (oder halt die X-Geschwindigkeit, wenn der Punkt das Feld von links oder von rechts berührt). Dann verlässt du die Kollisionsschleife, um nicht etwa an Feldergrenzen die Kollision doppelt zu berechnen.

Falls das nicht geht, poste doch mal deinen Code, damit wir uns ein Bild von deinem Problem machen und dir etwaige Fehler zeigen können.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Holzchopf

Meisterpacker

BeitragDo, Okt 22, 2009 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das richtig gesehen habe, geht's hier gar nicht um Blitz3D-Spezifische Probleme, sondern eher um Allgemeines...

~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.

Damit du auch mit der Hilfe von nicht-3Dlern rechnen kannst Wink

mfg
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

CrowSmith

ehemals "Fleisch"

BeitragFr, Okt 23, 2009 0:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das mit dem Ball habe ich nicht mit einer X und einer Y- Geschwindigkeit des Balles sondern mit Winkeln und Cosinus/Sinus gelöst.

Das ist ja auch nicht das Problem, sondern nur, wie ich eine bestimmte Zelle eines Feldes erkenne.

Habe noch getüftelt und dashier ist bisher mein Code für die Kollision:

Code: [AUSKLAPPEN]

;Kollisionssystem Blöcke
For J = 0 To 19
 For K = 0 To 19
  Select Anordnung$(J,K)
   Case "1"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,K*20,J*40,40,20)
     Anordnung$(J,K) = 0
     ;Block(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "2"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,K*20,J*40,40,20)
     Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "3"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,K*20,J*40,40,20)
     Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "4"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,K*20,J*40,40,20)
     Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "5"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,K*20,J*40,40,20)
     Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "6"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,K*20,J*40,40,20)
                       ;(Ball,KoordinateBallX,KoordinateBallY,0,Block(J,0),Block(0,K),40,20)
     Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
  End Select
 Next
Next



Case 1 bis 6 stehen dabei für verschiedene frames aus dem bild wo ich 6 verschiedene Steine drin hab.
und wenn eine Zelle = 0 ist passiert halt garnichts und der ball fliegt normal weiter.

Sofern die jeweilige Zelle des Feldeseinen Wert von 1 bis 6 hat, sollen folgende Aktionen durchgeführt werden:

-Ballwinkel (Ballrichtung) ändern
-Sound ausgeben
-Punkte aufaddieren
-Stein in der Zelle soll verschwinden (das heisst die Zelle soll auf 0 gesetzt werden.)

Sooo... mit dem oben gesehenen Code klappt es EIGENTLICH nur stimmen anscheinend die Koordinaten des Balles nicht, denn es verschwinden da Blöcke, wo der Ball garnicht ist. (Momentan ist es so dass die Y-Koordinate des Balls anscheinend zu hoch und die X-Koordinate des Balls anscheinend zu weit rechts liegen.

Ich habe mir gedacht dass es evtl daran liegen könnte, wie ich das mit den Koordinaten des balls gelöst habe:

Code: [AUSKLAPPEN]

If Ballabgefeuert
 ;Wenn der Ball abgefeuert wurde erhält er hier immer seine neuen Kooordinaten
 KoordinateBallX=KoordinateBallX+Cos(BallWinkel)*GeschwindigkeitBall
 KoordinateBallY=KoordinateBallY-Sin(BallWinkel)*GeschwindigkeitBall
Else
 ;Ansonsten erhält der Ball die Koordinaten des Spielers
 KoordinateBallX=Verschiebung
 KoordinateBallY=GraphicsHeight()-71
EndIf


Naja ich bitte weiterhin um Vorschläge, da das der letzte große Fehler sein sollte, den ich beseitigen muss.
Alles Andere was ich dann noch machen muss ist eigentlich nicht schwer (für mich).

[Bitte: könnte mich auch jemand über Goto/Gosub aufklären? Da ich diese auch verwende (Z.B. um die Levelschleife neuzustarten). Funktioniert aber irgendwie nicht richtig.]


EDIT:

Ähm.. nochmal, es geht nicht drum wie ich die Ballrichtung ändere oder wie ich das mit dem Nullsetzen mache. Für mich ist nur wichtig wie ich die richtige Zelle des Feldes erkenne damit ich den richtigen Stein löschen kann (damit ich die richtige Zelle auf 0 setzen kann).

Und ja, hab vergessen das zu schreiben^^ Es handelt sich bei meinem Debut-Game um einen Breakout Klon.

relentless92

BeitragFr, Okt 23, 2009 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Goto & Gosub sind böse.
Mach ne Function die die Globals neu setzt und bau ne Bedingung in die Hauptschleife ein, a ka

If Spielzuende=1 then
Neustart()
endif

Hat bei mir wunderbar funktioniert. Wink

TimBo

BeitragFr, Okt 23, 2009 1:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

die Ballkordinaten können sich dadurch ergeben, dass sie wirklich anderswo sind.
nehme dazu doch ganz primitiv rect(BallX,BallY,2,2) dann siehst du in etwa wo die Kordinaten sich befinden.
Schau mal , ob die Kordinaten vor oder nach der Kollisionsabfrage neu berechnet werden. Wenn ja, dann berechne erst die neuen Kordinaten , dann mache die Kollision. Wink

Wenn du eine Kollision gefunden hast , dann kannst du aus der ganzen Rutine rausspringen. Nehme dazu exit . Denn der Ball kann theo. pro Frame nur an einen Klotz kommen.

Lg
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

CrowSmith

ehemals "Fleisch"

BeitragFr, Okt 23, 2009 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok werde ich sofort ausprobieren


EDIT:

Ok habe jetzt die Koordinaten (X,Y) des Balles überprüft indem ich ein rect benutzt habe, und die Koordinaten stimmen (bzw sind halt da wo das Bild auch ist, was ja eigentlich klar ist).

Aber es verschwinden halt die Steine an der falschen Stelle... das ist deprimierend...

ich habe schon fast die vermutung dass ich bei der Abfrage der Ballkoordinaten und dem damit verbundenen Nullsetzen der Feld-zellen einen Fehler habe (was Anderes wüsste ich jetzt nicht)...

Die Abfrage findet ihr weiter oben dort habe ich sie schonmal gepostet.

Ich hoffe jemand kann mir weiterhelfen ich weiss nämlich nicht weiter.

Gruß, der Fleisch

Midimaster

BeitragFr, Okt 23, 2009 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
könnte es vielleicht sein, das du die falschen Steine "abschaltest". Ist mir schon mal passiert: K mit J vertauscht:

Anordnung$(J,K) = 0

Anordnung(k,j)=0 ???

wäre einen Versuch wert...

CrowSmith

ehemals "Fleisch"

BeitragFr, Okt 23, 2009 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
überprüfe ich sofort nochmal

EDIT:

Also ich habs nochmal ausführlich überprüft.

War alles korrekt.

Habe einfach mal (um zu sehen was passiert) K und J vertauscht, da war der Effekt noch merkwürdiger
also dass die Blöcke nicht da verschwinden wo sie es sollten UND dass der Ball schon abprallt bevor er einen Block berührt. Allerdings traf der Ball einige wenige male auf einen Stein in der ersten Reihe und der wurde dann auch ordnungsgemäß entfernt...

ich kann mir das beim besten Willen nicht erklären.
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 =] )

Midimaster

BeitragSa, Okt 24, 2009 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
und du hattest auch nur bei Anordnung das J und K vertauscht, gell?



wo wohnst du denn? nur mal wegen des praktikums...

BladeRunner

Moderator

BeitragSa, Okt 24, 2009 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte Dich bitten Deine Signatur ein wenig zu kürzen. Es ist immer blöd wenn die Signatur länger als der Durchschnittspost ist. Du könntest zB deine Interessen in einer Zeile zusammenfassen.
Danke.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

CrowSmith

ehemals "Fleisch"

BeitragSa, Okt 24, 2009 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
und du hattest auch nur bei Anordnung das J und K vertauscht, gell?



wo wohnst du denn? nur mal wegen des praktikums...


Ich wohne in Bedburg(Erft), nähe Köln in NRW.

Ich besuche das Adolf Kolping Berufskolleg in Kerpen-Horrem.

Dort absolviere ich meine Ausbildung (Fachabitur/Fachhochschulreife) zum staatlich geprüften Informationstechnischen Assistenten (Mit dabei ist auch eine Elektriker Ausbildung).


Also das J und das K hatte ich ja überprüft und die sind überall richtig.
Ich habe aber beobachtet dass wenn ich J und K bei der Nullsetzung der jeweiligen Feld-Zelle vertausche, die Blöcke ein wenig "regelmäßiger" oder anders gesagt "richtiger" verschwinden...

klappt aber immernoch nicht so wirklich Sad
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"

BeitragSa, Okt 24, 2009 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe eben nochmal ein von Grundauf anderes Kollisionssystem geschrieben aber das funktioniert aus irgendeinem Grund garnicht. Vielleicht bin ich aber auch nur langsam SO abgekartert dass ich es einfach nicht mehr peil.

Also hier ist das ursprüngliche System:

Code: [AUSKLAPPEN]

;Kollisionssystem Blöcke
For J = 0 To 19
 For K = 0 To 19
  Select Anordnung$(J,K)
   Case "1"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,J*40,K*20,40,20)
    ;if imagerectcollide (Ball,KoordinateBallX,KoordinateBallY,0,Block(J,0),Block(0,K),40,20)
     Anordnung$(K,J) = 0
     ;Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "2"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,J*40,K*20,40,20)
    ;if imagerectcollide (Ball,KoordinateBallX,KoordinateBallY,0,Block(J,0),Block(0,K),40,20)
     Anordnung$(K,J) = 0
     ;Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "3"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,J*40,K*20,40,20)
    ;if imagerectcollide (Ball,KoordinateBallX,KoordinateBallY,0,Block(J,0),Block(0,K),40,20)
     Anordnung$(K,J) = 0
     ;Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "4"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,J*40,K*20,40,20)
    ;if imagerectcollide (Ball,KoordinateBallX,KoordinateBallY,0,Block(J,0),Block(0,K),40,20)
     Anordnung$(K,J) = 0
     ;Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "5"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,J*40,K*20,40,20)
    ;if imagerectcollide (Ball,KoordinateBallX,KoordinateBallY,0,Block(J,0),Block(0,K),40,20)
     Anordnung$(K,J) = 0
     ;Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
   Case "6"
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,J*40,(K*20)+300,40,20)
    ;if imagerectcollide (Ball,KoordinateBallX,KoordinateBallY,0,Block(J,0),Block(0,K),40,20)
     Anordnung$(K,J) = 0
     ;Anordnung$(J,K) = 0
     PlaySound Abprallenblock
     ;Punkte aufaddieren
     Ballwinkel = 270 - Ballwinkel + 90
    EndIf
  End Select
 Next
Next


und hier ist das andere System (direkt zugeschnitten auf oben/unten/links/rechts)

Code: [AUSKLAPPEN]

;Kollisionssystem Blöcke unten
For J1 = 0 To 19
 For K1 = 0 To 19
  For Breite1 = 1 To 40
   If Anordnung$(J,K) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J*40),(K*20),Breite,20)
     Anordnung$(K,J) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next

;Kollisionssystem Blöcke oben
For J2 = 0 To 19
 For K2 = 0 To 19
  For Breite2 = 1 To 40
   If Anordnung$(J,K) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J*40),(K*20),Breite,1)
     Anordnung$(K,J) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next

;Kollision Blöcke links
For J3 = 0 To 19
 For K3 = 0 To 19
  For Hoehe1 = 1 To 20
   If Anordnung$(J,K) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J*40),(K*20),1,Hoehe)
     Anordnung$(K,J) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next

;Kollision Blöcke rechts
For J4 = 0 To 19
 For K4 = 0 To 19
  For Hoehe2 = 1 To 20
   If Anordnung$(J,K) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J*40),(K*20),40,Hoehe)
     Anordnung$(K,J) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next
 


also ich blicke nicht mehr durch und weiss absolut nicht was ich machen soll/kann damit es endlich funktioniert.

Wenn ich vom zweiten System nur dashier in Source stehen habe:

Code: [AUSKLAPPEN]

;Kollisionssystem Blöcke
For J = 0 To 19
 For K = 0 To 19
  If Anordnung$(J,K) > 0
   Anordnung$(K,J) = 0
   PlaySound Abprallenblock
   Ballwinkel = 270 - Ballwinkel + 90
   ;Punkte
   ;Block zerstört Grafikeffekt
  EndIf
 Next
Next


dann funktioniert es irgendwie kurz, zumindest bei der untersten reihe der steine. Aber dann prallt der Ball auch (manchmal) bei nullgesetzten zellen des Feldes ab und manchmal fliegt er über 2 oder 4 steine einfach drüber und prallt dann milliarden mal hin und her und es verschwinden grade mal einige wenige Blöcke...

Ich weiss ehrlich nicht was ich machen soll ich bin mit meinen Ideen am Ende, finde aber auch keinen Beitrag im Forum der mit bei meinem Problem behilflich ist, da viele mit BlitzMax gearbeitet haben oder mit types, was ja bei mir beides nicht der Fall ist.

Ich hoffe einer von Euch kann mir helfen.

Gruß, 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 =] )

Nicdel

BeitragSa, Okt 24, 2009 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso zuerst (J,K) und dann (K,J)?

Code: [AUSKLAPPEN]

 If Anordnung$(J,K) > 0
  Anordnung$(K,J) = 0
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

CrowSmith

ehemals "Fleisch"

BeitragSa, Okt 24, 2009 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry das habe ich übersehen.

Hier der richtige Code zum zweiten neuen) System für die Kollision der Blöcke mit dem Ball:

Code: [AUSKLAPPEN]

;Kollisionssystem Blöcke unten
For J1 = 0 To 19
 For K1 = 0 To 19
  For Breite1 = 1 To 40
   If Anordnung$(J1,K1) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J1*40),(K1*20),Breite1,20)
     Anordnung$(J1,K1) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next

;Kollisionssystem Blöcke oben
For J2 = 0 To 19
 For K2 = 0 To 19
  For Breite2 = 1 To 40
   If Anordnung$(J2,K2) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J2*40),(K2*20),Breite2,1)
     Anordnung$(J2,K2) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next

;Kollision Blöcke links
For J3 = 0 To 19
 For K3 = 0 To 19
  For Hoehe1 = 1 To 20
   If Anordnung$(J3,K3) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J3*40),(K3*20),1,Hoehe1)
     Anordnung$(J3,K3) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next

;Kollision Blöcke rechts
For J4 = 0 To 19
 For K4 = 0 To 19
  For Hoehe2 = 1 To 20
   If Anordnung$(J4,K4) > 0
    If ImageRectCollide (Ball,KoordinateBallX,KoordinateBallY,0,(J4*40),(K4*20),40,Hoehe2)
     Anordnung$(J4,K4) = 0
     PlaySound Abprallenblock
     Ballwinkel = 270 - Ballwinkel + 90
     ;Punkte
     ;Block zerstört Grafikeffekt
    Else
     Ballwinkel = Ballwinkel
    EndIf
   EndIf
  Next
 Next
Next


Der Effekt ist der Selbe wie bei dem ersten System OHNE vertauschtes J und K.

Ich versteh das nicht >.<
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 =] )

Midimaster

BeitragSo, Okt 25, 2009 11:37
Antworten mit Zitat
Benutzer-Profile anzeigen
steppe einfach mit der SPACE taste weiter, der Ball nähert sich dem feld und der Overlap kommt genau im richtigen Moment, trifft auch den richtigen!


durch den Waitkey() siehst du alles wie in Zeitlupe, mit den Testwerten kannst Du jede Situation im Vorfeld ausgibieg testen. Besser als gleich das Spiel in vollem Speed laufen zu lassen. Hier kannst Du oft nicht beurteilen warum etwas so passiert ist. P.S. auch ein SeedRnd schadet zu Testpahse mehr als er nützt.

Code: [AUSKLAPPEN]

Graphics 800,600
Dim block(10,10)
B%=70
H%=30

;************************************
; hier Werte für Testrunde festlegen:

BallX#=300
BallY#=300
BallXadd#=0.5
BallYAdd#=-0.8

Ball=CreateImage(30,30)
SetBuffer ImageBuffer(Ball)

Color 255,255,0
Rect 0,0,30,30,0

Color 0,255,0

Oval 15,15,15,15
SetBuffer BackBuffer()

Color 255,0,0

For x=0 To 9
   For y=0 To 9
      Block(x,y)=1 
   Next
Next


Repeat
   Cls
   BallX=BallX+BallXAdd
   BallY=BallY+BallYAdd
   For x=0 To 9
      For y=0 To 9
         If Block(x,y)=1 Then
            Overlap= ImageRectOverlap (Ball, BallX,BallY,x*B,y*H,b-2,H-2)
            If overlap>0 Then
               DebugLog " overlap mit " + x + " " +y
               Block(x,y)=0
            Else
               Rect x*B,y*H,b-2,H-2,0

            EndIf
         EndIf
      Next
   Next
   DrawImage Ball,BallX,BallY
   Flip
   WaitKey()
; ImageRectOverlap Ball, BallX,BallY,

Until KeyHit(1)






ich bleib da mal dran und mail dir gleich mehr dazu....


So, jetzt hab ich mir mal deinen Code angeschaut.

Wozu machst Du den das mit der "Breite1" von 1 bis 40? Und warum das ganze 4x? Sind das wirklich 4 Blöcke mit Steinen, oder willst Du die (immer gleichen) Steine nur von 4 Seiten checken?

Dann würde ich das aber so machen:

(Ich bleibe bei meinem Code-Beispiel)

Code: [AUSKLAPPEN]

If Block(x,y)=1 Then
   ;erst mal chekcne, ob stein überhaput berührt wird
   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
      DebugLog " overlap mit " + x + " " +y
      Block(x,y)=0
   EndIf
EndIf
  • Zuletzt bearbeitet von Midimaster am So, Okt 25, 2009 12:28, insgesamt 4-mal bearbeitet

Nicdel

BeitragSo, Okt 25, 2009 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster: Wieso Graphics3D?
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group