|
|
3th Person Kamera/Movement - Verbesserungsvorschläge?
#421206
04/13/13 14:16
04/13/13 14:16
|
Joined: Apr 2013
Posts: 27
LucasA
OP
Newbie
|
OP
Newbie
Joined: Apr 2013
Posts: 27
|
Hallo, nach langem lesen und basteln habe ich die Kamera so hinbekommen wie ich es wollte. ------------- Ist mein erstes Projekt und ich bin Neuling in dem Bereich. Habe hier mal den aktuellen Stand zum Download bereit gestellt. Ist alles enthallten: Aktueller Stand: 18.04.2013, 01:20 Uhr DownloadIst nichts besonderes. Es geht mir erst mal nur um die Spieler-Steuerung und die Kameraführung. Ziel soll eine World of Warcraft Steuerung sein. ------------- Die bisherigen Funktionen der Kamera: - 3th. person perspektive - Bei gerückter linker Maustaste in jede Richtung um den Spieler drehen - Sobald sich der Spieler bewegt, soll die Kamera wieder hinten den Spieler - Bei gedrückter linker+rechter Maustaste dreht sich der Spieler in Richtung Kamera. - Zoomfunktion mit Mausrad - Die Kamera soll nach oben und unten nur bis 90grad gehen. - Man sollte einen Mindest-Max-Abstand festlegen können - Kollisionserkennung: Die Kamera soll bei Hindernissen zwischen Kamera und Spieler an den Spieler ranzoomen und wieder rauszoomen wenn das Hindernis verschwunden ist. Bisherige Spieler-Funktionen: - Steuerung per "WASD" - Steuerung per "Pfeil-Tasten" - Steuerung per "Maus" - Mit gedrückter linker und rechter Maustaste kann der Spieler gesteuert werden. - Mit gedrückter rechter Maustaste kann der Spieler gedeht werden. - Mit gedrückter rechter Maustaste und "A, D, CUL oder CUR" kann der spieler seitwärts gehen. Da ich aber ganz neu in der Welt der Programmierung bin, habe ich sicher das eine oder andere suboptimal gelöst. Hat vielleicht jemand Verbesserungsvorschläge um den Code zu optimieren? Oder um die eine oder andere Funktion zu verbessern oder zu ergänzen? ToDo-Liste: - Irgendwas stimmt auf jeden Fall schon mal nicht mit der links-rechts Drehung des Spielers. Es sieht so aus als wenn die Kamera da immer nen kleinen rucker drin hat.- Der Spieler soll mit 1 Klick der Maustaste 4 automatisch gerade aus laufen. Aus dem aumatomatisch laufen Modus soll er rauskommen wenn: Maustaste 4 erneut geklickt wird oder man den spieler mit gedrückter linker+rechter maustaste manuell steuert oder man "W, S oder die Pfeiltasten vor, zurück" nutzt. Funktioniert nur sporadisch.- Die Kamera ist etwas zu star. Beispiel: Wenn man sich um den Spieler mit gedrückter linker Maustaste bewegt und dann anfängt zu gehen, ist die Kamera sofort hinter dem Spieler. Sie soll auch hinter dem Spieler sein aber eine art Fade effekt, so das die Kamera flüssiger sich wieder hinter den Spieler bewegt wäre besser.- Spingen muss noch eingebaut werden- Wenn der Spieler seitwärts geht, also mit gedrückter rechter Maustaste + "A, D, CUR oder CUL" stimmt was nicht, da der Spieler dauerhaft in die jeweilige Richtung läuft auch wenn die Maustaste losgelassen wurde. Erst durch erneutes klicken der rechten Maustaste hört er auf. Das ist nicht so gedacht.- Wenn der Spieler mit linker+rechter Maustaste gesteuert wird soll der Mauszeiger unsichtbar werden.- Die Fensterfunktionen (Minimieren und Maximieren) fehlen.- Bei klick auf die linke und/oder rechte Maustaste soll der Mauszeiger das Spiel im Fenstermodus nicht verlassen können. - Animationen den richtigen Aktionen zuweisen.
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: LucasA]
#421320
04/15/13 13:41
04/15/13 13:41
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Hi Lucas! Bei solchen Sachen ist eine kleine Demo am hilfreichsten. Bei ner Kamera kommt es ja auf das Gefühl an. Und wenn man das nicht schnell in einer Demo austesten kann, wirst du wohl vergeblich auf Feedback warten müssen. Wenn ich das z.B. jetzt testen müsste, dann müsste ich mir erstmal nen Spielercode zusammenwürfeln, da ich im Moment gar nichts in diese Richtung mache  Also, wäre toll, wenn du eine kleine Demo anbieten könntest, dann kriegst du auch dein Feedback 
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: HeelX]
#421326
04/15/13 15:51
04/15/13 15:51
|
Joined: Apr 2013
Posts: 27
LucasA
OP
Newbie
|
OP
Newbie
Joined: Apr 2013
Posts: 27
|
Hallo HeelX, ok, da ist was dran  Sorry, bin noch neu in dem Bereich. Ok, habe mal alles gepackt und zum Download bereit gestellt: DownloadIst wie gesagt mein erstes Projekt und ich habe bisher keine Programmier Erfahrung. Ist bisher nur ein mini Level ohne was besonderes. Geht mir aktuell erst mal um die Spielersteuerung und Kameraführung. Da es mein erstes Projekt ist, ist der Code sicher nicht Perfekt, darum die Frage hier was ich optimieren könnte, sollte....ect... Der TestDummy kann per "WASD", "Pfeiltasten" und per "Maus" gesteuert werden. Springen kann er noch nicht, soweit war ich noch nicht. Beim seitwärts gehen kommt keine Animation, weil der Dummy dafür keine hat  Mein Ziel ist eine World of Warcraft Steuerung. Da diese ja sicher von den meisten Gamern in Online Games gewohnt ist  Für Tipps was ich besser machen kann oder ändern sollte wäre ich dankbar  Aber bitte immer dran denken ich bin neuling 
Last edited by LucasA; 04/15/13 15:58.
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: LucasA]
#421340
04/15/13 18:56
04/15/13 18:56
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Also erst einmal für das erste vorgestellte Projekt schonmal was Schönes  Ich würde versuchen, die XYZ-Werte der Kamera, sowie die pan und tilt Werte der Kamera zu glätten. Schau dir mal die Funktion smooth an. Dann ist das alles viel glatter und eventuell löst sich dein links/rechts Ruckler damit auf. Versuche aber nichtsdestotrotz mal in der Kamerafunktion proc_mode = PROC_LATE; in der while-Schleife direkt zu begin nach dem while(1) zu setzen. Ansonsten kann ich die Kamera nur rauf und runter bewegen, wenn ich laufe. Mit dem Mauszeiger kannst du das ja so lösen:
if (mouse_left || mouse_right)
mouse_mode = 0; // aus
else
mouse_mode = 4; // an
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: HeelX]
#421354
04/16/13 00:28
04/16/13 00:28
|
Joined: Apr 2013
Posts: 27
LucasA
OP
Newbie
|
OP
Newbie
Joined: Apr 2013
Posts: 27
|
Danke dir  proc_mode = PROC_LATE, habe ich eingefügt. Die Beschreibung dazu klingt logisch  Die Smooth-Funktion habe ich getestet. Das Ruckeln würde nur verschwinden wenn ich es auf mind. 0.8 stelle. Was aber zur folge hätte, das sich der Spieler viel zu langsam dreht. Werde aber noch einwenig mit der Smooth Funktion rumspielen. mouse_mode = 0; sollte ja laut Beschreibung den Mauszeiger deaktivieren. Leider deaktiviert er nur jede Art von Mausklick. Der Mauszeiger ist aber weiterhin sichtbar. Soll das so sein oder sollte der Mauszeiger unsichtbar sein?
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: LucasA]
#421356
04/16/13 05:26
04/16/13 05:26
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Die Smooth-Funktion habe ich getestet. Das Ruckeln würde nur verschwinden wenn ich es auf mind. 0.8 stelle. Was aber zur folge hätte, das sich der Spieler viel zu langsam dreht. Nein, ich meinte dass du es auf die Kamera - nicht auf den Spieler - anwenden sollst. mouse_mode = 0; sollte ja laut Beschreibung den Mauszeiger deaktivieren. Leider deaktiviert er nur jede Art von Mausklick. Der Mauszeiger ist aber weiterhin sichtbar. Soll das so sein oder sollte der Mauszeiger unsichtbar sein? Im Fenstermodus, ja, im Vollbildmodus ist er nicht sichtbar. Das hat was mit Windows zu tun. Im Fenstermodus musst du dann zusätzlich noch mouse_pointer = 0 setzen. Soweit ich weiß funktioniert aber mouse_left/mouse_right auch bei mouse_mode = 0; lediglich die Entityevents funktionieren dann nicht. Wenn du mouse_mode anhaben willst, aber keinen cursor sehen willst, dann musst du dann wie gesagt im Fenstermodus mouse_pointer = 0 setzen und im Vollbildmodus in mouse_map eine RGBA Bitmap reinladen, die einen leeren Alphakanal hat.
Last edited by HeelX; 04/16/13 05:26.
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: HeelX]
#421398
04/16/13 14:56
04/16/13 14:56
|
Joined: Apr 2013
Posts: 27
LucasA
OP
Newbie
|
OP
Newbie
Joined: Apr 2013
Posts: 27
|
Ah, ok, verstehe. Der Mauszeiger tut nun das was er soll  Was ist denn an diesem Codeauszug falsch? Ziel: Bei Drücken der Maustaste 4 soll der Spieler automatisch laufen/gehen. Bei erneutem drücken der Maustaste 4 soll er stehen bleiben. Es funktioniert auch allerdings nur sporadisch. Verstehe nicht wo der Fehler liegen soll 
// Maustasten 4 und 5 definieren
#define mouse_4 (GetKeyState(5) > 1)
#define mouse_5 (GetKeyState(6) > 1)
#define AUTO_RUN skill2 // Automatisch laufen 0=aus, 1=an
function fAutoRun() {
my.AUTO_RUN = 0;
while(1) {
// Autorun
if (mouse_4) {
if (my.AUTO_RUN)
my.AUTO_RUN = 0;
else
my.AUTO_RUN = 1;
}
if (my.AUTO_RUN) {
vecPlayerMoveSpeed.x = (RUN_SPEED - key_shift * WALK_SPEED) * time_step;
vecPlayerMoveSpeed.x -= (RUN_BACK_SPEED - key_shift * WALK_BACK_SPEED) * time_step;
}
// Bewegen des Spielers mit Kollisionserkennung. dabei werden alle passierbaren Objekte ignoriert und dafür gesorgt, dass der Spieler an Kanten entlanggleitet.
c_move(me, vecPlayerMoveSpeed.x, nullvector, IGNORE_PASSABLE | IGNORE_PASSENTS | GLIDE);
}
}
Wenn "mouse_4" geklickt wird, dann wird geprüft ob "my.AUTO_RUN" auf 1 steht. Wenn ja, dann auf 0 setzten. wenn nein, dann auf 1 setzten. Wenn "my.AUTO_RUN" = 1 dann laufe und laufe und laufe und laufe...... Oder hab ich da einen Denkfehler?
Last edited by LucasA; 04/16/13 15:03.
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: LucasA]
#421399
04/16/13 15:06
04/16/13 15:06
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
das problem liegt darin, dass die if jeden frame gecheckt wird, und du das automatische laufen immer an und aus stellst solange du die taste hältst.
die tasten der windows-api haber aber ein spezielles verhalten, das man in dem fall glab ich ausnutzen könnte. Ich werd das schnell mal ausprobieren...
funktioniert, ich werde gleich ein kleines codebeispiel posten.
POTATO-MAN saves the day! - Random
|
|
|
Re: 3th Person Kamera - Verbesserungsvorschläge?
[Re: Kartoffel]
#421402
04/16/13 15:33
04/16/13 15:33
|
Joined: Jun 2009
Posts: 2,210 Bavaria, Germany
Kartoffel
Expert
|
Expert
Joined: Jun 2009
Posts: 2,210
Bavaria, Germany
|
hier ein funktionstüchtiges Beispiel. Es nutzt das spezielle verhalten der tasten unter windows: nicht gedrückt (wert = 0) -> gedrückt (wert > 1) -> nicht gedrückt (wert = 1) -> gedrückt (wert > 1) -> nicht gedrückt (wert = 0) (wieder am anfang)
#include <acknex.h>
// --- Das Wichtige vvv
#include <windows.h>
#define mouse_4 (GetKeyState(5) > 1) // status (1 oder 0) der 4. maustaste
#define mouse_5 (GetKeyState(6) > 1) // status (1 oder 0) der 5. maustaste
var _M4_toggle_var = 0; // hilfsvariable zum resetten
var _M5_toggle_var = 0; // hilfsvariable zum resetten
#define mouse_4_toggle ((GetKeyState(5) > 0) == _M4_toggle_var) // status (1 oder 0) der mit der 4. maustaste an und ausgeschaltet werden kann
#define mouse_5_toggle ((GetKeyState(6) > 0) == _M5_toggle_var) // status (1 oder 0) der mit der 5. maustaste an und ausgeschaltet werden kann
#define mouse_4_toggle_reset if(mouse_4_toggle) _M4_toggle_var = 1 - _M4_toggle_var // setzt mouse_4_toggle auf 0 zurück
#define mouse_5_toggle_reset if(mouse_5_toggle) _M5_toggle_var = 1 - _M5_toggle_var // setzt mouse_5_toggle auf 0 zurück
// --- Das Wichtige ^^^
void main()
{
fps_max = 60;
mouse_4_toggle_reset; // beide toggles auf 0 setzen
mouse_5_toggle_reset;
while(1)
{
DEBUG_VAR(mouse_4_toggle, 20);
DEBUG_VAR(mouse_5_toggle, 40);
DEBUG_VAR((var)GetKeyState(5), 80);
DEBUG_VAR((var)GetKeyState(6), 100);
if(key_enter)
{
mouse_4_toggle_reset; // beide toggles auf 0 setzen
mouse_5_toggle_reset;
}
wait(1);
}
}
mouse_4_toggle und mouse_5_toggle geben eine variable zurück, die mit den tasten immer zwischen 1 und 0 geschalten werden kann. Da die variablen über windows laufen, werden sie auch außerhalb der Applikation (selbst wenn sie nicht geöffnet ist) getoggelt, deshalb hab ich die reset-funktionen eingebaut. Die sind auch hilfreich, wenn du die variablen resetten willst sobald das spiel startet, sodass man das automatische Laufen nicht schon im menü aktiviert und im spiel sofort losrennt. Ich hoffe das ist jetzt nicht zu kompliziert geworden...
Last edited by Kartoffel; 04/16/13 15:40. Reason: so much edits
POTATO-MAN saves the day! - Random
|
|
|
|