Verfolgungs Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Dottakopf

Betreff: Verfolgungs Problem

BeitragSo, Jan 14, 2007 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !

Ich hab so ein Problem mit ner Verfolgungsfunktion.

Die Situation :
Ich kann mit einem Player zu einer roten box laufen und sobald ich mit dieser kollidiere wird eine ameise(kugel) erstellt. Diese Ameise soll mich verfolgen was eigentlich auch klappt. Doch sobalt ich eine neue Ameise erstelle, passiert folgendes :

- Statt einer A. werden 2 erstellt (und eins folgt mir, das andere steht)
- Die A. welche mich vorher verfolgete steht jetzt auch

Warum passiert das?? Das ist doch unlogisch vorallem des mit der 2fach erstellung !

Ich stell hier mal den Abschnitt rein indem ich die Ameise erstelle (da is ne bauzeit mit drin..) und wie mich die Ameisen verfolgen sollten.

Code: [AUSKLAPPEN]

Function ants_create() ;Kollision / bauzeit bis 100 / Ant erstellen /verfolgen

If EntityCollided(player,type_bau) Then bau_able = True
If bau_able = True Then bau_counter = bau_counter +1          ;bauzeit


;wenn Bauzeit 100 ant erstellen
If bau_counter >= 100 Then
   bau_counter = 0                   ;bauprozess zu ende
   bau_able = False                  ;bau stoppen

 info.ant = New ant                  ;ameise erstellen
 info\ax = ax
 info\ay = ay
 info\az = az

 For info.ant = Each ant         
 
 ant = CreateSphere()
       EntityType ant,TYPE_ANT
       EntityColor ant,0,100,100
       PositionEntity ant, info\ax,info\ay+1,info\az ;ameise setzten
     
   
Next
End If

End Function

;---------------------------------

Function update_ant()

For info.ant = Each ant  ;jetzt müsste mich doch jede Ant verfolgen ?!

   PointEntity ant,player,1       
   If EntityDistance(ant,player) >2 Then MoveEntity ant,0,0,0.5

Next

End Function


Wenn ihr wollt kann ich euch auch den ganzen Quellcode zur genauen veranschaulichung posten (besteht nur aus cuben und spheren/ keine texturen).

Ich hoffe das ich euch mein Problem verständlich schildern konnte und danke euch schon einmal für eure Mühe im voraus !!!

mfg Dottakopf

Christoph

BeitragSo, Jan 14, 2007 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst ein neues Feld in ant anlegen, z.b. entity. Darin speicherst du die Sphere.

und dann machst du statt dem:

Code: [AUSKLAPPEN]
   PointEntity ant,player,1       
   If EntityDistance(ant,player) >2 Then MoveEntity ant,0,0,0.5


das:

Code: [AUSKLAPPEN]
   PointEntity ant\entity,player,1       
   If EntityDistance(ant\entity,player) >2 Then MoveEntity ant\entity,0,0,0.5


Dein Fehler ist, dass du immer nur auf Ant zugreifst, welches beim 2./3./4. Mal überschrieben wird, d.h. du greifst immer nur auf das neuste Objekt zu.

Du musst für JEDE Ameise eine Variable anlegen, in der die Nummer des Entity gespeichert wird

Dottakopf

BeitragSo, Jan 14, 2007 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok !

Mit neuem Feld anlegen meinst du da einen kompletten type ?
Und wie speichere ich das dan rein ? Embarassed

skey-z

BeitragSo, Jan 14, 2007 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, keinen neuen Type, du hast ja in deinem schon die Felder ax, ay, und az, du musst nur ein neues "Field entity" in den Type eintragen und beim erstellen

Code: [AUSKLAPPEN]

info\entity = createsphere()


nun kannst du jede einzelne Kugel direkt ansprechen, weil bei deinem Code wird die Kugel zwar auc herstellt, aber bei jedem weiteren erstellen wird die vorherige Kugel überschrieben, sie besteht zwar noch, hat aber keine Referenz mehr im Speicher.
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Dottakopf

BeitragSo, Jan 14, 2007 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Hilfe ! (habs etz gut verstanden)

Jedoch bekomme ich eine Fehlermeldung "Variable must be a Type" !
Irgendwas stimmt immer noch nicht.

Um missverständnissen aus dem Weg zu gehen Poste ich mein Korrekturen:



Code: [AUSKLAPPEN]


;hier wurde "entity" in ant aufgenommen

Type ant
Field ax
Field ay
Field az
Field ant
   Field entity
End Type

;schleife ...


Function ants_create()

If EntityCollided(player,type_bau) Then bau_able = True
If bau_able = True Then bau_counter = bau_counter +1          ;bauzeit


;wenn Bauzeit 100 ant erstellen
If bau_counter >= 100 Then
   bau_counter = 0                   ;bauprozess zu ende
   bau_able = False                  ;bau stoppen

 info.ant = New ant                  ;ameise erstellen
 info\ax = ax
 info\ay = ay
 info\az = az
 

 For info.ant = Each ant         
 
 info\entity = CreateSphere()   ;VARIABLE ÜBERGEBEN
       EntityType ant,TYPE_ANT
       EntityColor ant,0,100,100
       PositionEntity info\entity, info\ax,info\ay+1,info\az+10 ;ameise setzten

   
Next
End If

End Function

;---------------------------------

Function update_ant()

For info.ant = Each ant

   PointEntity ant\entity,player,1  ;entity einbauen
   If EntityDistance(ant\entity,player) >2 Then MoveEntity ant\entity,0,0,0.5

Next

End Function




Hab ich das richtig gemacht ??

Christoph

BeitragSo, Jan 14, 2007 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Nö,

wenn du dein Typ "info" nennst, musst du ihn auch damit ansprechen:

Code: [AUSKLAPPEN]
For info.ant = Each ant

   PointEntity info\entity,player,1  ;entity einbauen
   If EntityDistance(info\entity,player) >2 Then MoveEntity info\entity,0,0,0.5

Next
 

BlackTermi

BeitragSo, Jan 14, 2007 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, habe mir das Programm jetzt nicht wirklich angesehen, nur eines ist mir gleich ins Auge gesprungen:


Dottakopf hat Folgendes geschrieben:

Function update_ant()

For info.ant = Each ant

PointEntity ant\entity,player,1 ;entity einbauen
If EntityDistance(ant\entity,player) >2 Then MoveEntity ant\entity,0,0,0.5

Next

End Function


[/code]

Hab ich das richtig gemacht ??



soweit ich weiss muss da info\ hin, sonst kann es nicht funktionieren, da info die variable ist und ant der Type eintrag.

/edit bin ich denn immer zu langsam Sad

Dottakopf

BeitragSo, Jan 14, 2007 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Huch !!

Hoppla oh man ist das peinlich Embarassed

Danke leute ! Doch wurde nur das Problem mit der Doppelerscheinung gelöst. Doch Die vorgehende sphere bleibt immer noch stehen. Nur warum ?

Dottakopf

BeitragMi, Jan 17, 2007 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ähmm ja ? Wüsste da einer woran das liegt ?

Nochmal das Problem :
Sobald eine neue sphere erstellt wurde, verfolgt mich immer nur diese Spere. Und die anderen zuvor erstellten spheren bleiben stehen. (einfach Geil zu erklären... )

Hmm bitte nicht schimpfen aber ich stelle hier mal den ganzen quellcode rein: Ihr könnt wenn Ihr wollt, den code via strg + c und v in eurer bb einfügen und selbst sehen was da passiert.

Also bitte fallt mir nicht an die Gurgel, denn ich weis echt nicht woran das liegt.


Code: [AUSKLAPPEN]

Graphics3D 800,600,16
SetBuffer BackBuffer()

;constanten
Const TYPE_PLAYER = 1,TYPE_ANT = 2,TYPE_BAU = 3

;globale
Global bau_counter = 0,sammler_temp# = 0
Global bau_able = False
Global info.ant,ant

;------------------------------
Type ant
Field ax
Field ay
Field az
Field entity
End Type

;licht
Global light = CreateLight()
       RotateEntity light,90,0,0

;der spieler
Global player = CreateSphere()
       PositionEntity player,0,1,0
       ScaleEntity player,2,2,2
       EntityType player,TYPE_PLAYER
       EntityColor player,255,0,0

;die camera
Global camera = CreateCamera()
       PositionEntity camera,0,8,-10
       TurnEntity camera,20,0,0
       

;terrain
Global terr = CreateTerrain(128)
       EntityColor terr,0,80,0
       PositionEntity terr,-30,0,-20


;bau
Global bau = CreateCube()
       ScaleEntity bau,2,2,2
       EntityType bau,TYPE_BAU
       EntityColor bau,255,0,0
       PositionEntity bau,10,2,15


Collisions TYPE_PLAYER,TYPE_BAU,2,1


;//////////////////HAUPTSCHLEIFE\\\\\\\\\\\\\\\\\

While Not KeyHit(1)

update_player()
update_camera()
update_ant()
ants_create()

UpdateWorld
RenderWorld
Text 10,100, "bauzeit:" + bau_counter
Flip
Wend
End

;---------------------------------
Function update_player()

If KeyDown(200) Then MoveEntity player,0,0, 1
If KeyDown(208) Then MoveEntity player,0,0,-1
If KeyDown(203) Then TurnEntity player,0, 2,0
If KeyDown(205) Then TurnEntity player,0,-2,0

End Function

;---------------------------------
Function update_camera()

EntityParent(camera),player,0

End Function
;---------------------------------

Function ants_create()

If EntityCollided(player,type_bau) Then bau_able = True
If bau_able = True Then bau_counter = bau_counter +1          ;bauzeit


;wenn Bauzeit 100 ant erstellen
If bau_counter >= 100 Then
   bau_counter = 0                   ;bauprozess zu ende
   bau_able = False                  ;bau stoppen

 info.ant = New ant                  ;ameise erstellen
 info\ax = ax
 info\ay = ay
 info\az = az
 


 For info.ant = Each ant         
 
info\entity = CreateSphere()
   EntityType  info\entity,TYPE_ANT
   EntityColor info\entity,0,100,100
   PositionEntity info\entity, info\ax,info\ay+1,info\az+10 ;ameise setzten
   
   
Next
End If

End Function

;---------------------------------

;---------------------------------
Function update_ant()

For info.ant = Each ant
 
  PointEntity info\entity,player,1
  If EntityDistance(info\entity,player) >2 Then MoveEntity info\entity,0,0,0.5

Next

End Function



Hinweis: Um die spheren zu erstellen einfach kurz gegen die Rote box fahren.

Ich dank euch schon mal imm vorraus !!!!!!

mfg Dottakopf

BladeRunner

Moderator

BeitragMi, Jan 17, 2007 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
So was nennt man pushen, und das mögen wir gar nicht. Lass das bitte in Zukunft (das nächste mal werde ich schliessen).
Zu deinem Problem:
Du erstellst in ants_create() eine neue ant und weisst ihr eine Position zu. Mir unverständlicherweise gibst du ihr jedoch dann keine Sphere mit sondern iterierst durch alle vorhandenen instancen und erstellst dort spheres. Lassv die unsinnige for-each dort weg und es läuft.
(PS: Debugging hift da enorm.)
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

Dottakopf

BeitragDo, Jan 18, 2007 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine Hilfe, es hat funktioniert! Laughing
Des mit dem Pushen tut mir leid und kommt auch nicht mehr vor !


mfg Dottakopf

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group