Gamestudio Links
Zorro Links
Newest Posts
New FXCM FIX Plugin
by flink. 06/04/24 07:30
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
1 registered members (monk12), 1,487 guests, and 9 spiders.
Key: Admin, Global Mod, Mod
Newest Members
AemStones, LucasJoshua, Baklazhan, Hanky27, firatv
19058 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Kollisionserkennung #312166
02/23/10 15:20
02/23/10 15:20
Joined: Nov 2006
Posts: 116
benija Offline OP
Member
benija  Offline OP
Member

Joined: Nov 2006
Posts: 116
Hey Leute
bin gerade auf ein Problem gestoßen, welches ich ohne eure Hilfe wohl nicht meistern kann.

Kurze Erklärung meines Games:
es ist ganz simpel! Eine Entity kann sich nach links und nach rechts bewegen (ähnlich wie jump n run).

soweit ist alles kein problem. Allerdings bewegt sich meine Spielfigur durch die seitlichen Abgrenzungen(Blocks). Wie kann ich dieses Problem lösen?

meine Action:
Code:
action player_walk()
{
	var move_stat = 0;
	var move_dir = 0;

	
	while(1)
	{
		//wenn a gedrückt wird...
		if(key_a)
		{
			//...dann wird die Entity nach links gedreht
			my.pan=90+1*90;
			//animation run wird ausgeführt 		
			ent_animate(me, "run",move_stat,ANM_CYCLE);
			move_stat+=0.5;
			//entity bewegt sich auf der xAchse 2 nach links
			//es scheint, als bewege sie sich
			my.x-=2;
			
		}
		else
		{
			//wenn weder a noch d gedrückt wird, dann stellt
			//sich die entity in richtung des Spielers
			my.pan=45+1*45*5;
			//animation stand wird ausgeführt
			ent_animate(me, "stand", move_stat, ANM_CYCLE);
			move_stat+=0.5;
		}	
		
		if(key_d)
		{
			//wenn d gedrückt wird, dann dreht sich die
			//Figur nach rechts
			my.pan = -90+1*90;
			//animation run wird wieder ausgeführt
			ent_animate(me,"run", move_stat, ANM_CYCLE);
			move_stat+=0.1;	
			//Entity bewegt sich auf der xAchse 2 nach rechts
			my.x+=2;
		}
		
		if(key_space)
		{
			printf("asdf");
		}		
		
		//Cameraposition
		camera.x = 100+my.x;
		camera.y = -2500;
		camera.z = 700+my.z;
		camera.pan = 90;
		wait(1);
	}
}



Re: Kollisionserkennung [Re: benija] #312168
02/23/10 15:22
02/23/10 15:22
Joined: Feb 2009
Posts: 3,207
Germany, Magdeburg
Rei_Ayanami Offline
Expert
Rei_Ayanami  Offline
Expert

Joined: Feb 2009
Posts: 3,207
Germany, Magdeburg
move die entity nicht in dem du ihre x cordinate änderst sondern per c_move wink

Re: Kollisionserkennung [Re: Rei_Ayanami] #312170
02/23/10 15:25
02/23/10 15:25
Joined: Nov 2006
Posts: 116
benija Offline OP
Member
benija  Offline OP
Member

Joined: Nov 2006
Posts: 116
wie genau funktioniert die c_move funktion?

Re: Kollisionserkennung [Re: benija] #312172
02/23/10 15:37
02/23/10 15:37
Joined: Feb 2009
Posts: 3,207
Germany, Magdeburg
Rei_Ayanami Offline
Expert
Rei_Ayanami  Offline
Expert

Joined: Feb 2009
Posts: 3,207
Germany, Magdeburg
Manual???

Originally Posted By: Manual
c_move(ENTITY* entity,VECTOR* reldist,VECTOR* absdist,var mode)
Bewegt eine Entity über eine bestimmte Entfernung und führt dabei eine Kollisionserkennung, das Auslösen von Kollisions-Events sowie das Entlanggleiten an Hindernissen aus.
Der erste Vektor, reldist, gibt eine relative Stecke und Richtung in gedrehten Entity-Koordinaten, d.h. in Blickrichtung der Entity, an. Der zweite Vektor absdist gibt eine absolute Strecke und Richtung in Weltkoordinaten an. Die daraus resultierende Bewegung besteht aus einer Kombination beider Strecken. Üblicherweise wird der erste Vektor für die Antriebsgeschwindigkeit der Entity und der zweite für äußere Kräfte, wie etwa Schwerkraft und Drift, benutzt. Um einen dieser Vektoren auf Null zu setzen, kann der vordefinierte nullvector angegeben werden.

Die Funktion liefert den Wert der zurückgelegten Entfernung zurück. Wird die Entity von Hindernissen blockiert und konnte sich überhaupt nicht bewegen, wird ein negativer Wert oder 0 zurückgegeben. Sind die Kollisions-Events aktiviert, werden Sie sowohl für die Entity, als auch für das Hindernis ausgelöst. Im Verlauf eines Kollisions-Events werden zur Angabe des Kollisions-Typus einige vordefinierte Variablen gesetzt (siehe unten). Diese können in der Event-Funktion zu jeglicher Art von Beeinflussung des Kollisions- bzw. Abprallverhaltens ausgewertet werden..

Parameter:
entity Zu bewegende Entity
reldist Vektor der Bewegungsstrecke in Entity-Koordinaten (relativer Bewegungsvektor)
absdist Vektor der Bewegungsstrecke in Welt-Koordinaten (absoluter Bewegungsvektor)
mode Kollisionsmodus, siehe unten

Die folgenden mode-flags können kombiniert werden:

IGNORE_YOU Ignoriert die you-Entity bei der Kollisionserkennung (s. Kommentar).
IGNORE_FLAG2 A7.10 Ignoriert alle Entities mit gesetztem FLAG2.
IGNORE_PASSABLE Ignoriert alle passablen Blocks und Entities einschliesslich sämtlicher Wasser-Entities.
IGNORE_PASSENTS Ignoriert passable Modell- und Sprite-Entities, nimmt jedoch noch Wasser-Entities (passable rechteckige Maps oder passable Terrains) wahr. Es setzt die vordefinierten Flag s in_passable und on_passable . Der vordefinierte Pointer passable_ent wird auf die erkannte Wasser-Entity gesetzt. So lässt sich das Playerverhalten beispielsweise auf Schwimmen umschalten.

IGNORE_WORLD Ignoriert alle Level-Blocks und Terrains.
IGNORE_MAPS Ignoriert alle Map- und Terrain-Entities
IGNORE_MODELS Ignoriert sämtliche Models
IGNORE_SPRITES Ignoriert sämtliche Sprites
IGNORE_PUSH Ignoriert alle Entities mit einem niedrigeren push- oder gleichem group-Wert als bzw. wie dem der gegebenen Entity und löst bei diesen Entities den Kollisions-Event EVENT_PUSH aus.
IGNORE_CONTENT Ignoriert Wasser-Entities (s.o.). Die Anweisung wird dadurch etwas schneller ausgeführt.
ACTIVATE_TRIGGER Aktiviert EVENT_TRIGGER während der Bewegung
ACTIVATE_PUSH A7.10 Löst bei der getroffenen Entity unabhängig von deren push- oder group-Wert den Kollisionsevent EVENT_PUSH aus. Liefert die Event-Funktion 1 zurück, wird die getroffene Entity als Hindernis betrachtet, ist der Rückgabewert 0, wird sie ignoriert. So lassen sich individuelle Kollisionsgruppen definieren.

ACTIVATE_SHOOT A7.10 Ermöglicht EVENT_SHOOT-Triggering der getroffenen Entity und verhindert alle anderen Kollisionsevents. Dieses Flag sorgt dafür, dass c_move sich ähnlich verhält wie c_trace.

ACTIVATE_SONAR A7.10 Ermöglicht EVENT_SONAR-Triggering der getroffenen Entity und verhindert alle anderen Kollisionsevents. Dieses Flag sorgt dafür, dass c_move sich ähnlich verhält wie c_trace.

USE_AABB Verwendet anstelle einer mitgedrehten Bounding Box (OBB) eine an Achsen ausgerichtete Kollisionsbox (AABB). Das AABB-System ist schneller, ignoriert aber die Ausrichtung der Entity auf USE_BOX, behandelt Modelle und Sprites als Boxen und erfordert einen BSP-Level. Mehr über den Unterschied zwischen beiden Systemen finden Sie unter Kollision.
USE_POLYGON Benutzt eine polygonale Hülle aller Zielentities auch dann, wenn ihr POLYGON-Flag nicht gesetzt ist. Kann nicht gleichzeitig mit USE_AABB benutzt werden.

GLIDE Gleitet beim Auftreffen an Wänden und Entities entlang.

Abhängig von:
move_friction Reibungsfaktor zum Entlanggleiten an Wänden.
move_min_z Maximale Stufenhöhe (nur OBB).
disable_z_glide Schaltet das Hinaufgleiten an Schrägen ab (nur OBB)

Rückgabewerte:
> 0 zurückgelegte Entfernung.
<= 0 Entity wurde blockiert

Modifiziert:
entity.x, y, z Entity-Position.
target Position des Kontaktpunktes der Kollision
normal Vektor der Normalen der berührten Oberfläche
bounce Vektor der Abprallrichtung
trace_hit Auf ungleich Null gesetzt, wenn etwas getroffen wurde.
in_passable Auf ungleich Null gesetzt, wenn der Start- oder Endpunkt innerhalb einer Wasser-Entity liegt.
on_passable Auf ungleich Null gesetzt, wenn das getroffene Ziel eine Wasser-Entity ist..
passable_ent Ist in_passable oder on_passable gesetzt, ist dieser Pointer auf das ermittelte Wasser-Terrain gesetzt (nur im OBB-System)
event_type Event-Typ bei Auslösung.

Bemerkungen:
Die folgenden Kollisionsevents lassen sich durch c_move-Kollisionen auslösen: EVENT_BLOCK bei Kollisionen mit dem Level und EVENT_ENTITY bei Kollisionen mit Entities. Getroffene Entity: EVENT_IMPACT, EVENT_PUSH, EVENT_SONAR, oder EVENT_SHOOT je nach c_move-Modus.
Erstellen Sie die Kollisionsgeometrie so, dass sich Entities nicht miteinander verheddern. Entities, die in Bewegung sind können bei einer Kollision mit polygonalen Objekten, die 'Haken' oder 'Lücken', die in der Grösse auf die sich bewegende Entity passen, hängenbleiben. Verwenden Sie eine nicht-polygonale Hülle oder das Flag PASSABLE für alle Objekte, die so geformt sind, dass sich Entities darin verheddern könnten. Für alle anderen Modelle - wie etwa Rampen oder Treppen - die sich nicht bewegen und als Hindernisse dienen sollen, setzen Sie den POLYGON-Flag.
Die Geschwindigkeit der Funktion hängt davon ab, ob eine Kollision erkant wurde oder nicht und ob die Entity gleitet oder nicht. Achten Sie beim Bewegen einer Entity darauf, ihre Bounding-Box (min_x/max_x) zum Vermeiden unnötiger Kollisionen klein genug zu halten. !! Es ist ein gängiger Anfängerfehler ist das Ausweiten der Bounding-Box einer Entity bis hinunter zu den Füssen und dann Gravitation anzuwenden, damit die Entity auf den Boden gedrückt wird. Das wird nicht nur aufgrund der ständigen Kollisionen mit dem Boden langsam, sondern bewirkt auch, dass die Entity in jedem kleinen Bodenspalte hängenbleibt und verhindert, dass sie Treppen oder Schrägen erklimmen kann. Verwenden Sie besser c_trace, um die Bounding-Box der Entity auf einen Abstand zum Boden zu halten und wenden Sie Schwerkraft nur überhalb dieses Abstands an. Das Beispiel unten zeigt eine einfache Bewegungsfunktion
Um eine Entity vo dem Erklimmen einer Treppe abzuhalten, werden Sie entweder sein Vorwärtsmomentun reduzieren, oder die Schwerkraft erhöhen müssen. Wollen Sie andererseits, dass eine Entity eine ganz bestimmte, hohe Stufe erklimmen soll, werden Sie ihre Vorwärtsgeschwindigkeit erhöhen oder die Schwerkraft verringern. Gibt man ihr genügend große Geschwindigkeiten, kann eine Entity jede Stufe von einer Höhe bis zur Hälfte ihrer Größe erklimmen (vorausgesetzt, c_setminmax wurde dazu verwendet, dem Ellipsoiden dieselbe Höhe wie die Entity zu geben). Aus diesen Gründen verwenden GameStudios Template-Skripte stattdessen zwei c_move-Aufrufe. Einen, um die Schwekraft abzuwickeln, den zweiten zum Handhaben der Kräfte, die auf den Player einwirklen. Dies ist eine flexiblere Lösung, welche mehr Kontrolle ermöglicht, ist natürlich aber langsamer als ein einziger c_move-Aufruf.
Hörte die Bewegung innerhalb eines passablen Blocks auf, wird die vordefinierte Variable in_passable auf 1 gesetzt. Endete die Bewegung inerhalb eines soliden Blocks (was nur dann geschehen kann, wenn passable Entities bewegt werden), wird die Variable in_solid auf 1 gesetzt.
Ist GLIDE gesetzt, wird die Funktion veruchen, so weit als möglich an der Oberfläche entlangzugleiten oder einen Weg um Hindernisse herum zu finden. Die Variable move_friction (Bereich 0..1, default 0.25) bestimmt die Stärke der Reibung beim Entlanggleiten an Oberflächen. Bei 0 ist gar keine Reibung vorhanden und bei 1 klebt die Entity an der Oberfläche fest und und gleitet kein bisschen. Ist die vordefinierte Variable disable_z_glide auf einen Wert ungleich 0 gesetzt, deaktiviert sie das Hinaufgleiten an Schrägen oder anderen Objekten.
Um dem Modell das Entlanggleiten an Wänden und anderen Objekten zu ermöglichen, wird die interne Bewegungsfunktion bei gesetztem GLIDE etliche (bis zu 6) Male ausgeführt. GLIDE kann daher die Bewegung verlangsamen und dazu führen, dass das Model an unerwarteter Stelle landet. Benutzen Sie GLIDE niemals für Türen, Lifte usw.
st ACTIVATE_TRIGGER gesetzt, wird die Event-Funktion einer sich in der Nähe befindlichen Entity ausgelöst, sofern diese den Flag ENABLE_TRIGGER gesetzt hat und entweder a) die Summe der trigger_ranges beider Entities größer ist als die Distanz zwischen der Move-Target-Position der ersten und dem Zentrum zweiten Entity oder b) der trigger_range der Entity, die sich in der Nähe befindet, Null ist, ihr Flag passable gesetzt ist und die Move-Target-Position innerhalb der Bounding-Box liegt.
Die Variablen move_min_z und move_friction legen die maximale Schritthöhe und das Gleitverhalten fest.
IGNORE_YOU kann verwendet werden um zu verhindern, dass ein Geschoss gleich im Gewehrlauf oder in der Entity, die sie abfeuert, stecken bleibt. !! Es ist ein üblicher Anfängerfehler, das Flag IGNORE_YOU, nicht aber den you-Pointer zu setzen. Dies verursacht, dass die Kollisionserkennung zufallsabhängig hin und wieder versagt, denn you wird von vielen Funktionen (inklusive dieser) modifiziert.
Physics entities lassen sich nicht direkt bewegen - wenden Sie stattdessen eine Kraft oder eine Geschwindigkeit an.
Geschwindigkeit:
Langsam
Beispiel (lite-C)::
// simple function for walking over ground
// control the player with the WASD keys
// player origin must be at the model center
// bounding box must be smaller than the player!
action player_walk()
{
// if necessary, adjust the bounding box to give the entity 'floor room' (see remarks)
// my.min_z *= 0.5;

var speed_down = 0; // downward speed by gravity
var anim_percent = 0; // animation percentage
VECTOR vFeet;
vec_for_min(vFeet,me); // vFeet.z = distance from player origin to lowest vertex

while (1)
{
// rotate the player using the [A] and [D] keys
my.pan += 5*(key_a-key_d)*time_step;

// determine the ground distance by a downwards trace
var dist_down;
if (c_trace(my.x,vector(my.x,my.y,my.z-5000),IGNORE_ME | IGNORE_PASSABLE | USE_BOX) > 0)
dist_down = my.z + vFeet.z - target.z; // get distance between player's feet and the ground
else
dist_down = 0;

// apply gravity when the player is in the air
if (dist_down > 0) // above floor, fall down with increasing speed
dist_down = clamp(dist_down,0,accelerate(speed_down,5,0.1));
else // on or below floor, set downward speed to zero
speed_down = 0;

// move the player using the [W] and [S] keys
var dist_ahead = 5*(key_w-key_s)*time_step;
dist_ahead = sign(dist_ahead)*(abs(dist_ahead) + 0.5*dist_down); // adapt the speed on slopes
c_move(me,vector(dist_ahead,0,0),vector(0,0,-dist_down),IGNORE_PASSABLE | GLIDE); // move the player

// animate the player according to its moved distance
if (dist_ahead != 0) // player is moving ahead
{
anim_percent += 1.3*dist_ahead; // 1.3 = walk cycle percentage per quant
ent_animate(me,"walk",anim_percent,ANM_CYCLE); // play the "walk" animation
}
else // player stands still
{
anim_percent += 5*time_step;
ent_animate(me,"stand",anim_percent,ANM_CYCLE); // play the "stand" animation
}
wait(1);
}
}


--> c_move(me, player_speed, nullvector, GLIDE);

Re: Kollisionserkennung [Re: benija] #312176
02/23/10 15:45
02/23/10 15:45
Joined: Jan 2010
Posts: 22
Bielefeld, Germany
T
TIEclon Offline
Newbie
TIEclon  Offline
Newbie
T

Joined: Jan 2010
Posts: 22
Bielefeld, Germany

mhh...ich bin zu spät...ich sollte lernen schneller zu schreiben laugh

c_move(ENTITY* entity,VECTOR* reldist,VECTOR* absdist,var mode)

Bewegt eine Entity über eine bestimmte Entfernung und führt dabei eine Kollisionserkennung, das Auslösen von Kollisions-Events sowie das Entlanggleiten an Hindernissen aus.

ENTITY* entity: dies ist der Pointer der Entity die bewegt werden soll. Wenn du c_move also in deine Playeraktion einbaust= my
VECTOR* reldist: Ein Vektor, der angibt, wie weit sich die ENTITY bewegt. Er bezieht sich auf die Richtung in die die Entity sieht.
VECTOR* absdist: Wie oben, nur das hier die Bewegung in die Richtung der Welt-Koordinaten geht.
var_mode= Verschiedene Eigenschaften, die man der Bewegung zuweisen kann. Die Eigenschaft GLIDE kommt ,denke ich, für dich in Frage. Andere Eigenschaften findest du in der Schnellhilfe von lite-c.

Wenn du den Unterschied von reldist und absdist noch nicht verstanden hast, hier ein Beispiel (es ist auch eins in den Tutorials):
Ein um 45 Grad gedrehtes Auto Bewegt sich immer mit dem Vektor (10,0,0), in zwei verschiedenen Arten:
1. c_move(my,vector(10,0,0),NULL,GLIDE);
2. c_move(my,NULL,vector(10,0,0),GLIDE);

Im ersten Beispiel geschieht folgendes: Das Auto fährt ganz normal, wie man es gewohnt ist geradeaus.
In Beispiel 2: Das Auto bewegt sich seitlich nach vorne, parallel zur X-Achse.

Zu c_move findet man in der Tutorialreihe unter "Bewegung" hierzu auch noch ein tolles Bild. Ich hoffe ich konnte helfen.

Last edited by TIEclon; 02/23/10 15:46.
Re: Kollisionserkennung [Re: TIEclon] #312185
02/23/10 16:06
02/23/10 16:06
Joined: Nov 2006
Posts: 116
benija Offline OP
Member
benija  Offline OP
Member

Joined: Nov 2006
Posts: 116
Vielen Dank, hat mir sehr viel weitergeholfen...

funktioniert jetzt!

Jetzt hätte ich aber noch eine weitere Frage:

wie kann ich Springen programmieren?

so, dass die Entity auf knopfdruck springt und auch wieder landet?



Last edited by benija; 02/23/10 16:10.

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