Wenn man mehrere dieser Sprites überlappt, merkt man, das ALPHAMODE nicht korrekt arbeitet.
In 2D ist alles i.o.
Hier ein Test: www.styleattax.de/alphamode.rar
Oben 3D unten 2D!
Und ja ich weiss, habe das Project falsch benannt :)
Ist mir wohl ein L weg gelaufen :P
Kein Fehler!
Du musst bei 3D die Zeichenreihenfolge beachten!!
z=0
FOREACH t IN R[]
DEC z, 0.01
ALPHAMODE t.alpha
X_SPRITE 1,t.x,t.y, z ,1
Puh! :D
versteh ich jetzt net nichts desto trotz ist aber das Alpha anders als in 2D.
Der Rand der "Wolke" ist schwarz und Fadet auf Schwarz, ist in 2D aber nicht so!
EDIT:
z = 0
FOREACH t IN R[]
ALPHAMODE t.alpha
DEC z, 0.1
X_SPRITE 1,t.x,t.y,z,1
Gut, schaut aber bescheiden aus die Ränder...
EDIT2:
Code ist nicht schön, da ich einfach 2 test zusammen geworfen habe!
Comments == FALSE :)
SYSTEMPOINTER TRUE
LOADSPRITE "r1.png", 1
// 3D ------------------
TYPE Rauch
x;y;z
alpha
phi
speed
ENDTYPE
LOCAL R[] AS Rauch
// --------------------
// 2D ------------------
TYPE particle
X;Y
alpha
offsetX
speed
phi
ENDTYPE
GLOBAL p[] AS particle
//----------------------
WHILE TRUE
LOCAL mx,my,b1,b2
MOUSESTATE mx,my,b1,b2
// 3D ---------------------------------------------
X_MAKE3D 1,1000,45
X_CAMERA 0,0,-400, 0,0,0
IF timer < GETTIMERALL()
LOCAL t AS Rauch
t.phi = 60+RND(60)
t.alpha = -0.5 + -RND(2)/10
t.speed = 0.4 + RND(2)/10
DIMPUSH R[],t
timer = GETTIMERALL()//+50
ENDIF
X_DRAWAXES 0,0,0
z = 0
FOREACH t IN R[]
ALPHAMODE -t.alpha
DEC z, 0.1
X_SPRITE 1,t.x,t.y,z,1
INC t.x, COS(t.phi)*t.speed
INC t.y, SIN(t.phi)*t.speed
INC t.alpha,0.002
IF t.alpha >= 0
DELETE t
ENDIF
NEXT
// 2D ----------------------------------------------
X_MAKE2D
IF timer2 < GETTIMERALL()
LOCAL e AS particle
IF b1
e.X = mx
e.Y = my
ELSE
e.X = 300
e.Y = 400
ENDIF
e.alpha = .5
e.speed = .5+RND(3)/5
e.phi = -90+rand(-30,30)
DIMPUSH p[],e
timer2 = GETTIMERALL()//+50
ENDIF
FOREACH t IN p[]
INC t.offsetX,1
INC t.X,COS(t.phi)*t.speed
INC t.Y,SIN(t.phi)*t.speed
ALPHAMODE -t.alpha
DRAWSPRITE 1,t.X, t.Y
ALPHAMODE 0
DEC t.alpha,0.002
IF t.alpha < 0
DELETE t
ENDIF
NEXT
PRINT "Particle on the move: "+LEN(p[]),10,10
SHOWSCREEN
WEND
END
FUNCTION rand: minimum, maximum
RETURN minimum + RND(-minimum + maximum)
ENDFUNCTION
Einfach die Rar runterladen(erster Post) und den Code ersetzt mit dem aus diesem Post!
Hmm... ist bisserl anders. Warscheinlich, weil die Größe eines Partikels nicht 100% mit dem 2D übereinstimmt?
Oder ist da was mit Rändern? Ich hab's nicht genau feststellen können.