2 registered members (AndrewAMD, juanex),
1,247
guests, and 6
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Schwerkraft?
#410339
11/01/12 11:46
11/01/12 11:46
|
Joined: May 2008
Posts: 113 Italien, Südtirol, Naturns
Patrick92
OP
Member
|
OP
Member
Joined: May 2008
Posts: 113
Italien, Südtirol, Naturns
|
Hallo, kann man mir jemand sagen, wie man eine ordentliche Schwerkraft machen kann? Ich habe es bisher immer so gemacht:
function schwerkraft()
{
var abstand[3];
vec_set(abstand,my.x);
abstand[2] -= 5;
if(c_trace(my.x,abstand,IGNORE_PASSABLE|USE_BOX|IGNORE_ME) == 0)
{
// beep();
if(my.Z_MOVE > -50)
{
my.Z_MOVE = -2;
}
}
else
{
my.Z_MOVE = 0;
}
}
Hier passiert es mir immer wieder, dass der Spieler im Terrainboden "stecken" bleibt. Danke schon mal im voraus. MfG, Patrick
|
|
|
Re: Schwerkraft?
[Re: Patrick92]
#410356
11/01/12 15:07
11/01/12 15:07
|
Joined: Sep 2003
Posts: 6,861 Kiel (Germany)
Superku
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
|
Probier es mal so:
#define speed_z skill50
var key_space_off = 0;
VECTOR temp;
...
vec_set(temp,vector(my.x,my.y,my.z-500));
c_trace(my.x,temp,IGNORE_ME | IGNORE_PASSABLE);
if(!trace_hit) vec_set(target,temp);
if(my.z+my.min_z+5 > target.z || my.speed_z > 0)
{
my.speed_z = maxv(my.speed_z-10*time_step,-80);
c_move(me,nullvector,vector(0,0,my.speed_z*time_step),IGNORE_PASSABLE | GLIDE);
}
else
{
my.speed_z = 0;
my.z += (target.z-my.min_z+3-my.z)*time_step; //or set the position directly... (3 and 5 act as a simple buffer)
if(key_space)
{
if(key_space_off)
{
my.speed_z = 50;
key_space_off = 0;
}
}
else key_space_off = 1;
}
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual Check out my new game: Pogostuck: Rage With Your Friends
|
|
|
Re: Schwerkraft?
[Re: Patrick92]
#410415
11/02/12 18:54
11/02/12 18:54
|
Joined: Sep 2003
Posts: 6,861 Kiel (Germany)
Superku
Senior Expert
|
Senior Expert
Joined: Sep 2003
Posts: 6,861
Kiel (Germany)
|
Hatte den Code vorher nicht getestet, folgende Version funktioniert nun aber:
#define speed_z skill50
var key_space_off = 0;
VECTOR temp;
action act_player()
{
c_setminmax(my);
my.min_z += 40;
while(1)
{
my.x += (key_w-key_s)*5*time_step;
my.y += (key_a-key_d)*5*time_step;
vec_set(temp,vector(my.x,my.y,my.z-500));
c_trace(my.x,temp,IGNORE_ME | IGNORE_PASSABLE);
if(!trace_hit) vec_set(target,temp);
var target_height = target.z-my.min_z+40;
if(my.z > target_height+5 || my.speed_z > 0)
{
my.speed_z = maxv(my.speed_z-10*time_step,-80);
c_move(me,nullvector,vector(0,0,my.speed_z*time_step),IGNORE_PASSABLE);
}
else
{
my.speed_z = 0;
if(my.z > target_height) my.z += (target_height-my.z)*time_step;
else my.z = target_height;
if(key_space)
{
if(key_space_off)
{
my.speed_z = 50;
key_space_off = 0;
}
}
else key_space_off = 1;
}
wait(1);
}
}
Wie du siehst, "verringere" (absolut betrachtet) ich den min_z Wert, damit die Kollisionsbox nicht bis zu den Füßen geht, sondern bspw. nur bis zu den Knien. Dieser Wert muss dann aber auch bei target_height berücksichtigt und angepasst werden.
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual Check out my new game: Pogostuck: Rage With Your Friends
|
|
|
|