Problem bei Spieleprogrammierung mit C-Skript

Der Badner

Tabletop-Fanatiker
06. Juni 2006
3.731
1
6.644
21.982
34
Hennigsdorf
Also, ich programmiere meinen Eigenen Shooter im W40k-Universum.
Das Spiel heißt Titanicus (dreimal raten, was man da wohl ist).
Ich schreibe mal den Code hin, die Problemstellen sind farbig markiert, die Fragen weiter unten:

////////////////////////////////////////////////////
// Titanen-Skript
////////////////////////////////////////////////////
////////////////////////////////////////////////////
// Pfade
////////////////////////////////////////////////////
PATH "Bilder";
PATH "Modelle";
PATH "Skripte";
PATH "Sounds";
////////////////////////////////////////////////////
// INCLUDE-Dateien
////////////////////////////////////////////////////
INCLUDE <Wetter.wdl>;
INCLUDE <Bewegung.wdl>;

////////////////////////////////////////////////////
// Imperialer Warhound
////////////////////////////////////////////////////

STRING Warhound = <test_titan2.mdl>;
SOUND Warhound_motor = <Warhound_motor.wav>;
SOUND explosion = <Plasma.wav>;
BMAP Plasmamap = <Plasma.bmp>;
VAR dist[3];
VAR force[3];
VAR friction;
VAR Plasmaabschuss[3];
VAR Plasmageschoss_v[3];
VAR Abschuss[3];

FUNCTION vec_randomize(&vec,range)
{
vec[0] = random(1) - 0.5;
vec[1] = random(1) - 0.5;
vec[2] = random(1) - 0.5;
vec_normalize(vec,random(range));
}

FUNCTION lebensdauer()
{
my.alpha -= time + time;
if(my.alpha <= 0) { my.lifespan = 0;}
}

FUNCTION effect_explo()
{
vec_randomize(temp,10);
vec_add(my.vel_x,temp);
my.alpha = 80 + random(25);
my.bmap =Plasmamap;
my.flare = on; my.bright = on; my.beam = on; my.move = on; my.function =

lebensdauer;
}


ENTITY Plasma
{
type = <plasmageschoss.mdl>;
}
FUNCTION Treffer_Boden
{
if(event_type == event_block)
{
vec_set(temp,my.x);
ent_remove(my);
effect(effect_explo,10000,temp,normal);
snd_play(explosion,100,0);
WAIT(1);
}
}

FUNCTION Treffer_Feind
{
if(event_type == event_impact)
{
ent_remove(you);
effect(effect_explo,10000,my.x,normal);
WAIT(1);
}
}
ACTION Plasmageschoss
{

my.red = 155;
my.blue = 255;
my.green = 155;
my.push = -1;
WHILE(1)
{

my.lightrange = 500;
Plasmageschoss_v.x = time * 70;
Plasmageschoss_v.y = -1.8 * time;
Plasmageschoss_v.z = -time * 2.5;

move_mode = ignore_passable + ignore_passents + ignore_sprites;
ent_move(Plasmageschoss_v.x,nullvector);
my.enable_block = on;
my.enable_entity = on;
my.event = Treffer_Boden;
WAIT(1);

}
}

FUNCTION Schiessen(test)
{
if(test == 280)
{
snd_play(explosion,100,0);
ent_create(Plasma,Plasmaabschuss.x,Plasmageschoss);
}
}



ACTION I_Warhound
{
my.frame = 1;
my.push = 10;
WHILE(1)
{
force.pan = -10 * key_force.x;
my.skill14 = time * force.pan + max(1-time*0.7,0) * my.skill14;
my.pan += time * my.skill14;

vec_set(temp,my.x);
temp.z = -4000;
trace_mode = ignore_me + ignore_sprites + ignore_models + use_box;
result = trace(my.x,temp);
if (result > 5)
{
force.x = 0;
force.y = 0;
force.z = -0.5 * result;
friction = 0.5;
}
else
{
force.x = 5 * key_force.y;
force.y = 0;
force.z = -2 * result;
friction = 0.5;
if(force.x == 5){ my.frame += time * 0.2;

if(my.frame > 7)
{
my.next_frame = 1;
}
else
{
my.next_frame = 0;
}
if(my.frame >= 8)
{
my.frame -= 5;
}
}

if(force.x == -5){ my.frame += time * 0.2;


if(my.frame > 7)
{
my.next_frame = 1;
}
else
{
my.next_frame = 0;
}
if(my.frame >= 8)
{
my.frame -= 5;
}
}
}

my.skill11 = time * force.x + max(1-time*friction,0) * my.skill11;
my.skill13 = time * force.z + max(1-time*friction,0) * my.skill13;
dist.x = time * my.skill11;
dist.y = 0;
dist.z = time * my.skill13;


move_mode = ignore_passable + glide;
ent_move(dist,nullvector);

Plasmaabschuss.x = my.x;
plasmaabschuss.y = my.y + 50;
Plasmaabschuss.z = my.z - 25;



camera_1st();
on_mouse_left = Schiessen;
WAIT(1);
}
}

////////////////////////////////////////////////////
// Feind
////////////////////////////////////////////////////
VAR distfeind[3];
VAR forcefeind[3];
SOUND Beep = <BUMM.wav>;
ACTION Feind
{
my.push = 5;
While(1)
{
my.enable_impact = on;
my.event = Treffer_feind;

Wait(1);
}
}



1. Also, bei diesen Textstellen sollen Plasmageschosse an einem bestimmten Punkt erscheinen und dann zum Zielpunkt fliegen. Es funktioniert auch, aber nur in eine Richtung. Kurz gesagt, drehen und schießen geht nicht.

2. Hier soll bei Abschuss und Aufprall ein bestimmter Sound gespielt werden. Jedoch funktioniert das nur selten und scheinbar wahllos.

3. Bei Aufprall explotdiert natürlich das Geschoss. Im Grunde funktioniert das auch, nur, wenn ich mehrere Geschosse hintereinander abschieße, explodiert zwar das erste Geschoss, sobald aber das zweite auftrifft, verschwindet die erste Explosion und die zweite taucht dafür auf.


Falls jemand die Lösung auf eines der Probleme kennt, bin ich für Antworten sehr dankbar.

mfG
Benny
 
mal was anderes:
Was würdet ihr gerne für Einheiten in einem Spiel sehen, in denen man Titanen steuert?
Erstmals bitte nur für Imperium und Chaos.
Bisher hab ich nur ne Tremor-Geschützplattform und einen Warhound-Scout-Titanen.
Reaver-,Warlord- und natürlich Imperator-Kampftitanen werden für beide Seiten folgen.

Nochmal was: Der Einfachheit halber spielt das erst mal in einem Cockpit. Da ich aber ne ziemliche Lusche beim Zeichnen am PC bin, gibt es da draußen jemanden, der gut am PC zeichnen kann. Wenn ja, bitte PN an mich.
 
Zuletzt bearbeitet:
Hallo,
es ist natürlich schwierig so einen Code per Ferndiagnose zu debuggen (vor allem wenn man keine weiteren Information über die einzelnen Eigenschaften und die Methoden der Objekte hat).
Zu deinem Problem Nr.1 (Schießen geht nur in eine Richtung) kann ich schonmal soviel sagen: du übergibst an das Geschoß zwar die Startkoordinaten, aber ich seh nirgends, dass du auch einen Richtungsvektor übergibst. Ich denke mal, dass die aktuelle Richtung von deinem Gefährt (my) in irgendeiner Eigenschaft abrufbar ist, die musst du an das Geschoß übergeben und das Ding sollte in die Blickrichtung fliegen.
Zu Problem Nr. 3: Ich schätze mal, dass du mit erstellen der zweiten Explosion die erste Überschreibst, bzw. die Referenz (den Zeiger) auf das entsprechende Objekt überschreibst. Abhilfe könnte hier eine Sammlung schaffen, in die du die Explosionsobjekte reinpackst, nacheinander ausließt (zum zeichnen) und wenn die Animation fertig ist, wird das Objekt aus dieser Sammlung gelöscht.

Hoffe, ich konnte wenigstens etwas weiter helfen.
Gruß
BB