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
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