[Gelöst] Frage zu Flags2- sehr einfache Tag und Nacht Funktion

Posted By: WeTwoPlays

[Gelöst] Frage zu Flags2- sehr einfache Tag und Nacht Funktion - 04/09/13 20:03

Ich wollte für eine Tag und Nacht änderung die VISIBLE flag der beiden Sky Entitys setzen, bzw. entfernen, es funktionierte allerdings nicht.
Code:
function time()
{
	while(1)
	{
	wait(-1);
	time += 1;
	}
	if(time>12)
	{
		if(time<12)
		{
			reset(sky_1,VISIBLE);
			set(sky_2,VISIBLE);
			wait(1);
		}
		while(time>12)
		{
			reset(sky_2,VISIBLE);
			set(sky_1,VISIBLE);
			wait(1);
		}
		wait(1);
	}
}



Hier die beiden Entitys:
Code:
ENTITY* sky_1 = 
{
	type = "himmel.png";
	layer = 103;
	u = 0.7;
	v = 0.7;
	scale_x = 0.5;
	scale_y = 0.5;
	tilt = -200;
	flags2 = SKY| DOME | VISIBLE;
}

ENTITY* sky_2 = 
{
	type = "himmel2.png";
	layer = 102;
	u = 0.7;
	v = 0.7;
	scale_x = 0.5;
	scale_y = 0.5;
	tilt = -200;
	flags2 = SKY| DOME ;
}



Könnte es sein dass sich set und reset nicht auf flags2? auswirkt?
Und hat eventuell jemand eine kürzere Variante?

Danke
Posted By: Ascalon

Re: Frage zu Flags2 - 04/09/13 20:37

probiers mal so: sky_1.flags2 &= ~SHOW;
Posted By: Superku

Re: Frage zu Flags2 - 04/09/13 20:38

VISIBLE gibt es nicht mehr, nur noch die Flags INVISIBLE (für Level-Entities) und SHOW (für View-Entities).

set und reset sind Makros, die sich, wie bereits von dir bezweifelt, nur auf die gewöhnlichen flags auswirken. Du kannst dir für flags2 selbst solche definieren oder die betreffenden flags direkt setzen, bspw. wie folgt:
sky_1.flags2 |= SHOW; // an
sky_1.flags2 &= ~SHOW; // aus

Deine Funktion "time" ist zudem nicht sonderlich gut durchdacht, nicht nur, dass Variable und Funktionenname gleich heißen, sondern auch, dass der Bereich hinter der while-Schleife niemals ausgeführt wird. Zudem empfehle ich, die Verwendung der wait-Funktion mit negativem Argument zu vermeiden. Wenn ich die Absicht der Funktion korrekt verstehe, lässt sie sich alternativ schreiben wie folgt:

Code:
void do_sky()
{
	var time = 0;
	sky_1.flags2 |= SHOW;
	sky_2.flags2 &= ~SHOW;
	while(1)
	{
		while(time < 12*16) // 16 ticks = 1 Sekunde
		{
			time += time_step;
			wait(1);
		}
		sky_1.flags2 &= ~SHOW;
		sky_2.flags2 |= SHOW;
		time = 0;
		while(time < 12*16)
		{
			time += time_step;
			wait(1);
		}
		sky_1.flags2 |= SHOW;
		sky_2.flags2 &= ~SHOW;
		wait(1);
	}
}

Posted By: WeTwoPlays

Re: Frage zu Flags2 - 04/10/13 19:29

Code:
while(1)
	{
		while(time < 12*16) // 16 ticks = 1 Sekunde
		{
			time += time_step;
			wait(1);
		}
		sky_1.flags2 &= ~SHOW;
		sky_2.flags2 |= SHOW;
		time = 0;
		while(time < 12*16)
		{
			time += time_step;
			wait(1);
		}
		sky_1.flags2 |= SHOW;
		sky_2.flags2 &= ~SHOW;
		wait(1); 
	}



vor dem letzen wait(1); fehlt ein time = 0;, sonst blinkt der Nachthimmel(sky_1) nur kurz auf, nicht für 12 Sekunden, wenn ich mir erlauben darf dich zu verbessern.
Logische erklärung: time ist am Ende der Schleife immer noch 12*16, daher wird die erste while(time < 12*16) Schleife ausgelassen, der sky_1 ist ein Tick sichtbar, dann wird der Himmel auf sky_2 gestellt und time auf 0 gestellt.

richtiger Code:
Code:
void do_sky()
{
	var time = 0;
	sky_1.flags2 |= SHOW;
	sky_2.flags2 &= ~SHOW;
	while(1)
	{
		while(time < 12*16) // 16 ticks = 1 Sekunde
		{
			time += time_step;
			wait(1);
		}
		sky_1.flags2 &= ~SHOW;
		sky_2.flags2 |= SHOW;
		time = 0;
		while(time < 12*16)
		{
			time += time_step;
			wait(1);
		}
		sky_1.flags2 |= SHOW;
		sky_2.flags2 &= ~SHOW;
		time = 0; //<-- das entscheidende Stück
		wait(1);
		
	}
}

Posted By: Superku

Re: Frage zu Flags2 - 04/10/13 20:13

Das war eine mit Absicht eingebaute Denkaufgabe für dich, und du hast sie mit Bravour gemeistert!
© 2024 lite-C Forums