beendet die WHILE aber wieso?

Posted By: Inari

beendet die WHILE aber wieso? - 10/14/09 19:37

Hallo Leute
ich habe ein Problem mit einer Funktion welche ich nicht ganz nachvollziehen kann, vieleicht hat einer von euch eine Idee wink

In Worten
Ich lasse über die MAIN eine WHILE laufen worin über eine IF, per Taste eine Funktion gestartet werden kann.
In der Funktion wird in Regelmäßigen abstand von ca ner Sekunde (mal mehr mal weniger) ein Entitie CREATET.
Die Entites bewegen sich per C_MOVE durch das Level, wenn sie aber einen gewissen Punkt erreichen (die KILLER) wird ein SKILL verändert und sie lösen sich langsam auf und löschen sind letztlich.
Sobald aber der erste sich gelöscht hat wird die WHILE in der MAIN beendet! Warum es so ist, ist das was ich nicht verstehe!

In Skript-Form
Code:
function main()
{
...	

while(1)
{	

if(key_enter == 1 ...) {starte_funktion();}

wait(1);
}

}

function Lied()
{
while (my != NULL)
{
....
if(((vec_dist(Killer1.x, me.x) < 2)
|| (vec_dist(Killer2.x, me.x) < 2)
|| (vec_dist(Killer3.x, me.x) < 2)
|| (vec_dist(Killer4.x, me.x) < 2))
{

my.skill40 = 4;
}

else
{

if(my.skill40 == 4)
{
my.alpha-=5*time_step;
if(my.alpha <= 10){ent_remove(me);}
}

}
wait (1);
}
}


Inari
Posted By: Superku

Re: beendet die WHILE aber wieso? - 10/15/09 02:16

Zu wenig Code, um Aussagen treffen zu können. Was ist z.B. starte_funktion ?
Posted By: maslone1

Re: beendet die WHILE aber wieso? - 10/15/09 09:16

es ist zwar tatsächlich zu wenig code angeführt um hier eine eindeutige antwort bzw. lösungsvorschlag anzugeben, aber ich glaube nicht, dass die while schleife in der main "gelöscht" wird.

Leicht zu testen: schreibe in der main-while schleife folgende anweisung:

if(key_t != 0) {printf("While Schleife in Ordnung",0);}
und nachdem der fehler eintritt drücke die taste "T".
Wenn du nun die Meldung erhältst, dann ist die while schleife noch aktiv und der fehler liegt tatsächlich wo anders...

Ich denke eher, dass der fehler beim versehentlichen löschen einer anderen funktion oder einer falschen anweisung entsteht.

Posted By: Slin

Re: beendet die WHILE aber wieso? - 10/15/09 10:04

Setz mal testweise vor dem löschen der Entity my und you gleich NULL.
Posted By: Rasch

Re: beendet die WHILE aber wieso? - 10/15/09 10:38

Ich hab das Gefühl das du einen Aufruf Fehler machst.

Statt key_enter == 1 in eine While Schleife zu packen und damit vermutlich deine Funktion aufzurufen die wiederum in einer While Schleife mit einer gewissen wait Zeit die Einheit erschafft wäre ein einmaliges starten korrekt.

Also entweder vor die while Schleife in der Main deine "Starte Funktion" legen oder per on_enter = starte_funktion aufrufen.

Da wir deinen Code nicht richtig einsehen können kann ich nur vermuten das deine Funktion so aussieht:

function starte_funktion()
{
while (1)
{
ent_create(entity, pos, Lied);
wait(random(-1));
{
}
Posted By: pegamode

Re: beendet die WHILE aber wieso? - 10/15/09 10:40

Um eine genaue Aussage machen zu können ist tatsächlich zu wenig Code da, da sich allerdings eine Veränderung ergibt, nachdem der ent_remove-Befehl aufgerufen wurde, deutet alles darauf hin, dass der my-Pointer an irgendeiner Stelle falsch gesetzt ist. Mit dem ent_remove werden alle Funktionen beendet, die zu dieser Entität gehören, samt ihrer Subfunktionen solange in diesen der my-Pointer nicht explizit auf NULL gesetzt wurde.

Zusätzlich würde ich die while-Schleife in der main entfernen und stattdessen lieber den on_enter-Befehl nutzen.

Gruß
Pegamode.
Posted By: Slin

Re: beendet die WHILE aber wieso? - 10/15/09 10:57

Originally Posted By: pegamode
Um eine genaue Aussage machen zu können ist tatsächlich zu wenig Code da, da sich allerdings eine Veränderung ergibt, nachdem der ent_remove-Befehl aufgerufen wurde, deutet alles darauf hin, dass der my-Pointer an irgendeiner Stelle falsch gesetzt ist. Mit dem ent_remove werden alle Funktionen beendet, die zu dieser Entität gehören, samt ihrer Subfunktionen solange in diesen der my-Pointer nicht explizit auf NULL gesetzt wurde.


Sag ich ja tongue Aber mit deiner Erklärung wird anderen vielleicht klarer warum...
Posted By: Inari

Re: beendet die WHILE aber wieso? - 10/15/09 17:02

Originally Posted By: H.F.Pohl
Zu wenig Code, um Aussagen treffen zu können. Was ist z.B. starte_funktion ?
ups... ich habe was vergessen crazy tut mir leid Leute

@maslone1
ich hatte in die WHILE der MAIN ne DRAW_TEXT Funktion gesetzt und es so erfahren frown das die WHILE beendet wird

@Slin
hab ich gemacht, hat das Skript aber überhauptnicht gemocht grin


vergesst den Code zu Anfang, ich setzt ihn mal neu rein
Code:
function main()
{
...	

while(1)
{	
draw_text("ich bin aktiv!",100,10,vector(100,100,255));
if(key_enter == 1 ...) {starte_funktion();}

wait(1);
}

}



Der "Creator_1" ist der Punkt (Entitie) im Level von dem aus
die Objekte geschaffen werden und ihren Weg durchs Level beginnen (per C_MOVE).
Code:
function Objekt1()
{ 
	my = ent_create ("Kugel.mdl", temp, Kraft); 
	my.skill1=Creator_1.skill1; // in den Skills sind die Positionswerte gespeichert
	my.skill2=Creator_1.skill2;
	my.skill3=Creator_1.skill3;
}

function starte_funktion()
{
	
	Objekt1();
	wait(-0.5);
	Objekt1();
	wait(-0.5);
	Objekt1();
	wait(-0.5);
	Objekt1();
}


Ich habe die Funktion etwas umgeschrieben, also nicht wundern wink
Code:
function Kraft()
{
...
while (my.alpha >= 10)
{

if(((vec_dist(Killer1.x, me.x) < 2)
|| (vec_dist(Killer2.x, me.x) < 2)
|| (vec_dist(Killer3.x, me.x) < 2)
|| (vec_dist(Killer4.x, me.x) < 2)) ...)
{
my.skill40 = 4;
}
else
{	
	
if(my.skill40 == 4) {my.alpha-=5*time_step;}	
}
wait (1);
}
ent_remove(me);
}


hoffentlich habe ich diesmal nichts vergesssen
Inari
Posted By: Widi

Re: beendet die WHILE aber wieso? - 10/15/09 17:23

Hast du auh schon den Vorschlag von Rasch probiert?

if(key_enter).... , da werden jedes Frame die Entities erzeugt, solange die Entertaste gedrückt wird. Wenn du die Taste nur eine halbe Sekunde drückst, wird bei einer Framerate von 60 die Function starte_function() 30 mal aufgerufen.
Verwende stattdessen on_enter...

Trotzdem sollte die main sich nicht beenden.
Posted By: Inari

Re: beendet die WHILE aber wieso? - 10/15/09 19:18

es wird noch verrückter
denn wie es aussieht wird die WHILE garnicht beendet!
ich habe hinter die WHILE ein sys_exit(NULL); gesetzt aber es wird einfach nicht aufgerufen!
Mit anderen Worten die WHILE wird garnicht beenden und ist doch nicht aktiv! hä?

@Widi
ich verhindere es durch eine "Verriegelung"
if(key_enter && block == 0) {block = 1;}

Außerdem will diese on_funktionen nicht bei funzen!?
zb aus dem Manual: function gexit() { sys_exit("bye bye..."); }on_x = gexit; es reagiert nichts wenn ich auf X drücke!
Posted By: Slin

Re: beendet die WHILE aber wieso? - 10/15/09 19:26

Code:
function Objekt1()
{ 
	my = ent_create ("Kugel.mdl", temp, Kraft); 
	my.skill1=Creator_1.skill1; // in den Skills sind die Positionswerte gespeichert
	my.skill2=Creator_1.skill2;
	my.skill3=Creator_1.skill3;
}


->
Code:
function Objekt1()
{ 
	you = ent_create ("Kugel.mdl", temp, Kraft); 
	you.skill1=Creator_1.skill1; // in den Skills sind die Positionswerte gespeichert
	you.skill2=Creator_1.skill2;
	you.skill3=Creator_1.skill3;
}




und

Code:
function gexit()
{
sys_exit("bye bye...");
}
on_x = gexit;


->
Code:
function gexit()
{
sys_exit("bye bye...");
}

void main()
{
on_x = gexit;
}


Posted By: Inari

Re: beendet die WHILE aber wieso? - 10/15/09 19:41

äh...danke...

vielen vielen und vielen dank Slin aber auch an alle anderen dich sich gedanken gemacht habe, danke Leute
Posted By: Slin

Re: beendet die WHILE aber wieso? - 10/15/09 19:44

Alternativ könnte das my natürlich auch bleiben aber dann am Ende der funktion my = NULL; wink
Aber schön, dass es funktioniert.
Posted By: Rasch

Re: beendet die WHILE aber wieso? - 10/16/09 16:52

Noch ne Idee statt die Position des Creators in skills zu speichern einfach dem Creator ne Action geben und einen Pointer.

Also

ENTITY* creator;

action creator()
{
creator = my;
}

Dann die Entites an der Creator Position ent_createn. Würde für mich mehr Sinn machen also die Skills sofern ich das jetzt richtig verstanden habe.
© 2024 lite-C Forums