Gamestudio Links
Zorro Links
Newest Posts
AlpacaZorroPlugin v1.3.0 Released
by kzhao. 05/22/24 13:41
Free Live Data for Zorro with Paper Trading?
by AbrahamR. 05/18/24 13:28
Change chart colours
by 7th_zorro. 05/11/24 09:25
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
3 registered members (AndrewAMD, TraderTom, Akow), 1,388 guests, and 7 spiders.
Key: Admin, Global Mod, Mod
Newest Members
AemStones, LucasJoshua, Baklazhan, Hanky27, firatv
19055 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
kleines Gravitationsproblem #227843
09/16/08 12:35
09/16/08 12:35
Joined: Jun 2005
Posts: 152
Weiterstadt, Germany
A
Alexander Offline OP
Member
Alexander  Offline OP
Member
A

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. crazy


Code:
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 Offline
Expert
Xarthor  Offline
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
A
Alexander Offline OP
Member
Alexander  Offline OP
Member
A

Joined: Jun 2005
Posts: 152
Weiterstadt, Germany
Hi, danke für die Tipps. smile 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. confused

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.


Code:
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 =)

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