|
kleines Gravitationsproblem
#227843
09/16/08 12:35
09/16/08 12:35
|
Joined: Jun 2005
Posts: 152 Weiterstadt, Germany
Alexander
OP
Member
|
OP
Member
Joined: Jun 2005
Posts: 152
Weiterstadt, Germany
|
Hi Leute, ich habe für mein Spiel ein Script für den Player erstellt, habe aber ein kleines Problem mit der Gravitation. Der Spiele kann keine Erhöhungen hoch laufe, z.B. eine Treppe, Rampe oder so. Kann mir bitte jemand helfen? Liegt sicher wieder an c_trace.
var PlayerGesundheit = 100;
action Spieler
{
// ****************************************
// * ACHTUNG! *
// * ------- *
// * *
// * Polygon muss in WED aktiviert sein! *
// * *
// ****************************************
var Bewegung;
var Distanz_zum_Boden;
var Laufgeschwindigkeit = 10; // Grundwert
var Drehgeschwindigkeit = 5; // Grundwert
var Animationsfortschritt = 0; // Grundwert
var Animationsgeschwindigkeit = 6; // Grundwert
player = my;
my.polygon = on;
my.shadow = on;
while (PlayerGesundheit > 0)
{
// Gravitation
// -----------
vec_set(temp, player.x);
temp.z -= 10000;
Distanz_zum_Boden = c_trace (my.x, temp.x, ignore_me | use_polygon | ignore_passable);
Bewegung.z = - (Distanz_zum_Boden - 30); // Fuesse der Spielerfigur auf Boden setzen
Bewegung.z = max (-25 * time, Bewegung.z); // 25 = Fallgeschwindigkeit
// rennen
// ------
Bewegung.x = Laufgeschwindigkeit * ((key_w || key_cuu) - (key_s || key_cud)) * time;
Bewegung.y = 0;
my.pan += Drehgeschwindigkeit * ((key_a || key_cul) - (key_d || key_cur)) * time;
if (Bewegung.x != 0)
{
Animationsgeschwindigkeit = 10;
ent_animate(my, "walk", Animationsfortschritt, anm_cycle);
}
else
{
Animationsgeschwindigkeit = 6;
ent_animate(my, "stand", Animationsfortschritt, anm_cycle);
}
Animationsfortschritt += Animationsgeschwindigkeit * time;
// laufen
// ------
if (key_shiftl == on || key_shiftr == on)
{
Laufgeschwindigkeit = 6;
Drehgeschwindigkeit = 3;
Animationsgeschwindigkeit = 6;
}
// wieder rennen
// -------------
if (key_shiftl == off && key_shiftr == off)
{
Laufgeschwindigkeit = 10;
Drehgeschwindigkeit = 5;
}
// angreifen
// ---------
if (key_ctrl == on && key_space == off)
{
Laufgeschwindigkeit = 0;
ent_animate(my, "attack", 0, anm_cycle);
}
if (key_ctrl == on && key_space == on)
{
Laufgeschwindigkeit = 0;
Animationsgeschwindigkeit = 6;
ent_animate(my, "attack", Animationsfortschritt, anm_cycle);
Animationsfortschritt += Animationsgeschwindigkeit * time;
//Messer();
Pistole();
}
// Items
// -----
if (key_1 == on)
{
c_scan(player.x, player.pan, vector(120, 180, 70), ignore_me);
}
// Bewegungen umsetzen
// -------------------
c_move (my, Bewegung, nullvector, glide | ignore_passable);
// Endlosschleife verhindern
wait(1);
}
// sterben
// -------
Animationsfortschritt = 0;
Animationsgeschwindigkeit = 6;
while (Animationsfortschritt < 100)
{
ent_animate(my, "death", Animationsfortschritt, null);
Animationsfortschritt += Animationsgeschwindigkeit * time;
wait (1);
}
my.passable = on;
}
Gruß Alex =)
|
|
|
Re: kleines Gravitationsproblem
[Re: Alexander]
#229411
09/27/08 11:13
09/27/08 11:13
|
Joined: Jul 2002
Posts: 4,436 Germany, Luebeck
Xarthor
Expert
|
Expert
Joined: Jul 2002
Posts: 4,436
Germany, Luebeck
|
Tipp: #1 Trenne die gravitation und die fortbewegung und verwende je eine c_move anweisung, also im endeffekt 2 stück dafür. Den gleich rat erteilt das manual, nebenbei. Sprich: Erst die 2d bewegung die über die bewegungstasten vom spieler gesteuert wird (WASD z.b.) und dann die gravitation (inkl. springen -> positive "gravitation").
#2 Was du auch sicherstellen solltest ist das das model im MED nicht mit dem füßen auf dem mittelpunktskreuz steht sondern das der mittelpunkt in knie oder gar hüfthöhe liegt. Das war zumindest früher immer notwendig damit man vernünftig treppen rauf und runter laufen konnte.
#3 Noch etwas, du verwendest das polygon flag für die spieler entity. Das ist ein NO-GO. das polygon flag ist ausschließlich für STATISCHE entities gedacht, sprich entities die nicht per c_move bewegt werden. Das benutzen des flags plus c_move kann zu fehlern in der kollisionserkennung führen.
#4 Setze an den anfang deiner action folgende script zeilen um die größe deiner entity, die bounding box, korrekt zu berechnen: c_setminmax(my); wait(1);
Das "wait(1);" ist nicht unbedingt erforderlich, bringt aber etwas sicherheit. Falls to c_updatehull(my,0) benutzen willst sollte es gar ein wait(2) sein. Doch c_setminmax sollte völlig ausreichend, zu mal c_updatehull bei mir in letzter zeit falsche ergebnisse gebracht hat, während c_setminmax einwandfrei funktionierte.
edit: #5 Ersetze jedes "time" durch "time_step". "time" ist veralteter syntax und sollte nicht mehr verwendet werden. Oder benutzt du ein version die älter als die neuste A6 ist?
hoffe das hilft dir etwas weiter
Last edited by Xarthor; 09/27/08 11:16.
|
|
|
Re: kleines Gravitationsproblem
[Re: Xarthor]
#230175
10/03/08 14:40
10/03/08 14:40
|
Joined: Jun 2005
Posts: 152 Weiterstadt, Germany
Alexander
OP
Member
|
OP
Member
Joined: Jun 2005
Posts: 152
Weiterstadt, Germany
|
Hi, danke für die Tipps. Ich habe den Script jetzt etwas verändert, es gibt aber noch 2 Probleme. 1. Wenn ich bei "c_setminmax(my);" eine "wait(1);" davor / dahinter mache, dann gibt es zwar kein Syntax Fehler, da ja alles stimmt, aber die Engine stürzt sofort nach dem Start ab. Wenn ich das "wait(1);" wieder lösche, geht es. 2. Ich habe auch herausgefunden an welcher Zeile das Problem mit der Treppe liegt. Wenn ich die Zeile so schreibe "Gravitation.z -= Distanz_zum_Boden;" kann ich keine Treppen steigen, wenn ich "Gravitation.z = -Distanz_zum_Boden;" schreibe, geht es, aber es gibt Gravitationsprobleme, wo der Spieler plötzlich an die Decke fliegt und wieder runter kommt.
var PlayerGesundheit = 100;
action Spieler
{
var Bewegung;
var Gravitation;
var Distanz_zum_Boden;
var Laufgeschwindigkeit = 10; // Grundwert
var Drehgeschwindigkeit = 5; // Grundwert
var Animationsfortschritt = 0; // Grundwert
var Animationsgeschwindigkeit = 6; // Grundwert
c_setminmax(my);
player = my;
my.shadow = on;
while (PlayerGesundheit > 0)
{
// Gravitation
// -----------
vec_set(temp, player.x);
temp.z -= 10000;
Distanz_zum_Boden = c_trace (my.x, temp.x, ignore_me | use_box | ignore_passable);
Gravitation.z -= Distanz_zum_Boden; // Fuesse der Spielerfigur auf Boden setzen
Gravitation.z = max (-25 * time_step, Gravitation.z); // 25 = Fallgeschwindigkeit
// rennen
// ------
Bewegung.x = Laufgeschwindigkeit * ((key_w || key_cuu) - (key_s || key_cud)) * time_step;
Bewegung.y = 0;
my.pan += Drehgeschwindigkeit * ((key_a || key_cul) - (key_d || key_cur)) * time_step;
if (Bewegung.x != 0)
{
Animationsgeschwindigkeit = 10;
ent_animate(my, "walk", Animationsfortschritt, anm_cycle);
}
else
{
Animationsgeschwindigkeit = 6;
ent_animate(my, "stand", Animationsfortschritt, anm_cycle);
}
Animationsfortschritt += Animationsgeschwindigkeit * time_step;
// laufen
// ------
if (key_shiftl == on || key_shiftr == on)
{
Laufgeschwindigkeit = 6;
Drehgeschwindigkeit = 3;
Animationsgeschwindigkeit = 6;
}
// wieder rennen
// -------------
if (key_shiftl == off && key_shiftr == off)
{
Laufgeschwindigkeit = 10;
Drehgeschwindigkeit = 5;
}
// angreifen
// ---------
if (key_ctrl == on && key_space == off)
{
Laufgeschwindigkeit = 0;
ent_animate(my, "attack", 0, anm_cycle);
}
if (key_ctrl == on && key_space == on)
{
Laufgeschwindigkeit = 0;
Animationsgeschwindigkeit = 6;
ent_animate(my, "attack", Animationsfortschritt, anm_cycle);
Animationsfortschritt += Animationsgeschwindigkeit * time_step;
//Messer();
Pistole();
}
// Items
// -----
if (key_1 == on)
{
c_scan(player.x, player.pan, vector(120, 180, 70), ignore_me);
}
// Bewegungen umsetzen
// -------------------
c_move (my, Bewegung, nullvector, glide | ignore_passable);
c_move (my, Gravitation, nullvector, glide | ignore_passable);
// Endlosschleife verhindern
wait(1);
}
// sterben
// -------
Animationsfortschritt = 0;
Animationsgeschwindigkeit = 6;
while (Animationsfortschritt < 100)
{
ent_animate(my, "death", Animationsfortschritt, null);
Animationsfortschritt += Animationsgeschwindigkeit * time_step;
wait (1);
}
my.passable = on;
}
Gruß Alex =)
|
|
|
|