Frage zu Fog of War aus AUM43

Posted By: rayp

Frage zu Fog of War aus AUM43 - 04/27/09 14:04

Habe diesen Code aus AUM43
Code:
function manage_fog()
{
    my.tilt = 90;
    my.alpha = 100;
    my.oriented = on;
    my.transparent = on;
    my.passable = on;
    while (1)
    {
       if (vec_dist(player.x, my.x) < 350)
       {
          my.alpha = 0;
       }
       else
       {
         my.alpha = 100;
       }
       wait (1);
    }
} 

Das ist auch alles schön und gut. Mein Problem ist aber das ich kein PLAYER habe, sondern viele verschiedene Einheiten die man steuern kann (auch gleichzeitig). Sprich fällt PLAYER.X (was ja zwingent nötig ist) flach. Impact kann ich nicht nehmen da die Sprites ja passable sind (und sowie so zu hoch für eine Kollision mit Models...schweben ja über dem Spielfeld).
Kann mir jmd sagen, wie ich einen Entity-Array per Schleife durchgehe?
Oder eine andere Lösung?
Wie gesagt, Problem ist, das sich verschiedene Einheiten auf dem Spielfeld bewegen, nicht nur ein PLAYER=ME-Model.

Wie immer bin ich für alle Hilfen dankbar ^^

Edit:
Ich glaube die Lösung liegt in Handles (siehe AUM47). ^^
Posted By: Ralph

Re: Frage zu Fog of War aus AUM43 - 04/27/09 16:49

Erstellst du deine Einheiten per Script?
Wenn ja mach das doch so:
Das schreibst du an ganz oben zu den Variablen im Script.
Code:
var* unitHandleArray[max_entities];
var unitHANum = 0;//Nummer der schon eingetragenen Einheiten


Das in die Funktion wo du die Einheiten erstellst.
Code:
you = ent_create("sphere.mdl",nullvector,NULL);//Hier kommt deine ent_create Funktion hin
unitHandleArray[unitHANum] = handle(you);
unitHANum++;

Und das ist die neue "FOG" Funktion.
Code:
function manage_fog()
{
    my.tilt = 90;
    my.alpha = 100;
    my.oriented = on;
    my.transparent = on;
    my.passable = on;
    ENTITY* ent; //temp Entity-Pointer
    var i = 0;
    while (1)
    {
       for(i=0;i<unitHANum;i++)
       {
          ent = ptr_for_handle(unitHandleArray[i]);
          if (vec_dist(ent.x, my.x) < 350)
          {
             my.alpha = 0;
          }
          else
          {
            my.alpha = 100;
          }
          ent = NULL;
       }
       wait (1);
    }
}


Ich habe das jetzt nicht getested, sollte aber funktionieren.
MFG Ralph
Posted By: rayp

Re: Frage zu Fog of War aus AUM43 - 04/27/09 19:08

Danke!
Irgendwie geht da nix von. Die ++ Kommandos sowie FOR kennt meine A6 nicht mal. Ich dachte auch an FOR (durch Delphi)...aber kennt er net.

Edit:
ES GEHT EINFACH NICHT, ICH DREH BALD DURCH

Code:
function manage_fog()
{
    my.tilt = 90;
    my.alpha = 100;
    my.oriented = on;
    my.transparent = on;
    my.passable = on;
    WHILE(Zomb_Index==0) { WAIT(1); }

    while (1)
    {

          Carry_Zomb_Array = ptr_for_handle(Zomb_Array[MY.SKILL90]);

IF(Carry_Zomb_Array!=NULL) {
          if (vec_dist(Carry_Zomb_Array.x, my.x) < 350)
          {
             my.alpha = 0;my.invisible=ON;
          }
          else
          {
            my.alpha = 100;
          }
         Carry_Zomb_Array = NULL;
}
 IF (MY.SKILL90>Zomb_Index) { MY.SKILL90=0; }
 ELSE { MY.SKILL90+=1; }
 

       wait (1);
    }
}

So läuft es. ABER: Wenn ich drei Einheiten erstellt hab, geht die zweite auf einmal nicht mehr?!?? Irgendwo ist sowas von der Wurm drin, ich sehe keinen Fehler, ich bin total verwirrt frown *flenn*
Das ist der totale Horror. Es geht, aber auch nicht. Erstellt man wiegesagt ein paar Einheiten, dann wechseln sie sich ab, mit Fog-"Fressen". Manchma können sie plötzlich den Fogofwar nicht mehr vertreiben...ein anderes mal schon...HILFE
Posted By: Ralph

Re: Frage zu Fog of War aus AUM43 - 04/27/09 20:56

Ach du hast A6? Sorry da kann ich weniger helfen... ansonsten guck ich mal Morgen wenn ich wieder zuhause bin.
Posted By: Ralph

Re: Frage zu Fog of War aus AUM43 - 04/27/09 21:03

Okay dann versuch ich das mal zu convertieren...
"unitHANum++;" daraus machst du "unitHANum += 1;"

Und die manage_fog ersetzt du durch das:
Code:
function manage_fog()
{
    my.tilt = 90;
    my.alpha = 100;
    my.oriented = on;
    my.transparent = on;
    my.passable = on;
    ENTITY* ent; //temp Entity-Pointer
    var i = 0;
    var unitisnear = 0; //neue var die speichert ob eine Einheit in der nähe ist
    while (1)
    {
       while(i < unitHANum)
       {
          ent = ptr_for_handle(unitHandleArray[i]);
          if (vec_dist(ent.x, my.x) < 350 && unitisnear == 0)
          {
             unitisnear = 1;
          }
          ent = NULL;
          i += 1;
       }
       if (unitisnear == 1)
       {
          my.alpha = 0;
       }
       else
       {
         my.alpha = 100;
       }
       unitisnear = 0;
       i = 0;
       wait (1);
    }
}


So müsste es funktionieren.
Posted By: rayp

Re: Frage zu Fog of War aus AUM43 - 04/27/09 21:04

ja. Aber das liegt ja nicht an A6 oder A7 oder sonst was...irgendwas ist schlecht programmiert in der WHILE Schleife....aber was?
Hier mal mein kompletter code. Es geht teilweise. Mal klappts mal nicht...irgendwas ist total falsch:

Code:
var Zomb_Index=0;         
var Zomb_Array[100];      
entity* Carry_Zomb_Array; 


function Init_Unit()
{
    Zomb_Array[index] = handle (me);
    Zomb_index += 1;
..
.
}

function manage_fog()
{
    my.tilt = 90;
    my.alpha = 100;
    my.oriented = on;
    my.transparent = on;
    my.passable = on;
    WHILE(Zomb_Index==0) { WAIT(1); }

    while (1)
    {

          Carry_Zomb_Array = ptr_for_handle(Zomb_Array[MY.SKILL90]);

IF(Carry_Zomb_Array!=NULL) {
          if (vec_dist(Carry_Zomb_Array.x, my.x) < 350)
          {
             my.alpha = 0;my.invisible=ON;
          }
          else
          {
            my.alpha = 100;
          }
         Carry_Zomb_Array = NULL;
}
 IF (MY.SKILL90>Zomb_Index) { MY.SKILL90=0; }
 ELSE { MY.SKILL90+=1; }
 

       wait (1);
    }
}


starter create_fog_sprites()
{
WHILE (Zomb_Index==0) { WAIT(1); }

    var row_index = 0;
    var column_index = 0;
    while (row_index < 64)
    {
       while (column_index < 64)
       {
          column_index += 1;
          temp.x = column_index * 128 - 4000; // -2000 to 2000 on x
          temp.y = row_index * 128 - 4000; // -2000 to 2000 on y
          temp.z = CAMERA.Z-450;
          ent_create ("fogofwar.tga", temp.x, manage_fog);
       }
       column_index = 0;
       row_index += 1;
    }
} 


Edit:
Ich probier mal deinen Code aus


Wenn ich die erste Einheit erstelle geht es...danach bekomm ich die VEC_DIST Zeile mit LEEREN POINTER angezeigt...keine Ahnung warum.

Das kann garnicht sein, da die Schleife ja nur bis Array-Maxiumum läuft ?!"?!?!
Posted By: Ralph

Re: Frage zu Fog of War aus AUM43 - 04/27/09 21:10

Okay dann mach mal vor "ent = NULL;" oder wie das bei dir heißt:
unitHandleArray[i] = handle(ent); //bei ent das was du hast

Sonst schick mir schnell das ganze Projekt zu dann guck ich mir das mal an... so aus der ferne das zu beurteilen is ein wenig schwirig..
Posted By: rayp

Re: Frage zu Fog of War aus AUM43 - 04/27/09 21:15

OHHHH Man bin ich sch* blöd! Hatte die Unit mit falscher VAR erstellt! Also falsche var in der eckigen Klammer.....MAN wie dumm. Das hat mich nun einen Tag gekostet, und 3 Jahre Lebensdauer (vor Aufregung).

Ich danke Dir, Ralph, für Deine nette Hilfe ^^

Ps. dein script funzt super (wenn ich die richtigen Vars habe*g)
Posted By: Ralph

Re: Frage zu Fog of War aus AUM43 - 04/27/09 21:21

Kein ding..
Posted By: rayp

Re: Frage zu Fog of War aus AUM43 - 04/27/09 21:23

Also das funzt nun...habe die Stelle mit der falschen VAR (von mir) mit Kommentar versehn ^^
Code:
var Zomb_Index=0;              //how many zombies are in the array
var Zomb_Array[100];         //Array for all active Zombies

ACTION Add_To_Object_In_Wed {
    Zomb_Array[Zomb_Index] = handle (me); //HIER WAR DIE FALSCHE VAR
    Zomb_index += 1;
}
    ENTITY* ent; //temp Entity-Pointer

function manage_fog()
{
    my.tilt = 90;
    my.alpha = 100;
    my.oriented = on;
    my.transparent = on;
    my.passable = on;

    var i = 0;
    var unitisnear = 0; //neue var die speichert ob eine Einheit in der nähe ist
    while (1)
    {
       while(i < Zomb_Index)
       {
          ent = ptr_for_handle(Zomb_Array[i]);
          if (vec_dist(ent.x, my.x) < 350 && unitisnear == 0)
          {
             unitisnear = 1;
          }
          ent = NULL;
          i += 1;
       }
       if (unitisnear == 1)
       {
          my.alpha = 0;my.invisible=ON;
       }
       else
       {
         my.alpha = 100;
       }
       unitisnear = 0;
       i = 0;
       wait (1);
    }
}




starter create_fog_sprites()
{
WHILE (Zomb_Index==0) { WAIT(1); }

    var row_index = 0;
    var column_index = 0;
    while (row_index < 64)
    {
       while (column_index < 64)
       {
          column_index += 1;
          temp.x = column_index * 128 - 4000; // -2000 to 2000 on x
          temp.y = row_index * 128 - 4000; // -2000 to 2000 on y
          temp.z = CAMERA.Z-450;
          ent_create ("fogofwar.tga", temp.x, manage_fog);
       }
       column_index = 0;
       row_index += 1;
    }
} 

Gute Nacht und nochma danke!

Edit:
Rein Framerate-Technisch ist der Fog of War irgendwie ein Supergau frown ...oder sagen wirs so, wenns heiss her geht, habe ich 20fps verloren ! Allerdings bei 5000x5000
Quants, 64 Reihen und 64 Spalten fog.
Posted By: hopfel

Re: Frage zu Fog of War aus AUM43 - 04/28/09 10:11

Hm kannst des ja mal versuchen:

if (c_scan(my.x, nullvector, vector(360 ,0, 350), IGNORE_ME)< 350 && unitisnear == 0)

c_scan gibt den Abstand zu der Entity zurück die am nahesten des Scan-ursprungs steht.

PS: Ich hab keine Ahnung von A6, aber bei A7 funzt es.
Posted By: rayp

Re: Frage zu Fog of War aus AUM43 - 04/28/09 15:07

Könnte sein, das c_scan schneller ist als vec_dist, muss ich mal nachlesen. Fakt ist, das mir der Fog of War keine 20fps wert ist. Ohne Fog of War: 41fps
und mit +-21fps....neee ^^

Ich muss mir was einfallen lassen, das man nur soweit scrollen kann wie Einheiten bewegt wurden (Spiel ist in Vogelperspektive). Gestern scheiterte ich daran kläglich
© 2024 lite-C Forums