1 registered members (AndrewAMD),
962
guests, and 7
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Code funktioniert nicht wie er soll
#401396
05/18/12 15:05
05/18/12 15:05
|
Joined: Jul 2010
Posts: 974 United Arab Emirates, Dubai
TheShooter
OP
User
|
OP
User
Joined: Jul 2010
Posts: 974
United Arab Emirates, Dubai
|
Hi, ich arbeite gerade an einem neuen Projekt, und erstelle gerade den Movementcode. Allerdings bleibt das Spielermodell in der Luft, fällt also nicht zu Boden. Hier meine Schwerkraftfunktion:
function schwerkraft()
{
while(1){
if (c_trace(my.x, vector(my.x,my.y,my.z-100000000), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON) >0)
distanz_zum_boden = my.z + vFuesse.z - target.z;
else
distanz_zum_boden = 0;
if (distanz_zum_boden > 0)
distanz_zum_boden = clamp(distanz_zum_boden,0,accelerate(fallgeschwindigkeit,5,0.1));
else
fallgeschwindigkeit = 0;
wait(1);
}
}
Und hier mein ganzer Code, der dem Spielermodell zugewiesen ist:
var fallgeschwindigkeit = 0;
var distanz_zum_boden;
VECTOR vFuesse;
vec_for_min(vFuesse,me);
function kamera()
{
while(1){
camera.x = my.x;
camera.y = my.y;
camera.z = my.z;
camera.pan = my.pan;
wait(1);
}
}
function schwerkraft()
{
while(1){
if (c_trace(my.x, vector(my.x,my.y,my.z-100000000), IGNORE_ME | IGNORE_PASSABLE | USE_POLYGON) >0)
distanz_zum_boden = my.z + vFuesse.z - target.z;
else
distanz_zum_boden = 0;
if (distanz_zum_boden > 0)
distanz_zum_boden = clamp(distanz_zum_boden,0,accelerate(fallgeschwindigkeit,5,0.1));
else
fallgeschwindigkeit = 0;
wait(1);
}
}
function bewegen()
{
while(1){
my.pan += 2*(key_a-key_d)*time_step;
wait(1);
}
}
action spieler()
{
kamera();
schwerkraft();
bewegen();
}
Alles andere funktioniert, alles bis auf die "Schwerkraft". Danke schonmal im Voraus, TheShooter
|
|
|
Re: Code funktioniert nicht wie er soll
[Re: PadMalcom]
#401399
05/18/12 15:38
05/18/12 15:38
|
Joined: Jul 2010
Posts: 974 United Arab Emirates, Dubai
TheShooter
OP
User
|
OP
User
Joined: Jul 2010
Posts: 974
United Arab Emirates, Dubai
|
Natürlich. Jetzt klappts, danke. Die Quants beim tracen habe ich nur erhöht, da ich mir nicht sicher war, ob der trace auch wirklich am Boden ankommt. Vielen Dank! €: Allerdings bewege ich mich jetzt viel zu schnell, aber ich kann keine Variablen verkleinern, um langsamer zu werden.
function bewegen()
{
while(1){
var distanz_vorne = 5*(key_w-key_s)*time_step;
distanz_vorne = sign(distanz_vorne)*(abs(distanz_vorne) + 0.5*fallgeschwindigkeit);
c_move(me,vector(distanz_vorne,0,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE);
my.pan += 2*(key_a-key_d)*time_step;
wait(1);
}
}
€: mhh, wenn ich die ersten sekunden falle, falle ich langsam. Nach ca. 3 Sekunden aber falle ich mit einem Affenzahn nach unten. Was habe ich falsch gemacht?
Last edited by TheShooter; 05/18/12 15:59.
|
|
|
Re: Code funktioniert nicht wie er soll
[Re: PadMalcom]
#401438
05/19/12 12:33
05/19/12 12:33
|
Joined: Jul 2010
Posts: 974 United Arab Emirates, Dubai
TheShooter
OP
User
|
OP
User
Joined: Jul 2010
Posts: 974
United Arab Emirates, Dubai
|
Das ist mir auch klar, nur weiß ich nicht wo das Problem liegen sollte. :S Hier nochmal der komplette Code:
var fallgeschwindigkeit = 0;
var distanz_zum_boden;
VECTOR vFuesse;
vec_for_min(vFuesse,me);
function kamera()
{
while(1){
vec_set(camera.x,my.x);
vec_set(camera.y,my.y);
camera.z = my.z+45;
camera.pan = my.pan;
wait(1);
}
}
function schwerkraft()
{
while(1){
if (c_trace(my.x, vector(my.x,my.y,my.z-1), IGNORE_ME | IGNORE_PASSABLE) >0)
distanz_zum_boden = my.z + vFuesse.z - target.z;
else
distanz_zum_boden = 0;
if (distanz_zum_boden > 0)
distanz_zum_boden = clamp(distanz_zum_boden,0,accelerate(fallgeschwindigkeit,5,0.1));
c_move(my,nullvector,vector(0,0,-5), IGNORE_PASSABLE | GLIDE);
//else
//{
// fallgeschwindigkeit = 0;
//}
wait(1);
}
}
function bewegen()
{
while(1){
if(distanz_zum_boden <1){
var distanz_vorne = 15*(key_w-key_s)*time_step;
var distanz_seite = 7*(key_a-key_d)*time_step;
distanz_vorne = sign(distanz_vorne)*(abs(distanz_vorne) + 0.5*fallgeschwindigkeit);
distanz_seite = sign(distanz_seite)*(abs(distanz_seite) + 0.5*fallgeschwindigkeit);
c_move(me,vector(distanz_vorne,0,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE | USE_BOX);
c_move(me,vector(0,distanz_seite,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE | USE_BOX);
my.pan += 1.3*(-mickey.x)*time_step;
camera.tilt += 1.3*(-mickey.y)*time_step;
}
else
{
beep();
}
wait(1);
}
}
action spieler()
{
wait(3);
set(me, INVISIBLE);
kamera();
schwerkraft();
bewegen();
}
|
|
|
Re: Code funktioniert nicht wie er soll
[Re: TheShooter]
#401444
05/19/12 14:56
05/19/12 14:56
|
Joined: Apr 2008
Posts: 245
GameScore
Member
|
Member
Joined: Apr 2008
Posts: 245
|
probier mal das, ist von einem aus dem forum hier
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
VECTOR force;
VECTOR dist;
VECTOR absdist;
VECTOR speed_xyz;
VECTOR old_mypos;
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
var my_height;
var jump_time = 1;
var jump_height = 55;
var speed_z = 0;
var fall_damage = 0;
var bit_press[10];
var damage;
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#define health skill1
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
SOUND* damage_snd = "damage_snd.wav";
SOUND* death_snd = "death_snd.wav";
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
function main()
{
fps_max = 75;
fps_lock = 1; // NEEDED FOR PROPER WORK
level_load("1.WMB");
wait(3);
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
function handle_camera()
{
camera.arc = 90;
vec_lerp(camera.x,camera.x,vector(my.x,my.y,my.z + 50),0.5);
my.pan = camera.pan;
camera.pan -= 10 * mouse_force.x * time_step;
camera.tilt += 10 * mouse_force.y * time_step;
camera.tilt = clamp(camera.tilt,-80,80);
}
function handle_jump()
{
proc_kill(1);
jump_time = 1;
while (jump_time > -1 && player.health > 0)
{
on_space = NULL;
absdist.z = jump_height * time_step * jump_time;
jump_time -= 0.2 * time_step;
wait (1);
}
while (my_height > 10) {wait (1);}
jump_time = 1;
}
function handle_movement()
{
if(my_height <= 10)
{
if(jump_time == 1){on_space = handle_jump;}
if(!key_shift)
{
force.x = 10 * (key_w - key_s) * time_step;
accelerate(dist.x,force.x,0.5);
force.y = 10 * (key_a - key_d) * time_step;
accelerate(dist.y,force.y,0.5);
}
else
{
force.x = 10 * (key_w - key_s) * time_step;
accelerate(dist.x,force.x,1);
force.y = 10 * (key_a - key_d) * time_step;
accelerate(dist.y,force.y,1);
}
}
}
function handle_gravity()
{
my_height = c_trace(my.x,vector(my.x,my.y,my.z - 1000),IGNORE_ME|IGNORE_FLAG2|IGNORE_PASSABLE|USE_POLYGON|USE_BOX);
if(my_height > 10)
{
accelerate(absdist.z,-10 * time_step,-0.1);
}
else
{
if(jump_time == 1)
{
absdist.z = -(my_height/1.2) + 5;
absdist.z = clamp(absdist.z,-5,5);
if((my_height + absdist.z) > 10){absdist.z = -my_height -10;}
}
}
vec_set(old_mypos,my.x); // NEEDED FOR PROPER WORK
}
function handle_falldamage()
{
vec_diff(speed_xyz,my.x,old_mypos);
speed_z = abs(speed_xyz.z) * time_step;
if(speed_z > 3.5) // PLAY WITH 3.5 TO CUSTOMIZE THE HEIGHT
{
fall_damage += speed_z * time_step;
}
if(speed_z <= 1 && fall_damage != 0 && my_height <= 10)
{
my.health -= fall_damage * 4 + random(4); // PLAY WITH 4 TO CUSTOMIZE DAMAGE
damage = 1;
fall_damage = 0;
}
if(damage == 1 && fall_damage == 0 && my_height <= 10)
{
if(bit_press[0] == 0 )
{
snd_play(damage_snd,100,0);
bit_press[0]= 1;
}
damage = 0;
}
else
{
bit_press[0]= 0;
}
}
function handle_death()
{
snd_play(death_snd,100,0);
while(1)
{
if(my_height <= 10){vec_set(dist,nullvector);}
handle_gravity(); // GRAVITY
c_move(my,dist,absdist,IGNORE_PASSABLE|GLIDE);
camera.arc = 90;
vec_lerp(camera.x,camera.x,vector(my.x,my.y,my.z),0.5);
my.pan = camera.pan;
camera.pan -= 10 * mouse_force.x * time_step;
camera.tilt += 10 * mouse_force.y * time_step;
camera.tilt = clamp(camera.tilt,-80,80);
wait(1);
}
}
action hero()
{
player = my;
set(my,INVISIBLE);
my.health = 100; // SET PLAYERS HEALTH TO 100
while(my.health > 0)
{
handle_movement(); // MOVEMENT
handle_gravity(); // GRAVITY
c_move(my,dist,absdist,IGNORE_PASSABLE|GLIDE);
handle_falldamage(); // FALL DAMAGE FUNCTION
handle_camera(); // CAMERA
wait(1);
}
handle_death();
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
PANEL* gui_ =
{
digits(10,0,4,"Arial#24bi",1,player.skill1);
flags = SHOW;
}
|
|
|
Re: Code funktioniert nicht wie er soll
[Re: GameScore]
#401447
05/19/12 15:03
05/19/12 15:03
|
Joined: Mar 2006
Posts: 1,993 Karlsruhe
PadMalcom
Serious User
|
Serious User
Joined: Mar 2006
Posts: 1,993
Karlsruhe
|
Du rufst 2x c_move hintereinander auf, warum? Du könntest distanz_seite einfach ins erste move mit integrieren indem du die 0 im ersten vektor dadurch ersetzt. Versuche immer zu verstehen was du da schreibst, durch einfaches Probieren kommt man in der Mathematik oft nicht sehr weit Das Beispiel aus dem Manual ist klasse, hangel dich mal daran entlang.
|
|
|
Re: Code funktioniert nicht wie er soll
[Re: PadMalcom]
#401449
05/19/12 15:29
05/19/12 15:29
|
Joined: Jul 2010
Posts: 974 United Arab Emirates, Dubai
TheShooter
OP
User
|
OP
User
Joined: Jul 2010
Posts: 974
United Arab Emirates, Dubai
|
Oh, das habe ich nicht bemerkt. Aber leider löst das noch immer nicht das trace-problem. Aber ich habe etwas komisches herausgefunden. Wenn ich die Tracereichweite auf z.B. -100 setze, so kann ich mich überhaupt nicht mehr bewegen/umsehen. Wenn ich allerdings im folgendem Code in der If-Clause "Distanz_zum_Boden" auf "<101" setze, funktioniert alles wieder.
if(distanz_zum_boden < 1){
var distanz_vorne = 15*(key_w-key_s)*time_step;
var distanz_seite = 7*(key_a-key_d)*time_step;
distanz_vorne = sign(distanz_vorne)*(abs(distanz_vorne) + 0.5*fallgeschwindigkeit);
distanz_seite = sign(distanz_seite)*(abs(distanz_seite) + 0.5*fallgeschwindigkeit);
c_move(me,vector(distanz_vorne,distanz_seite,0),vector(0,0,-fallgeschwindigkeit), IGNORE_PASSABLE | GLIDE | USE_BOX);
my.pan += 1.3*(-mickey.x)*time_step;
camera.tilt += 1.3*(-mickey.y)*time_step;
}
Nur leider bin ich zu beschränkt, um das Problem alleine zu lösen. Ich glaube ich verstehe nicht so ganz, wie Vektoren funktionieren. Es scheint so, als wenn der trace irgendwie nicht den Boden treffen würde, und die höhe anhand der Tracedistanz setzen würde. Oder liege ich falsch?
Last edited by TheShooter; 05/19/12 15:55.
|
|
|
|