Ich bin zu dumm ;-)

Posted By: Tirti

Ich bin zu dumm ;-) - 03/25/14 15:30

Hallo,

wie der Titel schon sagt: "Ich bin zu dumm"
Ich könnte es jetzt auf meine mangelnde Schulbildung schieben,
aber ich glaube das zählt nicht.

Da ich nen mega Newbie bin, zieht da glaube ich schon eher (8 Tage Lite-C und nie davor Programmiert).

Habe derweil unzählige Tutorials gelesen und auch selber rumprobiert, aber es will nicht.

Nu das eigentliche Problem:

Jeder macht eine Ego oder Third Person View/Camera.
Das ist ja auch recht easy.
Es gibt 2 Mrd Tutorials dafür, aber keiner mit ner Iso Perspektive.

Ich Setzte also meine Camera, alles easy. Schreibe eine function damit ich die Camera
wenn ich die rechte Mousetaste gedrückt halt verschieben und drehen kann.
Zoomen mit Mouse Rad auch kein Ding. Jetzt kommt es, wie schaffe ich es
(vielleicht doch weil nur Hauptschule) das wenn ich den camera.pan sagen wir mal um 37°
ändere das der Zom noch korrekt funktioniert. Da mien Zoom auf Y X Z Achse aufsetzt
und die ja Global sind passt das nach einer kleinen Drehung nicht mehr. Ergo Zoomt meine Camera nach einer Drehung schräg :-(

Alles klappt, MouseCursor, Entitys Clickbar mit Events nur das @*+! <---selbst Zensiert
Zoomen nach einem Kamera schwenk nicht mehr.

Brauche echt Hilfe, weil "Ich bin zu dumm"

Grüße
Tirti

P.S: Habe ich vergessen, habe meinen camera.pan mit Modulo 360 genommen, somit weis ich ja welcher Winkel die camera gerade hat. Wobei mir auch das nicht wirklich hilft :-(
Posted By: Ch40zzC0d3r

Re: Ich bin zu dumm ;-) - 03/25/14 15:45

Den zoom macht man (je nach dem was du meinst) mit camera.arc
Falls es das nicht ist was du willst solltest du den "zoom" vector natürlich drehen bevor du ihn wirklich zoomst:

Code:
VECTOR vZoom;
vec_set(vZoom, vector(myzoom, 0, 0));
vec_rotate(vZoom, camera.pan);
vec_add(vZoom, camera.x);



Und das ist es laugh
Vektorrechnung lerne ich auch grade erst und bin q2(1 Jahr vor abi)
Posted By: Kartoffel

Re: Ich bin zu dumm ;-) - 03/25/14 15:47

Stell dich nicht bekloppter dar als du bist, hat mit Hauptschule ers recht nix zu tun.

Poste vielleicht mal deinen code, kann so nicht viel rauslesen (schau ich mir dann an wenn ich zuheuse bin)
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/25/14 15:57

@Ch40zzC0d3r

Sehr Cool, ich habe da mit einer kombination von X,Y und Z Koordinaten rumgedoktert.
Wohlgemerkt ohne brauchbares Ergebnis. Mit camera.arc geht des ja super ohne großes Rechnen^^ *freu*

@Kartoffel

Danke für die aufbauenden Worte, aber traue mich ja fast nicht den Schund den ich da geschrieben habe zu Zeigen.
Wie bekomme ich den so kopiert das man den hier auch lesen kann? Also das er die Formatierung behält?

Grüße
Tirti
Posted By: Kartoffel

Re: Ich bin zu dumm ;-) - 03/25/14 17:26

Code:
code tags ;)



[code]...dein code[/code]
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/25/14 18:15

HI Kartoffel,

also bitte nicht Hauen.
Das war der letzte nicht brauchbare Versuch

Code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function set_camera() 								
{		
	camera.tilt = -30; 								
	camera.y = 0; 									
	camera.x = -220; 								
	camera.z = 200; 									
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function move_cam() 								
{
while(1) 											
	{
		if(mouse_right == 1)
		{
			if(mickey.z < 0)
			{
				camera.pan += mickey.z*time_step;
			}
			if (mickey.z > 0)
				{
					camera.pan -=mickey.z*time_step;
				}
		}
		else
			{
			if (mickey.z < 0) 							
				{
					if (camera.z == 200) 				
					{
						camera.z +=0; 						
						camera.x -=0; 						
					}
					else 										
					{
						camera.z +=15; 					
						camera.x -=15;						
					}
			}
			if (mickey.z > 0) 						
				{
					if (camera.z == 50) 				
					{
						camera.z -=0; 						
						camera.x +=0; 						
					}
					else 										
					{
						camera.z -=10; 					
						camera.x +=10; 					
					}
				} 										
			}
		wait(1);
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



Grüße
Tirti
Posted By: Kartoffel

Re: Ich bin zu dumm ;-) - 03/25/14 19:15

Quote:
also bitte nicht Hauen.
jetzt gibts eins auf die zwölf!

also, was du im prinzip machst ist die kamera näher zu dem (woran auch immer du hinzoomen willst) bewegen, was nicht schlecht ist, aber im fall von anderen winkeln kleines bisschen komplizierter wird.

vorschlag 1: du verkleinerst einfach camera.arc (= field of view, in grad), damit ist der zoom so wie bei einer echten kamera
-> brauchst dir um kamera winkel keine sorgen machen

vorschlag 2: du machst das gleiche wie jetzt, nur mit vektoren (in dem fall würde sich die kamera wirklich auf das 'ziel' zubewegen)

sollte beides ganz gut klappen, kommt halt drauf an, welchen effekt du haben willst.
das ganze vektor zeug ist nur relativ haarig beim verstehn, wenn mans aber mal gerafft hat geht das ohne probleme.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/25/14 19:31

Also das ist jetzt die neue Version ;-)

Code:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function set_camera() 								
{		
	camera.tilt = -30; 								
	camera.y = 0; 									
	camera.x = -220; 								
	camera.z = 200; 										
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function move_cam() 								
{
	while(1) 											
		{
			if (mouse_right == 1)
				{
					camera.pan -= mickey.z*time_step;
					camera.x += mouse_force.y;
					camera.y += mouse_force.x;
				}
			else
				{
					camera.arc -= mickey.z*time_step;
				}
			wait(1); 										
		}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



neuse Problem ist das wenn ich auf die rechte Maustatse drücke, dann per Rad die PAN ändere funktioniert das links rechts bewegen natürlich nicht mehr so wie es soll :-(

Grüße
Tirti
Posted By: Superku

Re: Ich bin zu dumm ;-) - 03/25/14 19:34

Guck dir mal vec_rotate/ den ersten Antwortpost in diesem Thread an.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/25/14 19:49

@Superku,

also muss ich mich wohl doch mit Vectoren beschäftigen :-(
Aber wie kann ich den Vector der Bewegung ändern?

VECTOR newCamx;
vec_set(nemCamx, vector(camera.x+mouse_force.y, camera.y, camera.z));
vec_rotate(newCamx, camera.pan);
vec_add(newCamx, camera.x);

????
Ist mehr raten als wissen
Da ich ja jetzt nicht mehr den Vector für den Zoom sondern für die x y Bewegung brauche, müsste ich das ja 2 mal machen oder? Einmal für x und für y da sich die Camera ja um beide Achsen gleichzeitig bewegen muss?

Grüße
Tirti
Posted By: Slin

Re: Ich bin zu dumm ;-) - 03/25/14 19:54

Formatiere mal deinen Code ordentlich (über das was das bedeutet kann man super streiten, aber es sollte zumindest konsistent sein). Ich bin sehr dafür Geschweifte Klammern immer übereinander zu machen, so wie es bei dir schon ist und dann aber nicht weiter eingerückt, als das while oder if oder was auch immer. Auch finde ich es schöner bei sowas wie if (blubb) das Leerzeichen zwischen dem if und der Klammer nicht zu machen. Du machst es aktuell bei dem if, aber nicht bei dem while, also lass es gleich überall weg.
Bei deinem Code weiter oben steht else { if(irgendwas) { } }, stattdessen kann man auch einfach schreiben: else if(irgendwas) { }, ist wie ich finde deutlich übersichtlicher.

Für deine Probleme mit der Bewegung musst du etwas mit Vektoren herumrechnen, was eigentlich ganz einfach ist, vor allem mit Gamestudios Funktionen.
In deinem Fall willst du ja offenbar die Kamera abhängig von der Mausbewegung immer nach Vorne/Hinten bzw Links/Rechts bewegen und zwar immer in die entsprechende Richtung aus Sicht der Kamera. Dazu kannst du dir temporär einen Vektor für die Bewegung aus Sicht der Kamera bauen und musst diesen dann aber aus dem Koordinatensystem der Kamera in das der Welt transformieren. Da es nur eine Richtung ist Spielt dabei die Position der Kamera keine Rolle, sondern nur die Rotation. Du musst also diesen Vektor genauso rotieren wie die Kamera. Vektoren kann man mit ein bisschen unübersichtlichem sin/cos rotieren, in Gamestudio gib es da vec_rotate(vector, camera.pan). Das Ergebniss kannst du dann auf die Position der Kamera Addieren.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/25/14 20:14

Ok, auch wenn jetzt sicher alle denken ich bin doof, ich tue es weil es mir den
Anschein macht, das es hier für jeden das normalste der Welt ist.

Dürfte ich bitten das mir jemand den Code Schnipsel anhand meines Codes ergänzt?

Es geht nicht darum, das ich es einfach jemand anders machen lassen möchte.
Will eher versuchen anhand des Ergebnisses den Aufbau und die Berechnung bzw.
wie man es macht zu verstehen.

Code:
function move_cam() 								
{
while(1) 											
	{
	if (mouse_right == 1)
		{
		camera.pan -= mickey.z*time_step;
		camera.x += mouse_force.y;
		camera.y += mouse_force.x;
		}
	else
		{
		camera.arc -= mickey.z*time_step;
		}
	wait(1); 										
	}
}



Vorab ein danke, Tirti
Posted By: Slin

Re: Ich bin zu dumm ;-) - 03/25/14 20:25

Code:
function move_cam() 								
{
	while(1) 											
	{
		if(mouse_right == 1)
		{
			camera.pan -= mickey.z*time_step;

			VECTOR movedir;
			movedir.x += mouse_force.y;
			movedir.y += mouse_force.x;
			vec_rotate(movedir, camera.pan);
			vec_add(camera.x, movedir);
		}
		else
		{
			camera.arc -= mickey.z*time_step;
		}
		wait(1); 										
	}
}



Irgendwie so.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/25/14 20:35

Was mich etwas beruhigt ist, das dein Code das selbe Ergebnis bringt wie das
was ich gecodet hatte.

Leider hüpft die camera bei einem rechts click wie wild hin und her.

Da muss ich wohl doch noch etwas rumprobieren

Dennoch, danke

Tirti
Posted By: Superku

Re: Ich bin zu dumm ;-) - 03/26/14 04:44

Vorausgesetzt, deine Spielfigur hat den bereits definierten "player" Pointer zugewiesen, dann versuch es mal mit dem folgenden Code:

Code:
VECTOR newCamx;
var camera_zoom_dist = 384;

void move_cam() 								
{
	while(1) 											
	{
		if(player)
		{
			camera_zoom_dist = clamp(camera_zoom_dist+mickey.z*0.5,64,512);
			camera.pan -= mouse_right*mouse_force.x*time_step;
			camera.tilt = -65;
			vec_set(camera.x,vector(-camera_zoom_dist,0,0));
			vec_rotate(camera.x,camera.pan);
			vec_add(camera.x,player.x);
		}
		wait(1); 										
	}
}



Das Problem mit Slins Code dürfte sein, dass der lokale und temporäre movedir Vektor nicht (automatisch) auf 0 initialisiert wird, wie das bei globalen Vektoren der Fall ist.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/26/14 09:47

Danke für deinen Post Superku.
Problem ist, es gibt keinen Player ;-)

Da ich mir ne art Strategie(SC2/C&C) ausgedacht habe, ist der Player, der MouseCursor bzw. die Camera

Hatte schon überlegt, das kenne ich aus 3DSMax das ich an das Camera Ziel, eine unsichtbare ENTITY binde.
Damit könnte ich den Focus der Camera verschieben. Aber denke die Vectoren dieser Entity bringen mir ja für die eigentlichen Ansicht nichts.

Oder kann ich den Player Pointer auf die Camera legen?

Grüße
Tirti
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/27/14 09:14

Bin leider noch nicht weiter gekommen :-(

Grüße
Tirti
Posted By: Superku

Re: Ich bin zu dumm ;-) - 03/27/14 09:30

Mit einer unsichtbaren Entity sollte das relativ einfach sein. Probier doch mal etwas wie folgt (funktioniert vllt nicht auf Anhieb):

Code:
VECTOR temp;
var camera_zoom_dist = 384;

action move_cam() 								
{
	set(my,UNLIT | PASSABLE);
	while(1) 											
	{
		vec_zero(temp);
		if(mouse_pos.x < 16 || key_cul) temp.y = -8;
		if(mouse_pos.x > screen_size.x-16 || key_cur) temp.y = 8;
		if(mouse_pos.y < 16 || key_cuu) temp.x = 8;
		if(mouse_pos.y > screen_size.y-16 || key_cud) temp.x = -8;
		vec_rotate(temp,my.pan);
		vec_scale(my.x,time_step);
		vec_add(my.x,temp);
		
		my.pan -= mouse_right*mouse_force.x*time_step;
		camera.pan = my.pan;
		camera.tilt = -65;
		camera_zoom_dist = clamp(camera_zoom_dist+mickey.z*0.5,64,512);
		vec_set(camera.x,vector(-camera_zoom_dist,0,0));
		vec_rotate(camera.x,camera.pan);
		vec_add(camera.x,my.x);
		wait(1); 										
	}
}



Damit solltest du die camera mittels Pfeiltasten oder Mauszeiger nahe Bildschirmrand bewegen, mit der rechten Maustaste rotieren und mit dem Mausrad zoomen können.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/27/14 19:07

Hi Superku,

sieht an und für sich nicht schlecht aus. Geht aber leider auch nicht.
Ich glaube das hier das "my" wieder das Problem ist. Es gibt ja keine Entity
auf die das my in der Action passen würde. Daher bekomme ich vermute ich zumindest einen Script Crash

Grüße
Tirti
Posted By: Superku

Re: Ich bin zu dumm ;-) - 03/27/14 20:07

Originally Posted By: Superku
Mit einer unsichtbaren Entity sollte das relativ einfach sein.

Daher auch "action".
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/28/14 09:37

Stimmt ;-)

So habe das jetzt mal umgesetzt, sieht echt gar nicht so schlecht aus.
Jetzt das aber, es sieht so aus als ob er pro durchlauf den temp.y und temp.x
nicht addiert. Sprich es findet zwar einmalig eine Bewegung in eine Richtung statt.
Aber es geht halt nicht weiter, sie Idee finde ich sehr cool, das die Camera automatisch in die Richtung fährt
wenn ich in die nähe des Bildschirmrandes kommen. Was ich jetzt mal geändert hatte war, das ich den vec_zero(temp)
aus der while Schleife genommen habe. Frag lieber nicht wie das dann aussah^^

Grüße
Tirti
Posted By: Superku

Re: Ich bin zu dumm ;-) - 03/28/14 09:44

Code:
VECTOR temp;
var camera_zoom_dist = 384;

action move_cam() 								
{
	set(my,UNLIT | PASSABLE);
	while(1) 											
	{
		vec_zero(temp);
		if(!mouse_right)
		{
			if(mouse_pos.x < 16 || key_cul) temp.y = 8;
			if(mouse_pos.x > screen_size.x-16 || key_cur) temp.y = -8;
			if(mouse_pos.y < 16 || key_cuu) temp.x = 8;
			if(mouse_pos.y > screen_size.y-16 || key_cud) temp.x = -8;
			vec_rotate(temp,my.pan);
			vec_scale(temp,time_step);
			vec_add(my.x,temp);
		}
		else my.pan -= 8*mouse_force.x*time_step;
		camera.pan = my.pan;
		camera.tilt = -65;
		camera_zoom_dist = clamp(camera_zoom_dist+mickey.z*0.5,64,512);
		vec_set(camera.x,vector(-camera_zoom_dist,0,0));
		vec_rotate(camera.x,camera.pan);
		vec_add(camera.x,my.x);
		wait(1); 										
	}
}

void main()
{
	fps_max = 60;
	level_load(NULL);
	ent_create(SPHERE_MDL,vector(0,0,32),move_cam);
	mouse_mode = 4;
	var i;
	for(i = 0; i < 100; i++)
	{
		ent_create(CUBE_MDL,vector((random(2)-1)*512,(random(2)-1)*512,0),NULL);		
	}
}



Jetzt funktioniert's. Der Fehler war offenbar in Zeile
vec_scale(my.x,time_step);
welche natürlich
vec_scale(temp,time_step);
lauten muss.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/28/14 10:38

Ich will ehrlich sein, du bist mein Held!!!

Habe das jetzt so abgeändert
Code:
VECTOR temp;
camera.tilt = -35;
var camera_zoom_dist = 200;

action move_c()							
{
	set(my,UNLIT | PASSABLE);
	while(1) 											
	{
		vec_zero(temp);
		if(!mouse_right)
		{
			if(mouse_pos.x < 16) temp.y = 8;
			if(mouse_pos.x > screen_size.x-16) temp.y = -8;
			if(mouse_pos.y < 16) temp.x = 8;
			if(mouse_pos.y > screen_size.y-16) temp.x = -8;
			vec_rotate(temp,my.pan);
			vec_scale(temp,time_step);
			vec_add(my.x,temp);
		}
		else my.pan -= 8*mouse_force.x*time_step;
		camera.pan = my.pan;
		camera_zoom_dist = clamp(camera_zoom_dist+mickey.z*0.5,64,512);
		vec_set(camera.x,vector(-camera_zoom_dist,0,0));
		vec_rotate(camera.x,camera.pan);
		vec_add(camera.x,my.x);
		wait(1); 										
	}
}



So macht es genau das was ich will.
Wenn ich an den Rand fahre, fährt die Camera in die Richtung.
Zoom klappt wie es soll
Und, wenn ich den Camera Pan verändere, kann ich dennoch Zoome und die Camera
fährt am Rand genau da in wohin sie es soll.
Muss halt noch den clamp für den Zoom anpassen sobald ich genau weis
wie der Bereich sein soll.

Darf ich dir kurz erläutern wie ich das verstanden habe und du sagst mir ob das richtig istß Würde mir echt helfen

1. klar Vector "temp" erstellen
2. die erstellte Entity unsichtbar und passierbar machen
3. Vector "temp" pro durchlauf wieder mit 0en auffüllen
4. wenn rechte Mausstaste nicht gedrückt
grob wenn maus Rand berührt dann setzte temp.x bzw. y auf 8 bzw -8
5. rotiere temp um pan von der entity
6. (verstehe ich nicht) wieso werden hier alle 3 Werte mal time_step genommen?
7. Entity X + Vector "temp" = entity.x (auch das geht mir nicht auf)

Der rest, also ab else betrifft j nur den Zoom oder?

Danke Superku,
bin der festen Überzeugung das ich dafür Monate gebraucht hätte

Grüße
Tirti
Posted By: Superku

Re: Ich bin zu dumm ;-) - 03/28/14 10:44

Freut mich, wenn du nun etwas hast, womit du arbeiten kannst.

Zu 6.: Nahezu alle nicht-einmaligen Bewegungen/ Wertänderungen sollten mit time_step multipliziert werden. Umso höher die Framerate ist, desto kleiner ist time_step, was darin resultiert, dass die Entity/ der Wert auf allen PCs (in etwa) die gleiche Strecke zurücklegt/ Veränderung erfährt, und das unabhängig von der Bildwiederholrate (bspw. würde x++; auf schnellen PCs viel schneller wachsen als auf langsamen, sprich schreibe stattdessen x += 1*time_step; ).

Zu 7.: Was dir darin nicht klar ist, weiß ich leider nicht. Du willst doch my.x verändern (um indirekt die Kamera zu verschieben), also musst du etwas auf diesen Vektor addieren. Und das ist bei uns gerade temp, mit time_step skaliert.
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/28/14 10:52

Jetzt wird nen Schuh draus.
Habe zwar in meinem Buch schon mal die Erläuterung zu time_step nachgelesen.
Dachte aber das sich das nur auf Bewegungen von Entitys (also Animationen) bezieht.
Was mir aber jetzt beim lesen deiner Erklärung aufgefallen ist ( und das obwohl ich meine Entity "dummy" genannt habe)
benutze ich dummy ja quasi als Joystick für die Camera. Also habe ich eine Entity Bewegung
die ich über time_step normalisiere unabhängig der PC Performance.

*klatsch auf Stirn*

Sehe schon, das wird noch ein langer weg bis ich mal etwas Spielbares habe.
War mir vom Ablauf nur nicht sicher, dachte bevor ich mi über irgendwas tiefer
Gedanken mache, sollte die Camera bzw. Moussteuerung so funktionieren wie es soll.
Sonst stelle ich nachher fest das alles super, aber nicht bedienbar ist. Also dachte ich mir, erst die Bedienung dann Level und Co.

Grüße
Tirti
Posted By: Random

Re: Ich bin zu dumm ;-) - 03/28/14 12:10

Das kriegst du schon hin.
Überlege dir was du genau machen willst und arbeite es schrittweise ab.

Nenne dich niemals, selbst dumm!
Posted By: Tirti

Re: Ich bin zu dumm ;-) - 03/28/14 12:19

@Radom
Dane für die Aufbauenden Worte, jeder Anfang ist schwer sagt man.
Muss mich nur immer wieder bremsen, das ich mir nicht Gedanken über
Dinge mache die aktuell nicht, machbar bzw. zur Debatte stehen.

Nach dem jetzt die Camera steht, werde ich mal versuchen das erste Test-Level
zu Bauen.

Lasse euch am Fortschritt (sofern es einen gibt) teilhaben^^

Grüße
Tirti
© 2024 lite-C Forums