|
*German* problem mit c_trace
#219770
08/04/08 13:54
08/04/08 13:54
|
Joined: Jun 2008
Posts: 11
birkin
OP
Newbie
|
OP
Newbie
Joined: Jun 2008
Posts: 11
|
hi, also ich habe folgendes problem, seitdem ich in mein player script das c_trace eingebaut habe, hat mein player physikalische grundsätze obwohl das gar nich sein soll, d.h. wenn ich mich bewege und dabei eine schräge hochlaufe bewegt sich der player langsamer und wenn ich sie herunterlaufe dementsprechend schneller. und wenn ich an einer kante stehe an die eine andere kante anliegt( die sind aber schief, bzw. diagonal) bewegt sich der player kurzzitig ganz schnell ein paa quants hoch und runter und rutscht dabei die kante entlang........ kann mir jemand erklären warum der player das tut oder wie man das beheben kann, weil ich wüsste keinen ansatz zur lösung. schon ma danke im vorraus. hier ist noch mein playerscript
FUNCTION rotate_entity(rotate_angle,rotate_speed);
DEFINE move_x,skill22; //movement skills
DEFINE move_y,skill23;
DEFINE move_z,skill24;
DEFINE force_x,skill25;
DEFINE force_y,skill26;
DEFINE force_z,skill27;
DEFINE velocity_x,skill28;
DEFINE velocity_y,skill29;
DEFINE velocity_z,skill30;
DEFINE animate,SKILL31; //animation skills
DEFINE animate2,SKILL32;
DEFINE animblend,SKILL33;
DEFINE currentframe,SKILL34;
DEFINE blendframe,SKILL35;
DEFINE z_offset,SKILL50; //gravity and jumping skills
DEFINE jumping_mode,SKILL51;
DEFINE gravity,SKILL52;
DEFINE movement_mode,SKILL53; //for various movement mainly combat
DEFINE moving,SKILL54;
DEFINE hit_by_player,SKILL55; //enemy skills
DEFINE entity_type,SKILL56;
DEFINE nullframe,-2;
DEFINE blend,-1;
DEFINE stand,0;
DEFINE run,1;
DEFINE walk,2;
DEFINE jump,3;
DEFINE fall,4;
var camera_distance = 250;
Action player_maedel
{
player = my;
my.fat= off;
my.narrow = on;
c_setminmax(my);
my.shadow = on;
while (player != null)
{
kamera();
bewegungen();
gravitation();
kamerazentrierung();
player_animationen(1);
wait(1);
}
}
function rotate_entity(rotate_angle,rotate_speed)
{
if (my.pan == rotate_angle) {return;}
result = ang(rotate_angle - my.pan);
if (result > 0) { my.pan += rotate_speed * time; }
if (result < 0) { my.pan -= rotate_speed * time; }
if (ang(rotate_angle - my.pan) < 0 && result > 0) { my.pan = rotate_angle; }
if (ang(rotate_angle - my.pan) > 0 && result < 0) { my.pan = rotate_angle; }
}
function kamera()
{
camera.pan -= mouse_force.x * 12 * time;
camera.tilt += mouse_force.y * 8 * time;
camera.tilt = clamp(camera.tilt,-70,- 5);
temp = fcos(camera.tilt,-camera_distance);
vec_set(camera.x,vector(my.x + fcos(camera.pan,temp),my.y + fsin(camera.pan,temp),my.z + 70 + fsin(camera.tilt,-camera_distance)));
camera.arc -= 0.25 * mickey.z * time_step;
camera.arc = clamp(camera.arc,20,100);
}
function kamerazentrierung()
{
if (mouse_middle == 1)
{
if (camera.pan <= player.pan)
{camera.pan += 20 * time;}
if (camera.pan >= player.pan)
{camera.pan -= 20 * time;}
if (camera.tilt <= -5)
{camera.tilt += 20 * time;}
if (camera.arc >= 50)
{camera.arc -= 13 * time;}
if (camera.arc <= 50)
{camera.arc += 13 * time;}
}
}
function bewegungen()
{
temp.x = -1000;
temp.y = 0;
if (key_w == 1 && key_s == 0 && key_a == 0 && key_d == 0) { temp.x = camera.pan; }
if (key_s == 1 && key_w == 0 && key_a == 0 && key_d == 0) { temp.x = camera.pan + 180; }
if (key_a == 1 && key_s == 0 && key_w == 0 && key_d == 0) { temp.x = camera.pan + 90; }
if (key_d == 1 && key_s == 0 && key_a == 0 && key_w == 0) { temp.x = camera.pan - 90; }
if (key_w == 1 && key_a == 1 && key_d == 0 && key_s == 0) { temp.x = camera.pan + 45; }
if (key_w == 1 && key_d == 1 && key_a == 0 && key_s == 0) { temp.x = camera.pan - 45; }
if (key_s == 1 && key_a == 1 && key_d == 0 && key_w == 0) { temp.x = camera.pan + 135; }
if (key_s == 1 && key_d == 1 && key_a == 0 && key_w == 0) { temp.x = camera.pan - 135; }
if (temp.x != -1000)
{
if (key_shift == 1)
{temp.y = 10 * time;}
else
{temp.y = 20 * time;}
}
my.move_x = fcos(temp.x,temp.y);
my.move_y = fsin(temp.x,temp.y);
c_move(my,nullvector,my.move_x, ignore_passable | glide);
result = c_trace(my.x,vector(my.x,my.y,my.z - 4000),use_box|ignore_me|scan_texture);
if (result < 0) { my.z -= result; my.velocity_z = 0; }
if (temp.y > 0) {rotate_entity(temp.x,20);}
if (my.move_x == 0 && my.move_y == 0)
{
if (my.animblend > stand && my.animblend != jump && my.animblend != fall)
{my.blendframe = stand;}
}
else
{
if (my.animblend == stand)
{
if (key_shift == 1)
{my.blendframe = walk;}
else
{my.blendframe = run;}
}
if (my.animblend == run && key_shift == 1)
{my.blendframe = walk;}
if (my.animblend == walk && key_shift == 0)
{my.blendframe = run;}
}
}
function gravitation()
{
result = c_trace(my.x,vector(my.x,my.y,my.z - 4000),use_box|ignore_me|scan_texture);
if (result < 3)
{
if (my.jumping_mode == 0)
{
my.force_z = -1 * result;
if (key_space == 1 && my.animblend >= stand && my.animblend != jump && my.animblend != fall)
{
my.jumping_mode = 1;
my.force_z = 32;
my.blendframe = jump;
my.animate2 = 0;
my.animblend = blend;
}
}
if (my.jumping_mode == 2 || my.jumping_mode == 3)
{my.jumping_mode = 0;}
}
else
{
if (my.jumping_mode == 2)
{
if(result > 120)
{
my.animate = 60;
my.jumping_mode = 3;
}
else
{my.jumping_mode = 0;}
}
if (my.jumping_mode == 3 && result <= 120) { my.jumping_mode = 0;}
if (my.jumping_mode == 0)
{
if (result > 120 && my.animblend >= stand && my.animblend != jump && my.animblend != fall)
{
my.jumping_mode = 3;
my.blendframe = fall;
my.animate2 = 0;
my.animblend = blend;
}
}
my.force_z -= 6 * time;
my.force_z = max(-30,my.force_z);
}
my.velocity_z += (time * my.force_z) - (min(time * 0.7,1) * (my.velocity_z));
my.move_z = my.velocity_z * time;
}
function player_animationen(animation_speed)
{
if (animation_speed <= 0) {animation_speed = 1;}
if (my.animblend != blend && my.blendframe != nullframe)
{
my.animate2 = 0;
my.animblend = blend;
}
if (my.animblend == blend)
{
if (my.currentframe == stand) {ent_animate(my,"stand",my.animate,anm_cycle);}
if (my.currentframe == run) {ent_animate(my,"run",my.animate,anm_cycle);}
if (my.currentframe == walk) {ent_animate(my,"walk",my.animate,anm_cycle);}
if (my.currentframe == jump) {ent_animate(my,"jumpnew",my.animate,0);}
if (my.blendframe == stand) {ent_blend("stand",0,my.animate2);}
if (my.blendframe == run) {ent_blend("run",0,my.animate2);}
if (my.blendframe == walk) {ent_blend("walk",0,my.animate2);}
if (my.blendframe == jump) {ent_blend("jumpnew",0,my.animate2);}
if (my.blendframe == fall) {ent_blend("jumpnew",60,my.animate2);}
my.animate2 += 45 * time;
if (my.animate2 >= 100)
{
my.animate = 0;
my.animblend = my.blendframe;
my.blendframe = nullframe;
}
}
if (my.animblend == stand)
{
ent_animate(my,"stand",my.animate,anm_cycle);
my.animate += 2 * animation_speed * time;
my.animate %= 100;
my.currentframe = stand;
}
if (my.animblend == run)
{
ent_animate(my,"run",my.animate,anm_cycle);
my.animate += 6.8 * animation_speed * time;
my.animate %= 100;
my.currentframe = run;
}
if (my.animblend == walk)
{
ent_animate(my,"walk",my.animate,anm_cycle);
my.animate += 6 * animation_speed * time;
my.animate %= 100;
my.currentframe = walk;
}
if (my.animblend == jump || my.animblend == fall)
{
if (my.jumping_mode == 3) {my.animate = 80;}
ent_animate(my,"jumpnew",my.animate,0);
my.animate += 7 * animation_speed * time;
my.currentframe = jump;
if (my.animate >= 60 && my.jumping_mode == 1) {my.jumping_mode = 2;}
if (my.animate >= 100)
{
ent_animate(my,"jumpnew",100,0);
my.animate = 100;
my.blendframe = stand;
if (my.move_x != 0 || my.move_y != 0)
{
if (key_shift == 1) {my.blendframe = walk;}
else {my.blendframe = run;}
}
}
}
}
|
|
|
Re: *German* problem mit c_trace
[Re: birkin]
#219789
08/04/08 15:37
08/04/08 15:37
|
Joined: Aug 2003
Posts: 7,439 Red Dwarf
Michael_Schwarz
Senior Expert
|
Senior Expert
Joined: Aug 2003
Posts: 7,439
Red Dwarf
|
weil du für die bewegung UND gravitation "glide" benutzt. Du musst 2 verschiedene c_moves machen, eines für die gravitation OHNE glide, und einen c_move für die bewegung des spielers, MIT glide
"Sometimes JCL reminds me of Notch, but more competent" ~ Kiyaku
|
|
|
Re: *German* problem mit c_trace
[Re: birkin]
#219891
08/05/08 13:19
08/05/08 13:19
|
Joined: Aug 2003
Posts: 7,439 Red Dwarf
Michael_Schwarz
Senior Expert
|
Senior Expert
Joined: Aug 2003
Posts: 7,439
Red Dwarf
|
am besten direkt nach dem erstemn C-move, also da wo es jetzt schon ist. wenn du lust hast kannst du dir auch meinen kleinen artiekl über movement durchlesen : http://3dgsnerd.xware-cg.com/code-snippet-1/
"Sometimes JCL reminds me of Notch, but more competent" ~ Kiyaku
|
|
|
Re: *German* problem mit c_trace
[Re: birkin]
#220230
08/06/08 14:21
08/06/08 14:21
|
Joined: Aug 2003
Posts: 7,439 Red Dwarf
Michael_Schwarz
Senior Expert
|
Senior Expert
Joined: Aug 2003
Posts: 7,439
Red Dwarf
|
joa, du brauchst 2 vektoren, einen der fürs erste c_move ist, und einen zweiten der fürs 2 c_move ist. Der erste ist z.b. für die bewegung des spielers, und bie zweite für umwelteinflüsse, wie z.b.in dem beispiel die Gravitation.
"Sometimes JCL reminds me of Notch, but more competent" ~ Kiyaku
|
|
|
Re: *German* problem mit c_trace
[Re: Michael_Schwarz]
#220305
08/06/08 21:16
08/06/08 21:16
|
Joined: May 2008
Posts: 301
Oxy
Senior Member
|
Senior Member
Joined: May 2008
Posts: 301
|
Für eine gute Playerbewegung solltest Du Mindestens 4 Bewegungen machen:
Nach oben (bein hoch) Nach vorne (Schritt nach vorn, wobei das Bein gehoben ist) Nach unten (bein nach unten, wie ein Mensch so läuft) Weiter nach unten bewegen, wenn das bein noch in der Luft hägt (gravitation, wenn Loch oder Abschüssige Steigung)
-> Wenn der Player im letzten Frame nach unten gefallen ist, und keinen Boden erreicht hat in der zeispanne, dann blockieren die ersten drei Bewegungen.
So Kannst Du einen Player machen, der Treppen hochlaufen kann, und in Löcher fällt, und vor allem: nicht bei kleinen Steinchen oder kanten hängen bleibt. Die Schritthöhe sollte ungefär die Hüfthöhe sein. (oder Kniehöhe, je nachdem wie agil er sein soll)
Einzigstes Problem: der Player kannn so an die Decke Stoßen, ist also nur gut bei Outdoor leveln, für Indoor:
Mach die Kollisionshülle beim laufen nur für den Oberkörper+ Kopf. Lasse den Player mit Traces auf Hüfthöhe schweben. Ist der Trach nach unten größer als die Hüfthöhe, las ihn fallen. ist sie kleiner lass ihn steigen.
Glaub mir diese Beiden Lösungen sind besser als 90% aller Movementskripte hier. (Inclusive den Movement skripten von IntenseX)
Die meisten Movementskripte sehen einen Menschen praktisch als Kasten mit kleinen Röllchen. Dadurch bleibt dieser natürlich leich hängen. Sieh den Spieler als eine Kollisionsentity die aktiv eine Bewegung ausführt und automatisch kleineren Hindernissen ausweicht (nach unten und auch zur Seite). Den beinaperat kannst du auch praktisch als "flexieblen leeren raum" sehen, Da beine sich leicht anpassen.
Last edited by Oxy; 08/06/08 21:24.
|
|
|
Re: *German* problem mit c_trace
[Re: birkin]
#220404
08/07/08 08:57
08/07/08 08:57
|
Joined: Aug 2003
Posts: 7,439 Red Dwarf
Michael_Schwarz
Senior Expert
|
Senior Expert
Joined: Aug 2003
Posts: 7,439
Red Dwarf
|
define absSpeed_x,skill10; define absSpeed_y,skill11; define absSpeed_z,skill12;
der wäre es, nach meinem code, du kannst antürlich auch ne neue var erstellen
var absSpeed;
"Sometimes JCL reminds me of Notch, but more competent" ~ Kiyaku
|
|
|
|