[3D] X_SPRITE mit ALPHAMODE ist nicht korrekt.

Previous topic - Next topic

Schranz0r

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
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

Kein Fehler!
Du musst bei 3D die Zeichenreihenfolge beachten!!

Code (glbasic) Select
z=0
FOREACH t IN R[]
DEC z, 0.01
ALPHAMODE t.alpha
X_SPRITE 1,t.x,t.y, z ,1
Puh! :D

Schranz0r

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:

Code (glbasic) Select
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 :)

Code (glbasic) Select
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!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

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.