Bei zu schneller Mausbewegung passiert irgendwas komisches..

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Dominik
Beiträge: 2
Registriert: 27.12.2004 21:06
Wohnort: Nürnberg

Bei zu schneller Mausbewegung passiert irgendwas komisches..

Beitrag von Dominik »

Ich bin gerade dabei, ein Programm zu schreiben, welches elektrische Felder optisch darstellen kann. Aktuell steuert die Maus immer eine der zunächst drei vorhandenen Ladungen. Alles funktioniert gut nur wenn ich die Maus nicht zu schnell bewege. Wenn ich es jedoch tue, dann gibts irgendein Problem und die Mausbewegung wird nicht mehr erkannt.
Vielleicht könnt ihr mir helfen.
Hier der Programmcode (die Maus wird in den letzten Programmzeilen angesprochen):

Code: Alles auswählen

InitSprite()
InitMouse()
InitKeyboard()

Global PI.f
PI = 3.14159265

#width = 320
#height = 240

Global raster.b
raster = 2

Global drawRaster.b
drawRaster = 1
Global drawColor.b
drawColor = 1

Global AnzahlLadungen.b
AnzahlLadungen = 3

Dim Ladungen.f(AnzahlLadungen-1, 3-1)
Ladungen(0,0) = 200
Ladungen(0,1) = 150
Ladungen(0,2) = -1

Ladungen(1,0) = 250
Ladungen(1,1) = 30
Ladungen(1,2) = 1

Ladungen(2,0) = 100
Ladungen(2,1) = 100
Ladungen(2,2) = 1


Procedure HSBtoRGB (h.f, s.f, b.f)

If h >= 0 And h < 60/360.0
   R = b*255
   G = (1-s*(1-(h/(60/360.0))))*b*255
   B = (1-s)*b*255
Else
  
  If h >= 60/360.0 And h < 120/360.0
   R = (1-s*( (h-(60/360.0))/(60/360.0) ))*b*255
   G = b*255
   B = (1-s)*b*255
Else

If h >= 120/360.0 And h < 180/360.0
   R = (1-s)*b*255
   G = b*255
   B = (1-s*(1-( (h-2*(60/360.0))/(60/360.0) )))*b*255
Else

  If h >= 180/360.0 And h < 240/360.0
   R = (1-s)*b*255
   G = (1-s*( (h-3*(60/360.0))/(60/360.0) ))*b*255
   B = b*255
Else

If h >= 240/360.0 And h < 300/360.0
   R = (1-s*(1-( (h-4*(60/360.0))/(60/360.0) )))*b*255
   G = (1-s)*b*255
   B = b*255
Else

   R = b*255
   G = (1-s)*b*255
   B = (1-s*( (h-5*(60/360.0))/(60/360.0) ))*b*255
EndIf
EndIf
EndIf
EndIf
EndIf

ProcedureReturn RGB(R, G, B)
EndProcedure

Dim Punkt.f(2-1)


Procedure getPoint(x.w, y.w)
XX.f = 0
YY.f = 0

nenner.f

For i=0 To AnzahlLadungen-1
nenner = Pow( Pow( (x-Ladungen(i,0))*(x-Ladungen(i,0))+(y-Ladungen(i,1))*(y-Ladungen(i,1)), 0.5), 3)
If nenner > 0
XX = XX+(Ladungen(i,2)*(x-Ladungen(i,0)))/nenner
YY = YY+(Ladungen(i,2)*(y-Ladungen(i,1)))/nenner
Else
XX = XX+1
YY = YY+1
EndIf
Next
Punkt(0) = Pow(XX*XX+YY*YY, 0.5)

If XX > 0 And YY > 0
Punkt(1) = ATan(YY/XX)
Else

If XX < 0 And YY > 0
Punkt(1) = ATan(YY/XX)+PI
Else

If XX < 0 And YY < 0
Punkt(1) = ATan(YY/XX)+PI
Else

If XX > 0 And YY < 0
Punkt(1) = ATan(YY/XX)+2*PI
Else

If XX > 0 And YY = 0
Punkt(1) = 0
Else

If XX = 0 And YY > 0
Punkt(1) = PI/2
Else

If XX < 0 And YY = 0
Punkt(1) = PI
Else

Punkt(1) = 3*PI/2

EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf

EndProcedure




Procedure doit()
If drawRaster = 1
max.f
max = 0.1
direction.f
direction = 0
saturation.f
brightness.f
y = 0
While y < #height
x = 0
While x < #width
getPoint(x, y)
brightness = Pow(Punkt(0)/max, 0.25)
If brightness > 1
brightness = 1
EndIf
If drawColor = 1
direction = Punkt(1)/(2*PI)
saturation = 1
Else
saturation = 0
EndIf
Box(x, y, raster, raster, HSBtoRGB(direction, saturation, brightness))
x=x+raster
Wend
y=y+raster
Wend
EndIf
EndProcedure

OpenScreen(#width, #height, 32, "Felder")

doit()

Repeat
ExamineMouse()
Ladungen(0,0) = MouseX()
Ladungen(0,1) = MouseY()
StartDrawing(ScreenOutput())
doit()
StopDrawing()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(1)
End
Die Prozedur "doit" rendert so zu sagen ein einzelnes Bild auf den Bildschirm.
Außerdem hab ich das Problem, dass ab und zu der Fensterrahmen oben kurz zu sehen ist.
Für jedes komplexes Problem gibt es eine einfache und leichtverständliche - aber falsche - Lösung.