Probleme mit ResetCollision (problem gelöst)

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Dreamora

Betreff: Probleme mit ResetCollision (problem gelöst)

BeitragMo, März 07, 2005 8:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen

Ich programmiere aktuell an einem Projekt, dass ich eigentlich gerne einigermassen vorwärts bringen würde, solange ich noch Ferien habe.

Dabei knabber ich jedoch seit über einer Woche an einem massiven Problem, dass in 1.03 als auch 1.04 und 1.05 besteht:

Wenn ich in meinem Projekt "ResetCollision" aufrufe, tickt das gesammte Programm aus. Grösstes Problem ist, dass die Grafiken sich in total unbestimmbare Richtungen bewegen ( eigentlich bewegen sich alle in Richtung Bildschirmmittelpunkt, mit ResetCollision aktiv bewegen sie sich jedoch überall hin, nur net auf den Mittelpunkt zu )

Haben damit auch andere Probleme?


Verwendet wurden dabei nur Tastatureingabe, Mauseingabe, FlushMem, ResetCollision ( vor Flushmem, beides in der Mainloop ) und CollideImage für die COLLISION_LAYER_ 1 und 2.

Sollten die Probs niemandem bekannt sein, werde ich sonst versuchen ein lauffähiges Beispiel zu schreiben, das den Bug enthält.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Di, März 08, 2005 14:18, insgesamt einmal bearbeitet

Plasma(alt)

Betreff: hmm

BeitragMo, März 07, 2005 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
würde ja gerne mal helfen !

give me da code
DIV is dead !
 

Dreamora

BeitragDi, März 08, 2005 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ist ein Testcode.

Einfach resetcollisions ein und aus schalten, dann wirst du sehen was ich meine ...

Code: [AUSKLAPPEN]
Strict

Graphics 800, 600, 0

Const ball_normal    = 1
Const ball_explosion   = 2
Const ball_wave      = 3
Const ball_whirl      = 4
Const ball_static      = 5

Const debug         = 0

Global exit_state:Byte = False
Local last_ball:Int
Local fps_counter:TFPS_COUNTER = New TFPS_COUNTER

Local list1:T_BALL = New T_BALL

list1.destroy
list1 = Null
FlushMem

fps_counter.update

Draw_Ball



#mainloop
Repeat
   If exit_state
      Exit mainloop
   EndIf

   Cls

   If MilliSecs() - last_ball > 2000
      create_ball
      last_ball = MilliSecs()
   EndIf
   
   Draw_Debug (fps_counter)
   Handle_Key_Input

   T_BALL.update (COLLISION_LAYER_1, fps_counter.fps())
   fps_counter.update
   FlushMem
   ResetCollisions( COLLISION_LAYER_ALL )
   Flip

Forever


Function Draw_Ball ()
   Cls
   SetColor 0, 150, 150
   DrawOval 0,0,32,32
   Local img:TIMAGE = CreateImage( 32, 32 )
   GrabImage img, 0, 0
   T_BALL.set_graphic (img)
   Cls
   Flip
End Function

Function Draw_Debug( counter:TFPS_COUNTER )
   SetColor 255, 255, 255
   DrawText "Bilder pro Sekunde: " + counter.fps(), 0, 0
   DrawText "Anzahl Bälle: " + T_BALL._list.count(), 0, 20
End Function

Function Handle_Key_Input()
   If KeyHit( KEY_ESCAPE )
      exit_state   = True
   EndIf
End Function

Function create_ball()
   Local i,j:Int
   i = Rand ( 0, 1 )
   Select i
      Case 0
         ' x
         j = Rand ( 0, 1 )
         Select j
            Case 0
               ' links
               T_BALL.make ( 0, Rand( 0, GraphicsHeight() -1 ), ball_normal )
            Case 1
               ' rechts
               T_BALL.make ( GraphicsWidth()-1, Rand( 0, GraphicsHeight() -1 ), ball_normal )
         End Select
      Case 1
         ' y
         j = Rand ( 0, 1 )
         Select j
            Case 0
               ' oben
               T_BALL.make ( Rand( 0, GraphicsWidth() - 1 ), 0, ball_normal )
            Case 1
               ' unten
               T_BALL.make ( Rand( 0, GraphicsWidth() - 1 ), GraphicsHeight() - 1, ball_normal )
         End Select
   End Select
End Function


Type T_BALL
   ' Type der Metallkugel
   Global _graphic:TImage
   
   Field _x, _y:Int
   Field _tx, _ty, _force_x, _force_y:Float
   Field _type:Int
   Field _frame:Int

   
   Global _list:TList
   
   Function make:T_BALL( x:Int, y:Int, typ:Int )
      ' force_x / force_y sind die einheiten pro Sekunde!
      Local temp:T_BALL
      temp         = New T_BALL
      temp._x      = x
      temp._y      = y
      temp._tx      = x
      temp._ty      = y
      temp._type   = typ
      If typ <> 5
         ' Ball auf den Mittelpunkt ausrichten
         temp._force_x   = Float( Float(GraphicsWidth() / 2.0) - x )/2.5
         temp._force_y   = Float( Float(GraphicsHeight() / 2.0) - y )/2.5
      EndIf
      Return temp
   End Function
   
   Function update( col_layer_index:Int, fps:Int )
      ' Updatet die Positionen aller Metalkugeln

      If debug
         Print "Ball Update started!"
      EndIf
      Local list:TListEnum = _list.ObjectEnumerator()
      While list.HasNext()
         T_BALL(list.NextObject()).update_me (col_layer_index, fps)
      Wend
      If debug
         Print "Ball Update finished!"
      EndIf
   End Function

   Function set_graphic ( image:TIMAGE )
      _graphic   = CreateImage ( ImageWidth( image ), ImageHeight( image ), 1, MASKEDIMAGE )
      Cls
      DrawImage image, 0, 0
      GrabImage _graphic, 0, 0
      MidHandleImage _graphic
   End Function
   
   Function get_graphic:TIMAGE ()
      Return _graphic
   End Function
   
   Method New()
      If _list = Null
         _list      = New TList
      EndIf
      _list.addlast ( Self )
   End Method

   Method Delete()
      _list.remove ( Self )
   End Method
   
   Method x:Int()
      Return _x
   End Method
   
   Method y:Int()
      Return _y
   End Method
   
   Method update_me( col_layer_index:Int, fps:Int )
      ' Updatet die Position der Metalkugel
      
      If x() >= 0 And x() < GraphicsWidth() And y() >= 0 And y() < GraphicsHeight()
         Local collision:Object[]
         Local OutputText:String
         Local ok:Int
         
         collision = CollideImage ( get_graphic(), Int( _tx + _force_x/Float(fps) ), Int( _ty + _force_y/Float(fps) ) , 0, col_layer_index | COLLISION_LAYER_2, 0, Self)
         ok = True
         For Local temp:Object= EachIn collision
            ok = False
            If T_BALL (temp) And T_BALL (temp) <> Self
               OutputText = "Ball Hit! :-)"
               destroy()
               T_BALL (temp).destroy()
            EndIf
         Next   
         If ok And _type <> 5
            _tx   :+ _force_x/Float(fps)
            _ty   :+ _force_y/Float(fps)
         
            _x   = _tx
            _y   = _ty
         EndIf   
         CollideImage ( get_graphic(), x(), y(), 0, 0, COLLISION_LAYER_2, Self)
         DrawImage get_graphic(), x(), y()
         If Len( OutputText ) > 1
            DrawText OutputText, x(), y()
         EndIf
      Else
         destroy()
      EndIf
      
   End Method
   
   Method destroy()
      ' Zerstört diese Metalkugel
      _list.remove ( Self )
   End Method
End Type

Type TFPS_COUNTER
   Field _t_fps:Int
   Field _fps:Int
   Field _last_update:Int
   
   Method update()
      If MilliSecs() - _last_update < 1000
         _t_fps       :+ 1
      Else
         _fps         = _t_fps
         _t_fps      = 0
         _last_update    = MilliSecs()
      EndIf
   End Method
   
   Method fps:Int()
      Return _fps
   End Method
End Type
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

BladeRunner

Moderator

BeitragDi, März 08, 2005 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm. bewegen sich bei mir immer schön richtung Mitte des Schirms.
Allerdings gibt es sowohl mit resetcollisions als auch ohne "geschwindigkeitsschwankungen" bei den Bällen. Ohne Resetcollisions sind diese extremer, und nach einer Zeit geh die FPS runter. Mit bleibts gering schwankend stabil.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Dreamora

BeitragDi, März 08, 2005 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Komisch ...
Warum bewegen sie sich dann bei mir nach dem Zufallsgenerator.

Mit Reset gehts immerhin noch einigermassen in richtung der mitte.
Aber ohne gehts von garnet bewegen bis irgendwohin wo sie grad lang wollen ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

BladeRunner

Moderator

BeitragDi, März 08, 2005 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann und wann hab ichs dass ein ball ganz geringe Kurskorrekturen vornimmt. aber keine nennenswerten abweichungen von der achse durch den mittelpunkt.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Dreamora

BeitragDi, März 08, 2005 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Na dann kann ich ja jetzt schön auswürfeln worans liegt.

Einfachste Varianten:

- Probleme mit ATI
- Probleme von BM Math mit Pentium-M

Auch wenns total keinen Sinn ergibt ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

BladeRunner

Moderator

BeitragDi, März 08, 2005 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab auch ne ATI drinne. befeuert mit Omegatreibern.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Dreamora

BeitragDi, März 08, 2005 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
OK immerhin einen Teil habe ich raus, der war "Dummheit" oder mangelndes Sprachdesign.

Ich bin davon ausgegangen, dass BM immerhin ein wenig "sinnvoll" arbeitet.

Aber

Field _tx,_ty,_force_x,_force_y:Float gibt nur für _force_y float anstatt für die ganze Zeile (bzw. jede Variable in der Zeile), sie es eigentlich schon ewig normal ist.

Auch das andere hab ich geklärt ... war eigentlich logisch, hat aber in meiner verkorksten 1.04 BM Installation komischerweise ein anderes Resultat geliefert.
Thread kann geröstet werden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Di, März 08, 2005 14:19, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragDi, März 08, 2005 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
und was war es nun ?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Dreamora

BeitragDi, März 08, 2005 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Was war was?

Eben, dass BM die Zeile wo am Schluss :Float steht nicht so versteht wie es sich gehört ... also das ALLE vom Type Float sein sollen. Es macht aus allen vorne Int und die letzte ist Float, womit natürlich massig rechen- bzw. rundungsfehler entstehen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

DivineDominion

BeitragDi, März 08, 2005 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte nur noobs schieben die Schuld auf die Sprache, weil sies nicht können Wink
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

Dreamora

BeitragDi, März 08, 2005 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja
Ich schiebe die Schuld nirgends hin.

War halt ne Fehlannahme aufgrund der Tatsache, das BM von C, C++ und Pascal geklaut hat und die Sprachen das alle seit über einem Jahrzehnt können.

Gibt halt viel blödsinniges Copy-Paste programmieren, kann man nix machen, wenn es Mark als C / C++ Programmierer net dämmert.

Oder es is ein Windows Problem ... keine Ahnung.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Plasma(alt)

Betreff: hmmm

BeitragDi, März 08, 2005 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
np
DIV is dead !

TheShadow

Moderator

BeitragDi, März 08, 2005 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
LOL... am besten du schreibst jede variable in 1 zeile und dahinter den typ...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group