Kugel mit realer Physic

Posted By: Kai008

Kugel mit realer Physic - 09/09/07 21:18

Tag.
Zuerst: Ich bin eigendlich totaler Noob mit dem 3DGS, mein bestes "Projekt" war ein Raum in dem eine Kamera die erste Perspektive eines Objectes darstellt und man es mit den Pfeiltasten wie in einen Ballerspiel steuert. x_x

Also, ich wollte eine Kugel, die sich physikalisch möglichst realisitsch benimmt. Dazu habe ich im AUM folgenden Script gefunden:


action ball
{
ball = my;
my.scale_x = 1.5;
my.scale_y = my.scale_x;
my.scale_z = my.scale_x;
phent_settype (my, ph_rigid, ph_sphere);
phent_setmass (my, 5, ph_sphere);
phent_setfriction (my, 40);
phent_setdamping (my, 20, 20);
phent_setelasticity (my, 80, 5);
while(1)
{
vec_set (temp, nullvector);
temp.z = 0;
vec_rotate (temp, vector(camera.pan, 0, 0));
vec_normalize (temp, 200 * time);
phent_addtorqueglobal (my, temp);
wait (1);
}
}

Hier kommt auch der Befehl "phent_settype" aus den anderen Physic-Thread in diesen Bereich vor. (http://www.coniserver.net/ubbthreads/showflat.php/Cat/0/Number/780865/an/0/page/0#Post780865)


Jetzt bekomme ich folgende Fehlermeldung:

Parameter unknown ball


Die Fehlermeldungen beziehen sich auf die Zeile:

ball = my;


Wäre nett wenn mir jemand mit einfachsten Wörtern erklärt warum das so ist. ._.
Posted By: Sticky

Re: Kugel mit realer Physic - 09/09/07 21:38

Hi, nun bin zwar auch net der Coder aber wenn ich das richtig sehe ist "ball" nicht definiert.

Mit


Code:
ball = my;



weist du einer unbekannten (also "ball") die my-Funktion zu und das kann dann so net gehen.
Versuchs mal mit

Code:
var ball;

action ball
{
....
}



Vielleicht klappts :-)
Achso wenn Fehler hier drinne sind bitte ich um Korrektur durch die Profis
möchte ja keinen quatsch erzählen ;-)

Lg Sticky
Posted By: Kai008

Re: Kugel mit realer Physic - 09/09/07 21:50

THX, das hat die Fehlermeldung beseitigt. =)
Kommt davon wenn man sich hauptsächlich mit PHP beschäftigt wo man Variablen nicht definieren muss. ._."
Posted By: fogman

Re: Kugel mit realer Physic - 09/10/07 07:32

Das geht zwar, ist aber so nicht ganz richtig.
"ball" beschreibt einen Entity Pointer und keine Variable.
Das es trotzdem geht, hängt mit den Internas von c-Script zusammen.
Allerdings gibt es eine Fehlermeldung, sobald Du mit der Entity "ball" etwas machen willst.

Schreibe statt:
var ball;

dieses hier:
entity* ball;

über die Action.

Damit hast Du aus "ball" einen Zeiger auf eine Entity gemacht.


Mittels

ball = me;

wird der Zeiger der betreffenden Entity zugewiesen.


Nun kannst Du in anderen Funktionen auf den Ball zugreifen, z.B. mit

ball.invisible = on; // Ball unsichtbar machen


Vorher musst Du warten / sicherstellen, daß der Pointer gefüllt ist:

while(!ball){wait(1);}

Hoffe das hilft und verwirrt Dich jetzt nicht zu sehr.
Posted By: G_Tos

Re: Kugel mit realer Physic - 09/10/07 08:35

Also muss man ball=me schreiben und nicht ball=my...deshalb ging des bei mir auch nicht...
Posted By: fogman

Re: Kugel mit realer Physic - 09/10/07 08:40

me = my
your = you

Sollte beides gehen, ist egal.
Posted By: G_Tos

Re: Kugel mit realer Physic - 09/10/07 09:17

dann lag's nicht daran...
Posted By: Kai008

Re: Kugel mit realer Physic - 09/10/07 09:25

Danke, ich verstehe es eigendlich gut.
Nur eins weiß ich jetzt nicht:

Prüft die while also das "!ball" ob die Variable mit "entity* ball;" intialisiert wurde, also gehört sie vor "ball = my;", oder prüft die Variable ob der entity ein Wert zugewiesen wurde, also gehört sie nach "ball = my;"?
Posted By: fogman

Re: Kugel mit realer Physic - 09/10/07 10:39

Angenommen, Du hast eine Action:

Code:

entity* ball; // Entity definition = pointer

action ballaballa // Action für den Ball
{
ball = me;
}



Nun kannst Du von einer anderen Funktion auf den Ball zugreifen:

Code:

function verstecke_ball
{
while(!ball){wait(1);} // warte bis der pointer gefüllt ist
ball.invisible = on; // mach die entity ball unsichtbar
}

on_v = verstecke_ball; // Taste "v" löst die Funktion aus



while(!ball) entspricht while(ball == 0)

In der Action selbst musst Du den Pointer nicht prüfen, da er ja von ihr gefüllt wird.
Posted By: Kai008

Re: Kugel mit realer Physic - 09/10/07 10:43

Ach so, danke.
Posted By: Kai008

Re: Kugel mit realer Physic - 09/13/07 19:32

Gibt es vielleicht eine Möglichkeit die Physic kurz zu deaktivieren?
Hab mir eine kleine Steuerschleife geschrieben:

while (1)
{
camera.x = ball.x;
camera.y = ball.y;

if(key_w)
{
ball.y -= 20 * time;
}
if(key_a)
{
ball.x += 20 * time;
}
if(key_d)
{
ball.x -= 20 * time;
}
wait(1);
}

Nichts großartiges aber es funktioniert irgendwie nicht wenn es sich um ein phent handelt. ._."
Deshalb dachte ich dass ich es vor dem Steuern deaktiviere und später wieder aktiviere, da ich vor allem die Schwerkraft brauche.

PS: Ach ja, und wie kann man die Kugel vertikal drehen lassen? Also quasi das Gegenteil von ".pan"? Damit ein Rolleffekt entsteht.
Posted By: TSG_Torsten

Re: Kugel mit realer Physic - 09/13/07 20:04

ich mache es meistens mit phent_settype(me,0,0); //Deaktiviert die physik
(mit phent_enable hatte ich öfters Probleme)
Dann warte ein Frame, verschiede das Objekt, aktiviere die Physik per

phent_settype(me,PH_RIGID,PH_SPHERE);

wieder.
Danach musst du aber alle Eigenschaften wie Gewicht, Reibung, usw. wieder definieren.

Gruß
TSGames
Posted By: Kai008

Re: Kugel mit realer Physic - 09/13/07 20:24

Schaut jetzt so aus:

entity* ball;
var total_score;

action p_ball
{
ball = my;

my.scale_x = 1.5;
my.scale_y = my.scale_x;
my.scale_z = my.scale_x;

def_physic();
}

function def_physic
{
phent_settype (ball, ph_rigid, ph_sphere);
phent_setmass (ball, 80, ph_sphere);
phent_setfriction (ball, 40);
phent_setdamping (ball, 80, 80);
phent_setelasticity (ball, 80, 50);
while(1)
{
vec_set (temp, nullvector);
temp.z = 0;
vec_rotate (temp, vector(camera.pan, 0, 0));
vec_normalize (temp, 200 * time);
phent_addtorqueglobal (ball, temp);
wait (1);
}
}

function main()
{
time_smooth = 0;
fps_max = 140;
fps_lock = on;
load_level("index.wmb");
wait (3);
ph_setgravity (vector(0, 0, -7888));
while (1)
{
phent_settype (ball, 0, 0);
wait(1);

camera.x = ball.x;
camera.y = ball.y;

if(key_w)
{
ball.y -= 20 * time;
}
if(key_a)
{
ball.x += 20 * time;
}
if(key_d)
{
ball.x -= 20 * time;
}
def_physic();
wait(1);
}
wait(1);
}

Aber bekomme den Fehler "Entity not a physics object in def_physic: phent_addtorqueglobal(ball, temp)".
© 2024 lite-C Forums