Not logged inOpenClonk Forum
Up Topic Community / German / Entwicklung - Mausposition
- - By ClonkGeist [de] Date 2012-01-28 14:35
Bezüglich des eigenen Entwickeln von Erweiterungen würde ich gerne wissen: Ist es irgendwie möglich die Position der Maus dauernd abfragen zu können, sodass man auch keine Tasten oder dergleichen drücken muss? (Oder gibt es eine Möglichkeit über die PlayerControls, sodass es einen Callback bei Mausbewegungen gibt?)
Reply
Parent - - By Clonkonaut [ie] Date 2012-01-28 14:36
Die Mausposition ist nur bestimmbar solange eine Maustaste gedrückt wird.
Reply
Parent - - By Zapper [de] Date 2012-01-28 14:51
Das stimmt nicht ganz.

Du kannst die Mausposition auch jeden Frame bekommen ohne, dass eine Taste gedrückt wird.

Zum testen einfach ein beliebiges Szenario starten und SetPlayerControlEnabled(0, CON_Aim, true); eintippen (+ noch irgendein Log("HEYHO"); in ObjectControl() ;)  ).
Das aktiviert die "Aim"-control, die die Mausposition dauerhaft übergibt. CON_Aim ist nur standardmäßig deaktiviert, da sie den Eintrag DefaultDisabled=1 hat.
Das ist dann auch die Antwort fuer ClonkGeist :)
Parent - - By Caesar [de] Date 2012-01-28 14:59
Man kann sich auch gleich komplett neue Steuerungsoptionen erstellen. Siehe Sven's Paintchat.
Parent - - By Zapper [de] Date 2012-01-28 15:11
Jo, klar. Meins war nur das Schnelltesten-Beispiel, weil ich mir auch unsicher war :)

Und bei Sven muss man sicher auch eine Taste drücken!!
Parent - By Caesar [de] Date 2012-01-28 15:12
Jup, aber man sieht sehr schön, was man anstellen muss, damit das auch geht, wenn keine Taste gedrückt ist.
Parent - By Clonkonaut [ie] Date 2012-01-28 14:59
Oh. Das war mir in der Tat noch nicht bekannt :o
Reply
Parent - - By ClonkGeist [de] Date 2012-01-28 15:26
Okay, danke schon einmal dafür. Allerdings scheint es bei mir dabei nur einen Aufruf auf PlayerControl() zu geben und nicht auf ObjectControl(). Was ich auch noch gern wissen würde wäre dann: Wie schaff ich es dann, dass die Steuerung an ein bestimmtes Objekt geht? Muss ich dafür die Funktion extra nochmal im Objekt selbst über PlayerControl() aufrufen? Oder wie ist das. (Oder: Wie würde hierbei der Funktionsname dann heißen, einfach ControlAim? Und wird das nur im gesteuerten Objekt aufgerufen oder auch noch in den "ausgewählten" Objekten?)
Reply
Parent - - By Caesar [de] Date 2012-01-28 15:42

>Muss ich dafür die Funktion extra nochmal im Objekt selbst über PlayerControl() aufrufen?


Du könntest SetCursor benutzen und würdest dann in dem Objekt ObjectControl(plr, CON_Aim, cursorX, cursorY, strength, repeat, release) bekommen.
Parent - - By ClonkGeist [de] Date 2012-01-28 16:52
Also um das richtig zu verstehen: Der Cursor des jeweiligen Spielers bekommt in dem Falle den ObjectControl-Aufruf? Dann ist ja gut.
Reply
Parent - By Caesar [de] Date 2012-01-28 17:09
Also PlayerControl() sieht ganz danach aus.
Parent - - By Newton [de] Date 2012-01-28 19:42
Ich will dir darauf auch eine Antwort geben.

Grundsätzlich: Ja. Für eigene (experimentelle) Szenarien ist das absolut möglich, dazu kannst Du ein eigenes ControlSet definieren was dann nur für dein Szenario(paket) statt dem normalen benutzt wird. Siehe dazu Spielersteuerung in der Doku. Du solltest aber bedenken dass diese Mauspositionen für alle Spieler an alle anderen Spieler im Netzwerk übertragen werden müssen.

Für das Originalpaket, also wenn Du z.B. ein spezielles Werkzeug erstellen willst, ist es eher nicht möglich - höchstens über irgendeine Haxerei wie sie Zapper beschrieben hat die ich aber nicht empfehlen würde. Ansonsten dazu: Siehe Clonkonaut.
Parent - By Sven2 [de] Date 2012-01-28 20:23
Man kann auch objektlokal Controls definieren, die die Maus uebertragen.

Fuer Originalpackobjekte sollten aber vielleicht besser nicht 1000 Mauscontrols definiert werden, die dann nur im Spezialfall benutzt werden.
Parent - - By ClonkGeist [de] Date 2012-01-28 20:45
Erstmal: Ja, es geht hier um eigene Szenarien. Ich habe mir auch das mit der Spielersteuerung angeschaut aber da blieb mir immernoch die Frage, wie das funktionieren soll, dass es nur auf Mausbewegung reagiert. Ich glaube, so wie ich das jetzt mal aus der Standard-PlayerControls.txt lesen kann, dass man dafür Assignments anlegen muss, wobei Key den Wert "GameMouse1Move" haben sollte? (Ist zumindest bei Aim auch der Fall) Oder liege ich damit jetzt in irgendeiner Art und Weise doch nicht richtig. (Oder verursacht es andere Probleme, [...]).
Reply
Parent - - By Zapper [de] Date 2012-01-28 20:59

>"GameMouse1Move" haben sollte? (Ist zumindest bei Aim auch der Fall)


Ich glaube in der aktuellen Version gibt es "GameMouseMove" und "GUIMouseMove" garnicht mehr - sondern nurnoch "Mouse1Move". Die aktuelle Version bekommst du bei Download->Development Snapshot.

Der Unterschied zwischen Game- und GUI-Mouse war, dass das eine die HUD Koordinaten bekommt und das andere die wirklichen Spielkoordinaten. Mittlerweile wird da anders unterschieden
Parent - - By ClonkGeist [de] Date 2012-01-29 20:00
Okay scheint alles soweit zu funktionieren. "Mouse1Move" sollte, wie es aussieht, vom Offset des Cursors ausgehen, richtig? Aber egal. Ich habe zusätzlich noch ein Problem, was ich vor dem Dev Snapshot (glaub ich mal.) nicht hatte: Ich kann nicht gleichzeitig die Mausbewegung abfragen und mich zusätzlich noch bewegen. (Hängt wohl irgendwie davon ab, was ich in ObjectControl zurückgebe? Wenn ich es überlade kann ich mich nur bewegen und nicht mehr die Mausbewegung abfragen. Wenn ich einfach true zurückgebe, dann kann ich nur die Mausposition abfragen aber ich kann mich nicht bewegen.)
Reply
Parent - - By Zapper [de] Date 2012-01-29 20:19
Mh, hast du versucht die Funktion zu überladen und false zurückzugeben?
Parent - - By ClonkGeist [de] Date 2012-01-29 20:38
Ich sags mal so: Ich habe in ObjectControl im Clonk das ganze so gemacht, dass es bei ctrl == CON_Aim eine Funktion mit den Mauspositionen aufruft. (return funktion(x, y);) In dieser Funktion gebe ich false oder true zurück. Solange das ganze also vor return _inherited(); sowohl true als auch false zurückgibt, scheint es, dass die Controls nicht mehr aufgerufen werden. Mache ich dies allerdings nicht, so bekomme ich keinen Call mehr wegen CON_Aim...
Reply
Parent - - By Zapper [de] Date 2012-01-29 20:57
Mh, du kannst ja mal versuchen dir eine neue Control zu machen, die auch die Mausposition uebergibt.
Ich bin mir nicht ganz sicher, aber vielleicht hat CON_Aim noch irgendwelche Nebeneffekte - für irgendwas wird die ja auch genutzt :)
Parent - - By ClonkGeist [de] Date 2012-01-29 22:08
Ich habe eine neue Control gemacht, nur sind die Ergebnisse gleich.
Reply
Parent - - By Zapper [de] Date 2012-01-29 22:51
Mh, nochmal zum Verständnis:

Du hast eine ObjectControl-Funktion im Clonk. (zB per appendto oder Clonk copy&paste).
In dieser Funktion fragst du ab, ob das ankommende Commando CON_Deineigenes ist, und wenn ja, dann machst du was damit und gibst true zurueck - in allen anderen Faellen false?
Parent - - By ClonkGeist [de] Date 2012-01-30 01:30
Genau so ist es. Ich habe es auch mal mit return false; versucht aber da funktioniert es nicht. In ObjectControl des ClonkAppendtos habe ich es mit return AnderesObjekt->ObjectControl(parameter); versucht (falls das Objekt existiert). Da ich hierbei die Funktion mit return abbreche, kommt es nicht zur Prüfung nach CON_*. Allerdings möchte ich immernoch, dass das Objekt alle Control-Calls erfährt. Nur wenn ich das return hierbei weglasse, so wird die Funktion irgendwie nicht mehr aufgerufen oder so. Wieso auch immer. Ich hoffe dass durch diesen Post das ganze klarer wird.
Reply
Parent - - By Zapper [de] Date 2012-01-30 10:12
Mh, rufst du inherited() auch mit allen Parametern auf, wenn du das Control nicht abfaengst?

Wenn ja, dann poste mal deinen Code
Parent - - By ClonkGeist [de] Date 2012-01-30 15:31
Ja, tue ich.
Das ist in etwa mein Clonk-Appendto:

local foo;

public func ObjectControl(int plr, int ctrl, int x, int y, int strength, bool repeat, bool release)
{
  if(foo)
    return foo->ObjectControl(plr, ctrl, x, y, strength, repeat, release);
 
  return _inherited(plr, ctrl, x, y, strength, repeat, release);
}

und das ist der ObjectControl-Abschnitt im Objekt:

public func ObjectControl(int plr, int ctrl, int x, int y, int strength, bool repeat, bool release)
{
  if (!this) return false;
 
  if(ctrl == CON_MouseMoved)
  {
    foobar(x, y);
    return true;
  }
 
  return false;
}
Reply
Parent - - By Sven2 [de] Date 2012-01-30 15:40
Du meinst wohl eher

  if(foo)
    if (foo->ObjectControl(plr, ctrl, x, y, strength, repeat, release))
      return true;
  return _inherited(plr, ctrl, x, y, strength, repeat, release);

?
Parent - By ClonkGeist [de] Date 2012-01-30 18:08
Aaaargh, stimmt, das mein ich. Naja, funktioniert nun, Danke.
Reply
Up Topic Community / German / Entwicklung - Mausposition

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill