Hi!
X_COLLISION funktioniert super, da? hei?t, bis man es mit FOREACH verbindet.
Sobald beides zusammen arbeiten soll, reagiert X_COLLISION erst auf das letzte Objekt das erstellt wurde!
In meinem 3D - Test, den ich gemacht habe verh?lt es sich folgenderma?en:
- auf den 1. Schuss wird gar nicht reagiert
- auf Sch?sse dazwischen wird reagiert
- auf den letzten Schuss wird widerum nicht reagiert
Bei meinem Alpha - Test von LR reagiert es genauso, wobei hier nur auf den letzten der Sch?sse reagiert wird, wenn ich FOREACH nutze.
Ich habe mal so nebenbei ein kleines Beispiel gemacht, das es ziemlich anschaulich darstellt!
Gru?
W.
PS.: Das Beispiel ist frei nach Schranz0r's Schusstest mit Types kopiert!
[attachment deleted by admin]
UPDATE:
Nachdem ich das Ganze jetzt ausgiebig getestet habe, ergibt sich der selbe Fehler sowohl mit FOREACH, als auch mit FOR/NEXT und BOUNDS.
Weiters ist mir in meinem Projekt aufgefallen, da? rein optisch X_COLLISION (und auch AABB) eine R?ckmeldung des Treffers liefern, jedoch keinen Wert zur?ck geben!
"col" bleibt 0 bis zum letzten Objekt, das einschl?gt! Das widerum wird korrekt zur?ck geliefert!
Du musst X_MOVEMENT _VOR_ X_COLLISION machen. Sonst wei? GLBasic ja nicht _wo_ das Objekt ist.
Habe ich gerade, macht keinen Unterschied! "col" gibt mir keine Reaktion zur?ck, bis der letzte Schuss trifft!
bei mir gehts...
Mach mal einen einzelnen Schuss!
Jo, das Ding wird rot wenns durchfliegt
Das ja, liefert aber keinen Wert zur?ck!!!
Geht
// --------------------------------- //
// Project: Foreach Test
// Start: Wednesday, July 15, 2009
// IDE Version: 6.248
TYPE shot
x
ENDTYPE
LOCAL mx, my, b1, b2
LOCAL newshot AS shot
LOCAL shots[] AS shot
X_LOADOBJ "wurfel.ddd", 0
WHILE TRUE
X_MAKE3D 1, 1000, 45
X_CAMERA 1000, 50, 0, 0, 0, 0
MOUSESTATE mx, my, b1, b2
X_DRAWOBJ 0, 0
IF b1 = 1 AND timer < GETTIMERALL()
newshot.x = 0 //--|
DIMPUSH shots[], newshot // Werte der Positionen übergeben
timer = GETTIMERALL()+500 //Timer höher setzen und verzögerung einfügen!
ENDIF
col=0
FOREACH Check IN shots[] // eine Variable durchdüsen lassen (aktualisieren)
INC Check.x, 10 //schuss um 2 nach oben versetzen
IF Check.x > 1000 THEN DELETE Check //wenn schuss y < 0 dann löschen
X_MOVEMENT Check.x, 0, 0
X_DRAWOBJ 0, 0
INC col , X_COLLISION(0, 0, 100, 500, 0, 0)
NEXT
X_MAKE2D
PRINT "Shots: "+BOUNDS(shots[], 0), 0,0
PRINT "Col: "+col, 0,20
SHOWSCREEN
WEND
qed.
Ok, mit INC teste ich mal! Gebe dann morgen bescheid, ob es so geht!
UPDATE:
Teste noch, aber scheinbar scheint alles zu funktionieren!