Gamestudio Links
Zorro Links
Newest Posts
loading historical data 1st time
by AndrewAMD. 04/14/23 12:54
Trade at bar open
by juanex. 04/13/23 19:43
Bug in Highpass2 filter
by rki. 04/13/23 09:54
Adding Limit Orders For IB
by scatters. 04/11/23 16:16
FisherN
by rki. 04/11/23 08:38
AUM Magazine
Latest Screens
SHADOW (2014)
DEAD TASTE
Tactics of World War I
Hecknex World
Who's Online Now
3 registered members (AndrewAMD, Grant, Neb), 908 guests, and 6 spiders.
Key: Admin, Global Mod, Mod
Newest Members
rki, FranzIII, indonesiae, The_Judge, storrealba
18919 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 2 of 2 1 2
Re: NPC's ?? [Re: Roxas] #203679
04/23/08 13:30
04/23/08 13:30
Joined: Jan 2002
Posts: 4,225
Germany / Essen
Uhrwerk Offline
Expert
Uhrwerk  Offline
Expert

Joined: Jan 2002
Posts: 4,225
Germany / Essen
This is to less code for me to make a statement. But there are some things that caught my eye.

1. You have a wait inside this function. I guess it is called every frame? Then waits can have unwanted side effects. Be carefull.
2. You are using the force to move the character. That's unusual. And you're multiplying your force vector with time_step. That's unusual too. Normally you create the force normalized (i.e. with a certain length e.g. 1), then do the acceleration and finally move the character by speed multiplied with time_step. You can multiply vector with scalars using vec_scale.
3. Your code looks like you're trying to make your character fall the faster the longer he falls by raising the gravity working on him. That's wrong. Gravity is always the same value. I.e. if you jump from a mountain the gravity pulling you down is always the same. What makes you fall faster and faster is the acceleration. Implement an acceleration wit vec_accelerate and your character will automatically behave like this.
4. You are using the relative distance in c_move (i.e. the vector is interpreted from the entities angle). Is this what you want to do?

Example for such a very simple (and untested ;-)) movement:
 Code:
VECTOR force;
VECTOR speed;
VECTOR dist;
fixed friction;
memset(&force,0,sizeof(VECTOR)); // Sets the vector's components to 0.
memset(&speed,0,sizeof(VECTOR));
memset(&dist,0,sizeof(VECTOR));
while (1)
{
	// trace and that stuff.
	// determine if player is in the air and set friction to a value.
	force.x = key_w - key_s;
	force.y = key_a - key_d;
	force.z = gravity + yourJumpingForceIfAny; // Where gravity is supposed to be negative.
	vec_accelerate(&dist,&speed,&force,friction);
	c_move(me,vector(0,0,0),&dist,YourCustomMoveModeHere);
}



Always learn from history, to be sure you make the same mistakes again...
Re: NPC's ?? [Re: Roxas] #203708
04/23/08 15:31
04/23/08 15:31
Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
Roxas Offline OP
Member
Roxas  Offline OP
Member

Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
Well honestly Im not sure myself what im trying to do.
I just want some gravitation and jumping

well okay.

To 1.: I added the wait(1); because I thought this might be good because for the down pulling speed. I don't know.
To 2.: How do I convert the force to speed?
for example:
the force is 1 for positiv gravitation (pulling out of the ground)
the force is -1 for negativ gravitation (pulling him down when he's in the air.
then > when his force is positiv the velocity to pull him outta the ground is maybe.. 5
and when force is a negativ value the velocity for the gravitation should be 10
and the acceleration is now made by the vec_acceleration function right?
so It should look like this?

 Code:
VECTOR force;
VECTOR velocity;
VECTOR dist;

function gravity_handle()
{
char_height = c_trace(charakter, vector(his position), vector(-4000 quants below him, and here the use_box things etc)

if(char_height < his origin [in lvl geometry])
{
   charakters.force_z = 1;
}
if(char_height > his origin [so he's in the air])
{
   charakters.force_z = -1;
}
if(charakters.force_z > 0 [positiv "gravitation"])
{
   charakters.velocity_z = 5;
}
if(charakters.force_z < 0 [negativ "gravitation"])
{
   charakters.velocity_z = -10
}
vec_acceleration(&dist,&velocity, &force, friction value [0.5 f. e.])
c_move(charakter, vector(0,0,0), &dist, ignore_me / passable / glide and so on)
}


and this function called in my player action in a while loop. Did I understand it right so far? Oo

oh boy x_x
well maybe we should stick to german and it would become easier for me.
you're german right?
I only write in english because I thought that this thread may be helpful for other ppl when they read it.

aber in deutsch würd ichs wahrscheinlich eher verstehen, nya. oder vllt hab ichs ja sogar schon so verstanden wie dus meintest \:o hoffentlich.

falls ja. dann müsst ich jetz nur noch wissen wo und wie ich dort das springen rein krieg. wenn ichs nämlich so code weiß ichs gar nicht mehr oo. und wie krieg ichs hin das ich nich in der luft nochmal springen kann. ich will auch nicht das er nochmal springen kann wenn ich die leeertaste gedrückt halte, und er soll ach erst wieder springen können,wenn er wieder am boden ist. ich hatte es vorher so das er dann auf einmal wie ein basketball durchs level gehüpft is, was net sinn der sache sein sollte ^^'.

_________________________________________________________________________
~ edit: ~

 Code:
VECTOR dist;
VECTOR force;
VECTOR velocity;

function movement()
{
	char_height = c_trace(vector(charakter.x,charakter.y,charakter.z), vector(charakter.x,charakter.y,charakter.z-4000), USE_BOX | IGNORE_ME | IGNORE_PASSABLE);
	
	force.x = key_w - key_s;
	force.y = key_a - key_d;
	
	if(char_height > charakter.z_offset){force.z = -1;}
	if(char_height < charakter.z_offset){force.z = 1;}
	
	if(force.z < 0){velocity.z = -200 * time_step;}
	if(force.z > 0){velocity.z = 200 * time_step;}
	
	if(force.x < 0){velocity.x = -100 * time_step;}
	if(force.x > 0){velocity.x = 100 * time_step;}

	if(force.y < 0){velocity.y = -100 * time_step;}
	if(force.y > 0){velocity.y = 100 * time_step;}
	
	vec_accelerate(&dist, &velocity, &force, 2);
	c_move(charakter, &dist,nullvector, GLIDE | IGNORE_ME | IGNORE_PASSABLE);
}


Das hab ich mal ebend ausprobiert. Das problem daran ist, das er auf und ab springt. wenn ich das GLIDE weg mache, dann springt er zwar nich mehr, aber kann mich au nimmer bewegen dann. Das nächste problem ist, wenn ich GLIDE setze, dann "rutscht" er an schrägen herunter, als wenn er auf eis wäre.
und die beschleunigung der gravitation is auch iwie ziemlich langsam o_o.

~ edit: end ~
__________________________________________________________________________



greets

Last edited by Roxas; 04/23/08 16:39.
Re: NPC's ?? [Re: Roxas] #203735
04/23/08 18:24
04/23/08 18:24
Joined: Jan 2002
Posts: 4,225
Germany / Essen
Uhrwerk Offline
Expert
Uhrwerk  Offline
Expert

Joined: Jan 2002
Posts: 4,225
Germany / Essen
Ok, dann auf Deutsch. ^^ Ich schreib normalerweise immer Englisch, damit es alle lesen können.

Jetzt hast Du ja schon wieder an der Kraft rumgefummelt und sie mit time_step multipliziert. :P Wenn Dir die Gravitation zu gering ist kannst Du sie ja einfach größer machen. Die muss ja nicht 1 oder -1 sein. Ausserdem sollte friction ein Wert zwischen 0 und 1 sein. Mach doch mal bitte die ganzen "if(force... velocity =" weg. Dass er an Schrägen runterrutscht heisst, dass dann noch Gravitation auf ihn wirkt. Möglicherweise lässt Du die Gravitation zu früh, also schon bei sehr geringem Bodenabstand auf ihn wirken?



Always learn from history, to be sure you make the same mistakes again...
Re: NPC's ?? [Re: Uhrwerk] #203746
04/23/08 19:00
04/23/08 19:00
Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
Roxas Offline OP
Member
Roxas  Offline OP
Member

Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
Ja das dacht ich mir das du daswegen Englisch schreibst, das waren ja auch meine Beweggründe ^^'. Daswegen hab ich auch in Englisch geschrieben.
Aber irgendwie komm ich mal gar nicht damit klar.

Also ich hab jetzt wie du gesagt hast die If dinger gelöscht. und die Force vergrößert.

Der bewegt sich nun Höllen-langsam, wenn ich Schrägen hoch gehe geht er noch langsamer, aber er rutscht wenigstens schon mal nicht mehr die Schräge hinab :o.

Und zum Bodenabstand > da hab ich eiglt die Distanz zwischen seinem Ursprung und dem Trace genommen. also Wenn das Ergebnis größer ist als der Origin vom Modell (zB 20 quants) gehe ich davon aus das er in der Luft ist.
wenn die distanz vom Trace kleiner ist, dann ist er in der Level Geometrie und ich lasse ihn nach oben drücken, damit er wieder aus dem Boden raus kommt.
Das ist eiglt meine Überlegung gewesen.
Nur hab ich keine Ahnung direkt nun, wie du das meintest, mit dem Kraft zu Geschwindigkeit konvertieren und die beschleunigung mit vec_accelerate zu berechnen.

Also im moment wäre das jetzt ohne die IF dinger bei mir

 Code:
function movement()
{
	char_height = c_trace(vector(charakter.x,charakter.y,charakter.z), vector(charakter.x,charakter.y,charakter.z-4000), USE_BOX | IGNORE_ME | IGNORE_PASSABLE);
	
	force.x = key_w - key_s;
	force.y = key_a - key_d;
	
	if(char_height > charakter.z_offset){force.z = -5;}
	if(char_height < charakter.z_offset){force.z = 5;}
	

	vec_accelerate(&dist, &velocity, &force, 0.5);
	c_move(charakter, &dist,nullvector, GLIDE | IGNORE_ME | IGNORE_PASSABLE);
}


wobei charakter.z_offset = 6 ist. das is die Entfernung des modells vom origin zu seinem tiefsten punkt (also die füße) ich benutz zur zeit das modell aus dem kh movement tutorial
und ich hab nebenbei das KH Movement Tutorial script in Lite-C umgeschrieben. nur die bewegung, springen und gravitation. funktioniert auch soweit. bis auf den camera code.

werde das nun glaub ich auch nun verwenden erstmal aber ich möcht trotzdem noch wissen wie das mit dem gravity programmiern is, weil sich mir der sinn von dem kh movement gravity code nich erschließen will. auch wenn er funktioniert.

schließlich will ich wie gesagt was lernen. und nich nen copy & paste game machen. dann kann ich auch weiter RPG Maker programmieren. -.-

greets und danke für die antwort schon mal

Re: NPC's ?? [Re: Roxas] #203762
04/23/08 20:32
04/23/08 20:32
Joined: Jan 2002
Posts: 4,225
Germany / Essen
Uhrwerk Offline
Expert
Uhrwerk  Offline
Expert

Joined: Jan 2002
Posts: 4,225
Germany / Essen
Die normale Formel zur Berechnung einer Geschwindigkeit aus einer Kraft ist s = (1/2) * a * t². Da brauchst Du dich aber gar nicht drum zu kümmern, das tut vec_acclerate schon für dich. Deine letzte Code Version ist richtig. Wenn sich der Charakter jetzt zu langsam bewegt musst Du entweder die Reibung vermindern oder die Kraft erhöhen, also zum Beispiel
 Code:
force.x = (key_w - key_s) * 10;
Das Problem mit dem Abstand zum Boden ist folgendes. Ich hab mal ein Bildchen gebastelt:

Beide Garfields stehen auf dem Boden, der rechte hat aber wegen der Schräge des Untergrunds einen größeren Abstand vom Mittelpunkt aus zum Boden. Daher solltest Du da ein wenig Toleranz einbauen, so dass der Spieler auch einige Quants über dem Bode noch als "auf dem Boden" betrachtet wird. Schönere Bewegung gibt es auch, wenn man in Bodennähe einen Bruchteil der Differenz von Bodenabstand und Körpergröße nach unten vom Mittelpunkt aus auf die Kraft aufaddiert. Also der linke Garfield zum Beispiel gar keine Kraft, der rechte eine leichte nach unten.


Always learn from history, to be sure you make the same mistakes again...
Re: NPC's ?? [Re: Uhrwerk] #203794
04/24/08 09:18
04/24/08 09:18
Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
Roxas Offline OP
Member
Roxas  Offline OP
Member

Joined: Apr 2008
Posts: 144
Germany | Niedersachsen (Lower...
Ahh oke.
Ich hab jetzt mal die Kräfte mit nem Wert multipliziert. So wie du geschrieben hast. Nun bewegt er sich Schneller und auch die Gravitation läuft ganz gut.
Nur das er zur Zeit noch ziemlich "rumhüpft" und wenn ich irgendwo runter "falle" dann sinkt er zur hälfte in den Boden ein und wird dann erst hochgedrückt. \:o

Das mit dem Bodenabstand. Also meinst du sozusagen sowas wie das hier?
 Code:
	if(char_height > charakter.z_offset+10){force.z = -10;}


Also wenn der Bodenabstand beispielsweise jetzt 30 ist, und das Größer ist als charakter.z_offset (6)+10 = 16, dann ist er in der Luft und die Kraft soll ihn runter ziehen. wobei er aber erst bei 6 am Boden wäre.
Und wenn der Abstand nun kleiner ist als 16 ist er "am Boden" obwohl er eigtl. noch "in der Luft" ist..
Muss ich dann schon eine Kraft aufwärts haben? Oder dann einfach keine Kraft auf ihn wirken lassen.
Und eine andere Sache die mir aufgefallen ist. Ich hab das Gefühl das er beim diagonalen Laufen schneller ist \:o

Und das mit dem Bruchteil der Differenz versteh ich nicht ganz. Also meinst du in meinem Beispiel sowas wie:

 Code:
var ausgleich;
ausgleich = (char_height - charakter.z_offset) / 5;
if(char_height > charakter.z_offset){force.z = -10 + ausgleich;}


oder hab ich das jetzt falsch verstanden ^^'.

Greets und Danke für das Bildchen (;


Last edited by Roxas; 04/24/08 09:19.
Page 2 of 2 1 2

Moderated by  HeelX, Lukas, rayp, Rei_Ayanami, Superku, Tobias, TWO, VeT 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1