Local Entity* in A6

Posted By: dice

Local Entity* in A6 - 12/28/10 23:24

Hi!

Im using C-Script with A6.

I want to create a local entity within a function (with Entity*). But he always answers with an error. So my question: Is it possible to do it in A6?

My Code:
Code:
function tower_shoot
{
	entity* ent_local;
	//some other code...
}


Posted By: Rackscha

Re: Local Entity* in A6 - 12/28/10 23:38

try ENTITY not entity (if it differs between uper and lower case..cant remember if c-script differs between those)
Posted By: SchokoKeks

Re: Local Entity* in A6 - 12/28/10 23:47

as far as i remember (haven't used c-script in a year), you can not have local entity pointer in c-script. use handle() and ptr_for_handle instead and save the pointer into a local var or skill.

@Rackscha: c-script does not differ between upper and lower case for most keywords.
Posted By: dice

Re: Local Entity* in A6 - 12/29/10 12:36

Thx, ill try to explain my whole problem in my mothertongue:

Also ich möchte mein eigenes Towerdefense Spiel erstellen. Komme aber nicht wirklich weiter, ich versuchs mal zu schildern:

Ich erstelle per Button Klick einen Tower und setze ihn auf einen Platz, von wo er die Monster, die einen bestimmten Weg ablaufen, selbstständig beschießen soll.

Code:
you = ent_create(tower001_mdl,mouse_ent.x,tower_schiesse);



Diese Funktion "tower_schiesse" prüft nun in einer Endlosschleife, ob sich Monster in seiner Reichweite befinden, auf die er feuern kann.

Den Monstern habe ich einen bestimmten Skillwert zugewiesen damit der Tower weiß, welche Entities er beschießen soll.

Jedoch suche ich in der Funktion "tower_schiesse" die Monster nur mit dem "YOU" Entity und der Funktion you = ent_next(you);

Damit kommen sich die ganzen Tower, die ich erstelle in die Quere, weil sie alle auf das gleiche aussind und somit nur der zuletzt erstellte Tower schießt.

Ich hab die Vermutung dass ich das ganze schon falsch angegangen bin und nen Denkfehler drin hab... hoffe da gibs nen Trick oder irgendeine Lösung für mein Problem! (der Einsatz von handle und ptr_for_handle() is mir noch nich ganz geläufig)

Hier noch die Fkt "tower_schiesse":

Code:
function tower_schiesse
{
	while(1)
	{
		you = ent_next(NULL); //erstes entity aussuchen
		
		//Ausschau halten nach Entitys mit Skill12 == 1
		if (you.skill12 > 0)
		{
			//jetzt auf ein Entity festlegen!
			while(you)
			{
				while (ent_tower001 == NULL) { wait(1);}
				if (vec_dist(my.x,you.x) < 200)
				{
					//Angreifen!
					you.skill12 -= angriff_tower001;
					show_angriff(angriff_tower001);
					
					//wenn skill(leben) zu klein dann tot
					if (you.skill12 <= 0)
					{
						ent_remove(you);
					}
				}
				else
				{
					//wenn die distanz überschritten wird, oder noch nicht erreicht ist, dann soll er sich ein neues entity suchen:
					goto neuesEntity;
					
				}
				
				//hiermit wird die angriffsgeschwindigkeit bzw die verzögerung festgelegt
				sleep(geschw_tower001*time);
				wait(1);
			}
		}
		else
		{
			neuesEntity: //SPRUNGMARKE Für Innere Schleife, um eine neue Entity auszusuchen!
			//wenn ds entity kein Skill == 1 hat, dann nächstes Entity auswählen!
			you = ent_next(you);
		}
		
		wait(1);
	}
}



Vielen Dank für deine Mühe!
Posted By: SchokoKeks

Re: Local Entity* in A6 - 12/29/10 16:57

Ich habe meine vorschläge mal etwas gegliedert:

1. Die Monster sollten auch eine eigene funktion mit endlosschleife haben. Der Teil
Code:
//wenn skill(leben) zu klein dann tot
					if (you.skill12 <= 0)
					{
						ent_remove(you);
					}


sollte auf jedenfall dort rein, und nicht in die funktion des turms. das ist sonst keine saubere trennung, und du wirst nur durcheinanderkommen.

2.
Code:
you = ent_create(tower001_mdl,mouse_ent.x,tower_schiesse);

Hier scheint das "you" mir am anfang recht sinnlos. Es hat aber glaube ich nichts mit dem problem zu tun was du hast.

3.
Code:
while (ent_tower001 == NULL) { wait(1);}

leuchtet mir nicht ein. ich hoffe du willst nicht jeden erstellten turm mit 1 bis x durchnummerieren? das gleiche für die anderen variablen. Hier müsstest du ja für jeden turm eine eigene funktion schreiben. Nutze da lieber ein Array oder versuch ganz ohne eine durchnummerierung auszukommen, indem du angriffswert und geschw in skills des jeweilen towers speicherst.

4. scheint der fehler in der funktion show_angriff zu liegen, denn du hast ent_next und you soweit ich sehen konnte korrekt benutzt. kannst du die nochmal zeigen?
Posted By: Saturnus

Re: Local Entity* in A6 - 12/29/10 18:07

Die Sprungmarke könnte auch problematisch sein. Soweit ich weiß, muss das Ziel einer Sprungmarke im selben Anweisungsblock liegen wie das goto selbst.
Versuche mal, ohne Sprungmarken auszukommen; die machen es oft nur schwerer, dem Programmfluss zu folgen.
Posted By: dice

Re: Local Entity* in A6 - 12/29/10 23:05

Danke für eure geopferte Zeit wink

Ich halte mich mal an deiner Gliederung:
zu 1.) Da hast du recht, hab ich jetzt auch so realisiert!
zu 2.) Stimmt, kann weg, ist aber nur nen Schönheitsfehler laugh
zu 3.) Bei C-Skript gibt es doch diese "Skript Fallen", die auf einen Empty Pointer verweisen! Dieser Ausdruck sorgt nur dafür dass am Anfang keine Fehlermeldung kommt, dass der Tower noch nicht da steht. In diesem Fall kann der Ausdruck aber auch entfallen, da ich den Tower garnicht mehr so anspreche! (war noch aus den vorigen Versionen)
zu 4.) show Angriff funzt einwandfrei, sorgt nur dafür dass ich sehe, dass etwas passiert (leben abgezogen wird vom Entity)

zum GOTO: Ich weiß, GOTO's sind nicht ganz sauber und man sollte es vermeiden diese zu benutzen, aber in diesem Fall funktioniert es und irgendwie muss ich ja aus dieser Schleife rausspringen, wenn die Entfernung über den angegebenen Wert ist! Das Entity muss ja nich zwangsläufig weg sein, sondern "while(you)" ist ja immer noch gültig! Jedenfalls liegt mein Problem woanders:

Das Problem besteht nämlich weiterhin. Die Tower, die ich erstelle, kennen jeweils nur alle den "YOU" Pointer und greifen nur ein und dasselbe Entity an! Bzw sie bündeln nichtmal ihren Angriff (bei 3 Tower zusammen im gleichen Radius müsste ja 3 mal soviel HP abgezogen werden bei den Monstern, klappt aber nich)

Deswegen auch zu erst die Frage, ob man ein lokales Entity mit übertragen kann, damit jede Funktion ihre eigene entity angreift! Wie kann ich das mit handle() und ptr_for_handle() realisieren?!

Hier mal die "neue" Funktion tower_schiesse:
Code:
function tower_schiesse
{	
	while(1)
	{
		you = ent_next(NULL); //erstes entity aussuchen
		
		
		
		//Ausschau halten nach Entitys mit Skill12 == 1
		if (you.skill12 > 0)
		{
			//jetzt auf ein Entity festlegen!
			while(you)
			{
				if (vec_dist(my.x,you.x) < my.skill51)
				{
					//Angreifen!
					you.skill12 -= my.skill50;
					show_angriff(my.skill50);
				}
				else
				{
					//wenn die distanz überschritten wird, oder noch nicht erreicht ist, dann soll er sich ein neues entity suchen:
					goto neuesEntity;
					
				}
				
				//hiermit wird die angriffsgeschwindigkeit bzw die verzögerung festgelegt
				sleep(geschw_tower001*time);
				wait(1);
			}
		}
		else
		{
			neuesEntity: //SPRUNGMARKE Für Innere Schleife, um eine neue Entity auszusuchen!
			//wenn ds entity kein Skill == 1 hat, dann nächstes Entity auswählen!
			you = ent_next(you);
		}
		
		wait(1);
	}
}



Gruß, dice
Posted By: Pappenheimer

Re: Local Entity* in A6 - 12/29/10 23:20

Wenn eine Entity eine andere Entity als you zur Verfügung hat, kann sie die Nummer, die die Engine dieser Entity verliehen hat speichern, und zwar am besten in einem seiner eigenen Skills, da nur sie selbst auf den Skill zugreifen wird.

also so z.B.

if(you)
{
my.skillXX = handle(you);//XX steht für eine Zahl zwischen 1 und 100
}

Wenn die Entity später wieder auf diese Entity mit dem you-Pointer zugreifen will, wird ihre im Skill gespeicherte Nummer der Engine wieder hergeholt und sie darüber "you" zugewiesen.

z.B. so

if(my.skillXX != 0)
{
you = ptr_for_handle(my.skillXX);
}
Posted By: dice

Re: Local Entity* in A6 - 12/30/10 13:33

Ja schön und gut, aber damit muss ich ja wieder auf das YOU zurückgreifen und dauernd zuweisungen machen.

Und da dieses YOU global zu sein scheint, hilft mir das auch nicht weiter, da ja jeder Tower autark handeln soll und andere Entities als Ziele nehmen soll.

Das heißt ich müsste für jeden Tower der gebaut wird, einen extra Pointer schreiben, weil Pointer kann man ja auch nicht wie Arrays anschreiben.... (das wäre des Rätsels lösung wink ).

Ich verzweifel grad grin ......
Posted By: Superku

Re: Local Entity* in A6 - 12/30/10 14:52

(me+) you ist für jede Entity lokal.
Posted By: dice

Re: Local Entity* in A6 - 12/30/10 16:55

So nach langem Hin und Her und stundenlangem Rumprobieren bin ich auf eine Lösung gekommen!

Und woran lag es letztendlich? Die Funktionen you = ent_next(null); zu Beginn und you = ent_next(you); am Ende der Funktion waren einfach falsch belegt.

Sobald ich einen Tower gebaut hab, ist dieser ja als neues Entity selber auf sich gesprungen und somit war you == me!

Nun sieht meine Funktion folgendermaßen aus:

Code:
function tower_schiesse()
{
	my.z = 50;
	my.scale_x = 0.3;
	my.scale_y = 0.3;
	my.scale_z = 0.3;
	
	you = ent_next(NULL); //außerhalb der Schleife!!!!
	
	while(1)
	{
		you = ent_next(you); //erstes entity aussuchen
		
		//Ausschau halten nach Entitys mit Skill12 == 1
		if(you)
		{
			if (you.skill12 > 0)
			{
				//jetzt auf ein Entity festlegen!
				while(you)
				{				
					if (vec_dist(my.x,you.x) < my.skill51)
					{
						//Angreifen!
						you.skill12 -= my.skill50;
						show_angriff(my.skill50);
					}		
					else
					{
						goto neuesEntity;
					}		
					//hiermit wird die angriffsgeschwindigkeit bzw die verzögerung festgelegt
					sleep(geschw_tower001*time);
					wait(1);
				}
			}
		}
		

		neuesEntity: //SPRUNGMARKE Für Innere Schleife, um eine neue Entity auszusuchen!
		
		wait(1);
	}
}



Ich weiß, die GOTO ist immer noch drin, aber jetzt funktioniert es ersteinmal einwandfrei und jeder Tower greift anständig sein eigenes Creep an und sie bündeln ihren Angriff... laugh

Hab zwar auch ne Weile grübeln müssen, bis ich auf die banale Lösung kam, aber trotzdem vielen Dank für alle Hilfestellungen eurerseits laugh

Edit: Achja, die leeren Parameterklammern haben auch gefehlt, deswegen hats auch nich geklappt! (function tower_schiesse() )
© 2024 lite-C Forums