Fehler mit Kommazahlen

Previous topic - Next topic

S. P. Gardebiter

Bei folgendem Code wird nicht korrekt gerundet/berechnet.

Code (glbasic) Select
GLOBAL DebugMode = 1
GLOBAL ScreenW = 640
GLOBAL ScreenH = 480
GLOBAL Fullscreen = 0
GLOBAL FPS = 60
GLOBAL ParticleSize = 4096

SETSCREEN ScreenW, ScreenH, Fullscreen
SYSTEMPOINTER FALSE
LIMITFPS FPS
SETTRANSPARENCY RGB(0, 0, 0)

DIM ParticleX[ParticleSize]
DIM ParticleY[ParticleSize]
DIM ParticleSpeedX[ParticleSize]
DIM ParticleSpeedY[ParticleSize]
DIM ParticleGotPos[ParticleSize]
DIM ParticleDir[ParticleSize]
DIM ParticleSpeed[ParticleSize]
DIM ParticleColor[ParticleSize]
DIM ParticleType[ParticleSize]

GLOBAL Count, CountX, CountY, InitTimer, ParticleNumber

DIM Sinus[360]
DIM CoSinus[360]

FOR Count = 0 TO 359
Sinus[Count] = SIN(Count)
CoSinus[Count] = COS(Count)
NEXT

WHILE TRUE

IF KEY(1) = TRUE THEN BREAK

IF InitTimer = 0
IF KEY(57)
FOR Count = 0 TO ParticleSize - 1
ParticleX[Count] = 0
ParticleY[Count] = 0
ParticleSpeedX[Count] = 0
ParticleSpeedY[Count] = 0
ParticleGotPos[Count] = 0
ParticleDir[Count] = 0
ParticleSpeed[Count] = 0
ParticleColor[Count] = 0
ParticleType[Count] = 0
NEXT
FOR CountY = 0 TO 359
FOR CountX = 1 TO 4
FOR Count = 0 TO ParticleSize - 1
IF ParticleType[Count] = 0
ParticleType[Count] = 1
ParticleX[Count] = 320
ParticleY[Count] = 240
ParticleDir[Count] = CountY
ParticleSpeed[Count] = (CountX * 0.5) * RND(1)
ParticleColor[Count] = RGB(RND(255), RND(255), RND(255))
BREAK
ENDIF
NEXT
NEXT
NEXT
ENDIF
InitTimer = 15
ELSE
DEC InitTimer, 1
ENDIF

GOSUB ParticleSystem

SHOWSCREEN

WEND

SUB ParticleSystem:

FOR Count = 0 TO ParticleSize - 1
IF ParticleType[Count] <> 0
INC ParticleNumber, 1
IF ParticleGotPos[Count] = 0
IF ParticleDir[Count] > 359
ParticleDir[Count] = MOD(ParticleDir[Count], 360)
ELSEIF ParticleDir[Count] < -359
ParticleDir[Count] = MOD(ParticleDir[Count], 360)
ENDIF
ParticleSpeedX[Count] = Sinus[ParticleDir[Count]] * ParticleSpeed[Count]
ParticleSpeedY[Count] = CoSinus[ParticleDir[Count]] * ParticleSpeed[Count]
ParticleGotPos[Count] = 1
ELSE
ParticleX[Count] = ParticleSpeedX[Count] + ParticleX[Count]
ParticleY[Count] = ParticleSpeedY[Count] + ParticleY[Count]
ENDIF
IF ParticleType[Count] = 1
SETPIXEL ParticleX[Count], ParticleY[Count], ParticleColor[Count]
ENDIF
ENDIF
NEXT

PRINT ParticleNumber, 16, 16
ParticleNumber = bXOR(ParticleNumber, ParticleNumber)

ENDSUB


Ich rede dabei von ParticleSpeed.
Er ist immer ganzzahlig oder hat nur 0.5 Werte kommischerweise.

RND(100)/100 hilft dabei auch nicht, die meisten Werte sind dann 0.
~ Cave Story rules! ~

Schranz0r

Sieht nach nen Bug in RND aus!


Das geht :
Code (glbasic) Select
LOCAL ParticleSpeed#

WHILE TRUE

ParticleSpeed = RND(100)
ParticleSpeed = ParticleSpeed / 100
PRINT ParticleSpeed,10,10

SHOWSCREEN

KEYWAIT

WEND




Das nicht! :

Code (glbasic) Select
LOCAL ParticleSpeed#

WHILE TRUE

ParticleSpeed = RND(100) /100
PRINT ParticleSpeed,10,10
SHOWSCREEN

KEYWAIT

WEND
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

Moru

I can't say exactly what you want but if you are trying to divide an integer with an integer, the product will be an integer (99/100 = 0, 100/100 = 1)

The trick is to put a .0 on the end of what you are dividing with. (99/100.0 = 0.99).

Am I barking up the wrong tree or does it make sense? :-)

Schranz0r

I define a local variable as float! ;)

Code (glbasic) Select
LOCAL ParticleSpeed#
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

 / 100.0

now you perform a floating point division (if either part is float, division is float)