Positionswechsel ohne "Objektflimmern"

Posted By: maslone1

Positionswechsel ohne "Objektflimmern" - 07/24/11 17:31

Hi Leute

Eventuell gibt es hierzu schon eindeutige Lösungsansätze.

Mein momentan kleines Problemchen ist, dass ich ein Objet von einer Position zu einer anderen Position Beamen möchte. Dabei ist die Kamera immer auf das Objekt gerichtet.

Es ist gibt da aber einen unschönen nebeneffekt. und zwar Flimmert das gebeamte objekt nach jeden koordinatensprung.

Ich denke es liegt daran, dass die Kamera erst im nächsten frame hinterherspringt.

Vereinfachtes Beispiel-COde:

if(my.x > 1000 || my.x < -1000)
{ my.x *= -0.95; camera.x = my.x; }

gibt es eine möglichkeit, diesen effekt zu beseitigen?
Eventuell eine goto anweisung?

Hatte schon jemand ein ähnliches "Problem"

VOrab schon mal danke für euren rat

Marcel
Posted By: Superku

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 18:01

Das muss eine andere Ursache haben. Zeig doch mal Bilder/ ein Video vom Flickern.

Quote:
Ich denke es liegt daran, dass die Kamera erst im nächsten frame hinterherspringt.


Das tut sie gemäß deines Beispielcodes nicht. Wenn du
my.x *= -0.95; camera.x = my.x;
schreibst, wird die Entity bzw. dein gesamtes Level/ Spiel ja nicht zwischendurch gerendert, sondern erst, nachdem der ganze Code für diesen Frame ausgeführt worden ist.
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 18:32

Das dachte ich mir auch bisher so, aber einen bug kann ich keinen finden.

Diesen unschönen Nebeneffekt habe ich bei meinem 3d spaceshooter.

Ich dachte ich hätte irgendo einen bug, und habe es bei meinem 2d-spaceshooter ausgetestet, mit dem selben "fehler". Es ist kein flackern im üblichen sinne. Es ist ein kurzes verschwinden des von der kamera verfolgten obektes.

Du kannst die den code vom 2d-spacergame hier ansehen und austesten:

http://www.opserver.de/wiki/index.php/2.5D_Spaceshooter_V0_1x_-_OpenSource_by_maslone1
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 18:38

ach, und folgenden code habe ich im pl-Ship.c unter der function plActor() vor der letzten wait(1) gesetzt:

if(my.x > 1000 || my.x < -1000) { my.x = my.x*-1*0.95; camera.x = Ships[1].x; camera.y = Ships[1].y; }
if(my.y > 1000 || my.y < -1000) { my.y = my.y*-1*0.95; camera.x = Ships[1].x; camera.y = Ships[1].y; }
Posted By: Superku

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 19:11

Ich guck mir diesen umfangreichen Code nicht an, so viel Zeit habe ich auch nicht.
Ships[1] ist was, ist das "my" in der Aktion?
Posted By: Pappenheimer

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 19:27

Originally Posted By: maslone1
ach, und folgenden code habe ich im pl-Ship.c unter der function plActor() vor der letzten wait(1) gesetzt:

if(my.x > 1000 || my.x < -1000) { my.x = my.x*-1*0.95; camera.x = Ships[1].x; camera.y = Ships[1].y; }
if(my.y > 1000 || my.y < -1000) { my.y = my.y*-1*0.95; camera.x = Ships[1].x; camera.y = Ships[1].y; }



Vielleicht liegt es ja auch nur am Übertragen in den Post, aber in der ersten Zeile muss camera.x = Ships[1].x; hin.
Also X statt Y.
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 20:49

um sicherzugehen habe ich camera.x und camera.y in beiden if anweisungen eingetragen. Ich bin gerade dabei ein kleines video hochzuladen, dass den effekt zeigt.

Zwischenzeitlich habe ich mich weiter mit dem code rumgespielt, aber ohne erfolg.
Posted By: Superku

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 20:58

Ok, so beantworte bitte folgende Frage:
"Ships[1] ist was, ist das "my" in der Aktion?"
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 21:05

Es ist ein Zeiger auf my.x bzw. my.y

Es ist also gleichbedeutend wie direkt my.x etc. zu schreiben
Posted By: Superku

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 21:48

Wenn ich im Wiki nach "Ships[1]" suche, lässt sich dort keine Definition oder Zuweisung an den Player-Pointer finden.

Übrigens, du schreibst dort oft folgendes:

my.x = vecPos[1];
my.y = vecPos[2];
my.z = vecPos[3];
vec_add(vecPos[1], vecSpeed[1]);
usw.

aber definierst den Array als
var vecPos[3] = {0,0,0};

Mir ist nicht klar, wie du das Programm überhaupt zum Laufen bekommst, aber Array-Einträge beginnen bei 0, sprich obiger Code müsste wie folgt lauten:

my.x = vecPos[0];
my.y = vecPos[1];
my.z = vecPos[2];
vec_add(vecPos[0], vecSpeed[0]);
Posted By: Rei_Ayanami

Re: Positionswechsel ohne "Objektflimmern" - 07/24/11 21:48

hast du die sache in der die camera steckt auch ge-geniust bzw unsichtbar gesetzt?
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/25/11 04:57

@Superku
Das mit den Array ist korrekt, es beginnt mit [0].
Da ich dieses kleine programm jedoch leserlicher/einfacher für anfänger schreiben wollte, habe ich es bewusst so hingebastelt. Jetzt im nachhinein, denke ich es ist doch verwirrender. Denn andere Arrays habe ich normal von 0 beginnende genutzt. (Der code funzt deshalb si einigermaßen, weil ich beim schiff nicht die z achse nutze.)

Übrigens hast Du Recht mit den Zeiger.
Das ist in meiner 3D Version so.
In meiner 2D Version ist es ein normaler Array, welchen ich in der Player-Funktion deklariert und definiert habe - sorry, hab das nach 1-2 jahren nach geschriebenen code vergessen.....

Aber dort liegt nicht der hund. In meiner 3d version verwende ich die arrays normal beginnend mit [0].


@Rei_Ayanami
Meinst du, es liegt an einem Flag?

Ich habe weder zum verfolgten Objekt nnoch zur kamera flags gesetzt. Meinst Du ich sollte diese explizit auf 0 stellen?
Das wäre ein Versuch wert....

Mein Camera-Code im 2d-spacer:

Code:
//-----------------------------------------------------
//_____________________________________________________
//
// PROJECT: 2.5D Spacegame
// CREATED BY MARCEL KLEE 2008/2009
//_____________________________________________________
//
//----------------------------------------------------- V 0.01
// Camera function

function Cam1()
{
	var cam_goal_dist;					//Variable for the camera-distance
	camera.z = Ships[1].z + 850;		//thats the cam-starting position
	
	while(1){	
		
		camera.x = Ships[1].x;		//the x and y position is always the player x and y position
		camera.y = Ships[1].y;
		
		cam_goal_dist = Ships[1].z + 850 + facCamAbst;     // always the standard-distanze plus the variable distance
		// how the variable-distance ist calculated you see in Pl_Ship.c
		
		if(camera.z < cam_goal_dist) { camera.z += 1.8; }  // the cam position follow the calculated cam_goal_dist variable
		if(camera.z > cam_goal_dist) { camera.z -= 1.2; }  // the reason why i use this: it brings more "dynamic" to the cam-movement
		
		camera.tilt= -90;  //look down
		camera.roll= 0;
		camera.pan = 0;
		
		wait(1);	
	}
}


Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/25/11 05:13

Ich habe soeben den entschluss gefasst, nochmals bei "0" zu beginnen.
Ich werde den Code zum test komplett vereinfachen, und nur direkt my.x, y, z verwenden. Mal sehen, ob da der effekt immer noch ist.
Sollte er dann immer noch da sein, werde ich es mit flag-setzen probieren....

vielen dank, dass ihr euch zeit genommen habt.

Wenn ich die ursache gefunden habe, werde ich sie posten
Posted By: Xarthor

Re: Positionswechsel ohne "Objektflimmern" - 07/25/11 05:33

Wenn die kamera hinterher hinkt, dann setze am anfang der kamera funktion proc_mode mal auf PROC_LATE (bei lite-C)
Hier die manual seiten:
http://www.conitec.net/beta/acrt-proc_late.htm
http://www.conitec.net/beta/proc_mode.htm
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/25/11 07:57

Danke Xarthor

Das könnte helfen.
Ich werde es bei Gelegenheit probieren. - Danke für den Hinweis!

Thanx a lot
ciao
Posted By: Superku

Re: Positionswechsel ohne "Objektflimmern" - 07/25/11 12:01

Quote:
Da ich dieses kleine programm jedoch leserlicher/einfacher für anfänger schreiben wollte, habe ich es bewusst so hingebastelt. Jetzt im nachhinein, denke ich es ist doch verwirrender.

Es ist leider auch falsch und Ursache unmöglicher Bugs:

var vecPos[3] = {0,0,0};
vec_add(vecPos[1], vecSpeed[1]);

Dann überschreibst du vecPos[1], vecPos[2] und vecPos[3]. Letzterer Arrayeintrag existiert aber nicht, wie bereits gesagt, und du überschreibst damit das, was im Speicher hinter dem Array steht, bspw. ein Pointer, eine Variable, ...
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/25/11 13:42

Richtig.
Wie gesagt, heute rückblickend würde ich es nicht mehr so machen.
Wie erwähnt, ist es schon "jahre" her, dass ich den Code verfasst habe (ich glaube jan 2009).
Ich weiß zwar heute nicht mehr warum, aber ich hatte es damals bewusst so gemacht laugh - sorry.

Aber es sollte hier auch nicht Thema sein, da dieser alte Denkfehler definitiv nicht in Verbindung mit dem "flimmern" steht.
Auch wenn ich den Array richtig stelle ( [0] [1] [2]) , was ich zwischenzeitlich vor wochen in einer aktuelleren version gemacht habe, ist das flimmern trotzdem da.

Ich werde heute Abend wieder rumtesten. Mal sehen was die Ursache ist -> mal lösungsorientiert debuggn wink
Posted By: maslone1

Re: Positionswechsel ohne "Objektflimmern" - 07/25/11 17:46

@Xarthor

You r the best.

Mit der anweisung "proc_mode = PROC_EARLY; " im player-code
und der global entity-pointer "player" im kamera-code
läuft es nun PERFEKT


Danke Superku, Danke Rei_Ayanami, DANKE Xarthor, und natürlich Pappenheimer

Ich hoffe ich kann Euch auch Mal irgenwann helfen....

© 2024 lite-C Forums