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?)


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 :)
Man kann sich auch gleich komplett neue Steuerungsoptionen erstellen. Siehe Sven's Paintchat.

Und bei Sven muss man sicher auch eine Taste drücken!!
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?)
>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.
Also um das richtig zu verstehen: Der Cursor des jeweiligen Spielers bekommt in dem Falle den ObjectControl-Aufruf? Dann ist ja gut.

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.

Fuer Originalpackobjekte sollten aber vielleicht besser nicht 1000 Mauscontrols definiert werden, die dann nur im Spezialfall benutzt werden.
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, [...]).

>"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
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.)

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...

Ich bin mir nicht ganz sicher, aber vielleicht hat CON_Aim noch irgendwelche Nebeneffekte - für irgendwas wird die ja auch genutzt :)
Ich habe eine neue Control gemacht, nur sind die Ergebnisse gleich.

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?
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.

Wenn ja, dann poste mal deinen Code
Ja, tue ich.
Das ist in etwa mein Clonk-Appendto:
und das ist der ObjectControl-Abschnitt im Objekt:
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;
}

if(foo)
if (foo->ObjectControl(plr, ctrl, x, y, strength, repeat, release))
return true;
return _inherited(plr, ctrl, x, y, strength, repeat, release);
?
Aaaargh, stimmt, das mein ich. Naja, funktioniert nun, Danke.
Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill