Fehler ohne debug build

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

battlegorge

Betreff: Fehler ohne debug build

BeitragSo, Apr 01, 2007 17:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein kleines Programm geschrieben, dass das nächstgelegene Objekt findet.
Im Debugmodus funktioniert es einwandfrei.
Aber wieso klappt es ohne Debug nichtmehr?
Das mausgesteuerte Quadrat sollte sich wie im Debugmodus mit dem nächsten Quadrat verbinden.

Und kann man der Funktion f_nearestenemy() auch einen Type übergeben, damit man nicht für alle Objekte verschiedene Funktionen braucht ?

Code: [AUSKLAPPEN]

Strict
Graphics 800,600,0,85

'lists
Global playerlist:tlist=CreateList()
Global enemylist:tlist=CreateList()

'crete objects
t_player.f_create(400,500)
SeedRnd MilliSecs()
For Local i:Byte=0 To 9
   t_enemy.f_create(100+Rnd(600),100+Rnd(400))
Next

'main loop
Repeat
   Cls
   f_update()
   Flip
Until KeyHit(key_escape) Or AppTerminate()

'types
Type t_player
   Field x#
   Field y#

   Function f_create(x#,y#)
      Local player:t_player=New t_player
      player.x=x
      player.y=y
      ListAddLast playerlist,player
   End Function
   
   Method m_update()
      x=MouseX()
      y=MouseY()
      Local target:t_enemy= f_nearestenemy(x,y) 'save nearest enemy as target
      DrawLine x,y,target.x,target.y
      DrawRect x-10,y-10,20,20
      
      'draw distance
      For Local enemy:t_enemy=EachIn enemylist
         DrawText Int(f_distance(x,y,enemy.x,enemy.y)),enemy.x-10,enemy.y-25
      Next
   End Method
End Type

Type t_enemy
   Field x#
   Field y#
   
   Function f_create(x#,y#)
      Local enemy:t_enemy=New t_enemy
      enemy.x=x
      enemy.y=y
      ListAddLast enemylist,enemy
   End Function
   
   Method m_update()
      DrawRect x-10,y-10,20,20
   End Method
End Type

'functions
Function f_update() 'update objects
   For Local player:t_player=EachIn playerlist
      player.m_update()
   Next
   For Local enemy:t_enemy=EachIn enemylist
      enemy.m_update()
   Next
End Function

Function f_nearestenemy:t_enemy(x#,y#) 'find nearest enemy object
   Local distance#=1000
   For Local enemy:t_enemy=EachIn enemylist 'get shortest distance (player-enemy)
      If f_distance(x,y,enemy.x,enemy.y) < distance Then distance= f_distance(x,y,enemy.x,enemy.y)
   Next
   For Local enemy:t_enemy=EachIn enemylist 'return nearest enemy
      If f_distance(x,y,enemy.x,enemy.y) = distance Then Return enemy
   Next
End Function

Function f_distance#(x1#,y1#,x2#,y2#) 'distance between 2 points
   Local a= x1-x2
   Local b= y1-y2
   If a<0 a= a*-1
   If b<0 b= b*-1
   Return Sqr(a*a+b*b)
End Function
[/code]

ZaP

BeitragSo, Apr 01, 2007 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kann sein, dass es ohne Debug mode viel schneller läuft... hatte ich auch schon <.<
Starfare: Worklog, Website (download)

mahe

BeitragSo, Apr 01, 2007 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert bei mir sowohl mit als auch ohne Debug.
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,
 

battlegorge

BeitragSo, Apr 01, 2007 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ohne debug ist die Performance besser aber daran liegts nicht.

Mit Debug wird die Linie vom t_player Objekt zum nächsten t_enemy Objekt gezogen.
Ohne Debug seltsamerweise vom t_player nach links oben zum Punkt 0,0 Shocked
 

Dreamora

BeitragSo, Apr 01, 2007 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich stell einfach mal die Vermutung auf das deine Art die kürzeste Distanz und zugehörigen gegner zu finden der Grund dafür ist.

Anstatt da 2x durchzulaufen, speicher doch einfach distanz und enemy beim ersten durchlaufen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

mahe

BeitragSo, Apr 01, 2007 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal:
Beim mir (Linux und neuestes BMax) macht Dein Programm sowohl mit als auch ohne Debugger genau das was es soll.
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,
 

battlegorge

BeitragMo, Apr 02, 2007 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Seltsam dass es bei dir unter Linux funktioniert, ich habe windows xp.
Und eigentlich sollte das Programm ohne Debug genauso laufen wie mit, wenn kein Fehler kommt. Confused

Vielleicht lag es wirklich an den 2 Schleifen hintereinander.
Ich habe was geändert und jetzt funktionierts.

Code: [AUSKLAPPEN]

Strict
Graphics 800,600,0,85

'lists
Global playerlist:TList=CreateList()
Global enemylist:TList=CreateList()

'crete objects
t_player.f_create(400,500)
SeedRnd MilliSecs()
For Local i:Byte=0 To 9
   t_enemy.f_create(100+Rnd(600),100+Rnd(400))
Next

'main loop
Repeat
   Cls
   f_update()
   Flip
Until KeyHit(key_escape) Or AppTerminate()

'types
Type t_player
   Field x#
   Field y#
   Field target:t_enemy

   Function f_create(x#,y#)
      Local player:t_player=New t_player
      player.x=x
      player.y=y
      ListAddLast playerlist,player
   End Function
   
   Method m_update()
      DrawText Int(f_objectdistance(x#,y#)),x-10,y+20
      
      For Local enemy:t_enemy=EachIn enemylist
         If f_distance(x,y,enemy.x,enemy.y)= f_objectdistance(x#,y#) Then target=enemy
      Next
      
      DrawLine x,y,target.x,target.y
      
      x=MouseX()
      y=MouseY()
      DrawRect x-10,y-10,20,20
   End Method
End Type

Type t_enemy
   Field x#
   Field y#
   
   Function f_create(x#,y#)
      Local enemy:t_enemy=New t_enemy
      enemy.x=x
      enemy.y=y
      ListAddLast enemylist,enemy
   End Function
   
   Method m_update()
      DrawRect x-10,y-10,20,20
   End Method
End Type

'functions
Function f_update() 'update objects
   For Local player:t_player=EachIn playerlist
      player.m_update()
   Next
   For Local enemy:t_enemy=EachIn enemylist
      enemy.m_update()
   Next
End Function

Function f_objectdistance#(x#,y#) 'find distance to nearest enemy object
   Local distance#=1000
   For Local enemy:t_enemy=EachIn enemylist 'get shortest distance (player-enemy)
      If f_distance(x,y,enemy.x,enemy.y) < distance Then distance= f_distance(x,y,enemy.x,enemy.y)
      DrawText Int(f_distance#(x,y,enemy.x,enemy.y)),enemy.x-10,enemy.y+20
   Next
   Return distance
End Function

Function f_distance#(x1#,y1#,x2#,y2#) 'distance between 2 points
   Local a= x1-x2
   Local b= y1-y2
   If a<0 a= a*-1
   If b<0 b= b*-1
   Return Sqr((a*a)+(b*b))
End Function

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group