1 registered members (AndrewAMD),
945
guests, and 8
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Ballistische Flugbahn
#452850
06/28/15 13:07
06/28/15 13:07
|
Joined: Jan 2006
Posts: 168 Germany, Hannover
DexLoomer
OP
Member
|
OP
Member
Joined: Jan 2006
Posts: 168
Germany, Hannover
|
Hallo Leute, ich möchte für ein Panzerspiel eine einigermaßen spieltaugliche ballistische Flugbahn des Geschosses haben. Mein Problem ist, das ich die mathematischen Formeln die ich bislang gefunden habe, nicht in Programmcode umgesetzt bekomme. Deshalb fliegt mein Geschoss bislang nur gerade und wird nach einer gewissen Strecke auch nach unten bewegt. Das ähnelt aber zu wenig einer echten Flugbahn. Außerdem benutze ich als Geschoss eine Entity, welche wegen der hohen Geschwindigkeit durch kleinere Objekte "durchfliegt". Daher habe ich wischen den c_move Schritten noch eine c_trace mit event gesetzt. Hat jemand eine Idee, wie man eine simple ballistische Flugbahn einbauen könnte?
function move_rocket()
{
set (my, PASSABLE); // don't collide with the player
VECTOR rocket_speed;
VECTOR rocket_pos;
VECTOR rocket_posold;
vec_set(rocket_posold.x, my.x); // Startposition der Rakete merken
my.pan = entBarrel.pan;
my.tilt = entBarrel.tilt;
wait (1);
my.emask |= (ENABLE_ENTITY|ENABLE_IMPACT|ENABLE_BLOCK);
my.event = remove_rocket;
my.skill40 = 1234; // I'm a rocket
my.skill20 = 0;
my.skill5 = 0; // used for vertical movement
while (my.skill20 < 10)
{
if (my.skill20 > 2) // the rocket has moved away from the player? Then let's reset its passable flag
reset (my, PASSABLE);
effect (rocket_trail, 1, my.x, normal); // generate particle trails for the rocket
// my.roll += 20 * time_step;
rocket_speed.x = 300 * time_step;
rocket_speed.y = 0;
rocket_speed.z = 0;
my.skill5 += time_step;
if (my.skill5 > 5)
{
rocket_speed.z -= fall_speed * time_step;
}
my.skill20 += 1 * time_step;
c_move (my, rocket_speed, nullvector, IGNORE_PASSABLE);
vec_set(rocket_pos.x, my.x); // Momentane Position der Rakete merken
c_trace(rocket_posold.x,rocket_pos.x,IGNORE_ME|IGNORE_PASSABLE|ACTIVATE_SHOOT|IGNORE_CONTENT);
//draw_line3d(rocket_posold.x,NULL,100); // draw line for debug
//draw_line3d(rocket_pos.x,vector(0,0,255),100);
vec_set(rocket_posold.x,rocket_pos.x); // Alte Position merken
wait (1);
}
remove_rocket();
}
Last edited by DexLoomer; 06/28/15 13:13.
A8-Com-v 8.47.1
|
|
|
Re: Ballistische Flugbahn
[Re: DexLoomer]
#452852
06/28/15 14:06
06/28/15 14:06
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
stichwort parabel du hast die austrittsgeschwindigkeit (v0) des projektils und die fallbeschleunigung (g). im code würde das inetwa so aussehen:
v = v0;
while(...)
{
v += g * time_step;
projektil_position += v;
wait(1);
}
ist natürlich nur pseudocode und es ist deinem code ziemlich ähnlich, aber so sieht eine ballistische flugbahn ohne luftreibung oder andere auswirkungen auf das geschoss abgesehen von gravitation aus.
POTATO-MAN saves the day! - Random
|
|
|
Re: Ballistische Flugbahn
[Re: Kartoffel]
#452855
06/28/15 15:03
06/28/15 15:03
|
Joined: Jan 2006
Posts: 168 Germany, Hannover
DexLoomer
OP
Member
|
OP
Member
Joined: Jan 2006
Posts: 168
Germany, Hannover
|
Hi Kartoffel, danke für deinen Tip! So in der Art hatte ich es auch schon gegoogelt. Trotzdem ist es mir nicht gelungen eine Formel vernünftig in den Code einzubauen. Hier mein Versuch mit deiner Formel. Ich hebe den speed des Geschosses ganz klein gemacht, damit sie erst einmal langsam fliegt und ich den Weg verfolgen kann. Leider "blitzt" das Geschoss nur kurz auf und ist dann weg.
function move_rocket()
{
set (my, PASSABLE); // don't collide with the player
VECTOR rocket_speed;
VECTOR rocket_pos;
VECTOR rocket_posold;
vec_set(rocket_posold.x, my.x); // Startposition der Rakete merken
my.pan = entBarrel.pan;
my.tilt = entBarrel.tilt;
wait (1);
my.emask |= (ENABLE_ENTITY|ENABLE_IMPACT|ENABLE_BLOCK);
my.event = remove_rocket;
my.skill40 = 1234; // I'm a rocket
my.skill20 = 0;
rocket_speed.x = 3;
while(my.skill20 < 1000)
{
if (my.skill20 > 2) // the rocket has moved away from the player? Then let's reset its passable flag
reset (my, PASSABLE);
effect (rocket_trail, 1, my.x, normal); // generate particle trails for the rocket
rocket_speed.x += 0.9;
rocket_pos.x += rocket_speed.x * time_step;
c_move (my, rocket_pos, nullvector, IGNORE_PASSABLE);
vec_set(rocket_pos.x, my.x); // Momentane Position der Rakete merken
c_trace(rocket_posold.x,rocket_pos.x,IGNORE_ME|IGNORE_PASSABLE|ACTIVATE_SHOOT|IGNORE_CONTENT);
// draw_line3d(rocket_posold.x,NULL,100); // draw line for debug
// draw_line3d(rocket_pos.x,vector(0,0,255),100); // draw line
vec_set(rocket_posold.x,rocket_pos.x); // Alte Position merken
wait (1);
}
remove_rocket();
}
A8-Com-v 8.47.1
|
|
|
Re: Ballistische Flugbahn
[Re: DexLoomer]
#452858
06/28/15 15:27
06/28/15 15:27
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
Ich denk mal du verwendest c_move falsch. Zum einen gibt man nicht die zielposition an, sondern den bewegungsvektor. Außerdem musst du in diesem fall einen absoluten bewegungsvektor angeben, keinen relativen. (oder den gravitationsvektor immer entsperechend drehen, was umständlicher ist)
POTATO-MAN saves the day! - Random
|
|
|
|