Mausposition abfragen und zur Positionierung eines Objekts benutzen.

  • #1, by MachtnixFriday, 18. December 2015, 18:49 9 years ago
    Hallo, zusammen!

    Letztens gab es hier ein kurzes Script zur Abfrage der Mausposition. Das würde ich gerne verwenden.

    Mein Raumschiff ist als Charakter definiert und am Platz eingefroren. Das Geschütz ist ebenfalls eine Person, die an seiner Drehachse denselben Animationsmittelpunkt hat. Dadurch liegen sie immer korrekt aufeinander. Natürlich lässt sich so das Raumschiff nicht mehr bewegen.

    Durch den Befehl "Ausrichten von Person an Objekt" richtet sich das Geschütz nach einem voreingestellten Objekt aus (hier der Meteorit). Dazu habe ich 15°-Drehungen eingebaut (war möglich mit Hilfe des Vis-"Explorers", siehe Screen) Die Geschosskugeln sind ebenfalls Personen, die an der Geschützachse starten und zum Objekt "Meteor" fliegen. Das funktioniert soweit ganz ordentlich. Bei jedem Mausklick wird eine Salve abgefeuert.

    Natürlich möchte ich nicht auf das Objekt schießen, wenn der MausCursor ganz woanders hinzeigt. Deshalb ist es sinnvoll, die Mausposition abzufragen und an diese Position jeweils ein (unsichtbares) Objekt zu plazieren, zu dem sich der Turm dreht und auf das die Geschosse fliegen. Ob nun dabei ein Objekt getroffen wird und ggf. expldiert, ist eine zusätzliche Option, die hier erstmal nicht wichtig ist.

    Leider kann man Personen nicht auf Personen ausrichten. Irgendwie klappt es nicht, das Objekt "Meteor" zu bewegen. Das funktioniert nur mit Personen - obwohl die Aktion "bewege Objekt" angeboten wird. Wahrscheinlich mache ich was falsch.

    Das Script ist denkbar einfach:
    local x = (getCursorPos().x + game.ScrollPosition.x)
    local y = (getCursorPos().y + game.ScrollPosition.y)
    
    print(x, y)
    


    Also, erstens:
    Wo steht überhaupt das "geprintete" Ergebnis von x und y? Dann kann ich überprüfen, ob das Script funktioniert.

    Zweitens:
    Die beiden Werte brauche ich, um ein bestimmtes Objekt ununterbrochen diesen Koordinaten zuzuweisen, sagen wir, im Abstand von 20 ms. Vielleicht mit einer Aktion, die immer wieder an den Anfang zurückspringt. Dann richten sich Kugeln und Turm nach diesem Objekt aus - das ja immer an der Mausposition stehen wird. Wie mache ich das?

    Gruß Machtnix

    Thread Captain

    1097 Posts


  • #2, by sebastianFriday, 18. December 2015, 21:11 9 years ago
    die print Ausgaben stehen im Log (im Spiel TAB drücken). Dazu musst du in visionaire das logginglevel auch auf INFO stellen.

    im TAB Menü dann "print log" eintippen, da sich die ausgabe nicht automatisch aktualisiert.

    Zur drehung des Geschützturms kannst du dir ja mal das Kompass Script anschauen:
    http://www.visionaire-studio.net/shop/article/skript-demonst...

    Thread Captain

    2346 Posts

  • #3, by MachtnixSaturday, 19. December 2015, 01:19 9 years ago
    Hallo, Sebastian.204,
    das war eine große Hilfe! Vielen Dank! Auf die Idee, das Log-File im Kommandozeilen-Tool zu suchen, bin ich gar nicht gekommen! Sonst hatte ich dieses Log-File ja nur bei Abstürzen - und die wollte ich nicht unbedingt jedesmal herbeiführen, nur um ein paar Werte zu testen... ;-)

    Zu dem Kompass-Tutorial: saubere Arbeit! Da hat jemand die "exakte" Lösung gewählt, mit viel Mathematik und Script. Da mein Geschützturm eigentlich funktioniert - nur nicht so komfortabel, und auf komplett andere Weise - brauche ich jetzt nur die Übertragung der Mauskoordinaten auf ein Objekt, um das Spielziel zu erreichen. Dann bin ich schon zufrieden. Mein Motto ist ja: möglichst ohne Lua auszukommen...

    Gruß
    Machtnix

    Thread Captain

    1097 Posts

  • #4, by sebastianSaturday, 19. December 2015, 12:33 9 years ago
    Ohne Lua wirst du da nicht hinkommen, da die Mauskoordinaten nur in Lua abgefragt werden können. Du kannst diese Variablen dann in "Visionaire Values" speichern, aber ich weiß nicht, was du dann damit anfangen kannst, da in vielen Actionparts diese Varianle nicht unbedingt abgefragt werden können, wenn es um Positionierung geht...

    Thread Captain

    2346 Posts

  • #5, by MachtnixSaturday, 19. December 2015, 17:42 9 years ago
    Die Mauscursorabfrage hat geklappt. 16:57:43 zeigt beide Werte. Also habe ich mir gedacht: probiere ich ein bisschen rum und frage mal die Position eines Characters ab. Das müsste ja ähnlich funktionieren. Da ich aber null Ahnung vom Visionaire Objekt Modell habe, konnte ich nur alles mögliche austauschen, um mal zu sehen, was danach im Log-File als Fehlermeldung steht. Diese Schreibweise kam mir logisch vor. Was genau ist falsch?

    Als nächstes brauche ich dann "nur" die Position des Characters auf die Positon des Mauscursors zu setzen (also M1 = x und M2 = y). Ich frage mich allerdings, warum jedesmal derselbe Wert angezeigt wird, auch, wenn ich die Maus bewege und das Log-File erneut aufrufe. Wird die Position nicht neu abgefragt? Welche Position ist es dann überhaupt, die abgefragt wird...?

    Ein bisschen Lua ist ja ok. Dagegen habe ich nichts. Nicht Lua ist das Problem, sondern das Visionaire Objekt Modell, das für mich wie Chinesisch aussieht...

    Ich brauche die Mauskoordinaten, weil ich dort ja hinschießen möchte. Ich möchte also an diese Stelle ständig ein Objekt oder einen Charakter plazieren (das/der sich z.B. alle 20 ms aktualisiert), damit das Geschoss sich dort hinbewegt (und der Turm sich dorthin ausrichtet). Das wäre eine Lösung, die fast ohne Lua auskommt. Tangens, Sinus und Polarkoordinaten sind mir zuviel Mathematik... ;-)

    Machtnix

    Thread Captain

    1097 Posts

  • #6, by sebastianSaturday, 19. December 2015, 18:48 9 years ago
    Hier einmal all das was du bei vis-objekten abfragen oder ggf. sogar ändern kannst:
    http://wiki.visionaire-tracker.net/wiki/Data_Structure

    Bei manchen Sachen steht ein blaues [?] hinter, wo du ansatzweise siehst, was nötig ist um es abzufragen.

    Für die Characterposition brauchst du also die Punkte aus "CharacterPosition"
    (CharacterPosition.x, CharacterPosition.y)

    Da aber wie oben im Link beschrieben für diese Visionaire Variablen ein "V" davorgesetzt werden muss, musst du "VCharacterPosition" abfragen.

    Vorausgesetzt Meteor2 ist ein Char, solltest du hiermit die Position von Meteor2 ausgeben können:

    local m2 = getObject("Characters[Meteor2]"):getPosition(VCharacterPosition)
    print(m2.x, m2.y)
    


    Dies sind übrigens die Werte auf der ganzen Scene (auch was du nicht siehst auf dem Bildschirm, falls die Scene größer ist). Beim Mauscursor fragst du anscheinend nur den sichtbaren Bereich ab, welcher sich ggf. verschiebt, wenn sich die Szene verschiebt...

    Warum dein Mauscursorwert sich nicht ändert, wenn du sie bewegst, weiß ich nicht...


    Thread Captain

    2346 Posts

  • #7, by MachtnixSaturday, 19. December 2015, 19:10 9 years ago
    Vielen Dank! Werde ich gleich ausprobieren. Ja, die Scripting und Data Structure-Seiten habe ich mir sogar ausgedruckt und davon picke ich mir das raus, was sinnvoll erscheint.
    Aber ich fühle mich wie jemand, der eine OP am offenen Herzen ausführen soll und noch nie ein Skalpell in der Hand hatte... ;-) Ich weiß im Grunde nicht, was ich da tue.

    Heißt das, der Wert "getPosition" beinhaltet ZWEI Werte (x und y)? Wieso braucht man dann für die Mauscursor-Abfrage ZWEI Abfragen? Ich versteh's einfach nicht...

    Ja, die Kulisse ist tatsächlich größer und scrollt, wenn die Maus an den Rand stößt.

    Wie genau der Mausoffset auf dem Spielfeld funktioniert, habe ich auch nicht verstanden. Ich kann ja mal scherzhalber zuerst den Mauscursor auf eine Position fixieren (mit setCursorPos(pos)) und diese mit dem Script danach ( getCursorPos() ) abfragen... :-) Müssten ja dieselben Werte sein, oder?

    Mit dem "V" meinst Du sicher dies:
    Fields which can be manipulated by the Scripting Language contain a green symbol inside of the Scripting column. If you want to access a field through scripting you have to use the field constants. A field constant starts with a V followed by the field name. E.g. to access the field GameCurrentScene you would have to use the constant VGameCurrentScene (the scripting command could look like this: game:getLink(VGameCurrentScene))

    Davon habe ich rein gar nichts verstanden. Was für ein "field"? Und überhaupt..? ;-) Das bedeutet, ich muss vor jeden Befehl ein "V" setzen, denn es sind ja alles "fields"?
    Also: z.B. CharacterCurrentCommentSet wird zu VCharacterCurrentCommentSet, CharacterCurrentOutfit wird zu VCharacterCurrentOutfit, usw. ?
    Und bei CharacterConditions oder CharacterDialogArea eben NICHT?

    Na, egal. Ich werde die Vorschläge einfach mal einbauen, ohne zu hinterfragen.

    Machtnix

    Thread Captain

    1097 Posts

  • #8, by sebastianSaturday, 19. December 2015, 21:43 9 years ago
    ja, getPosition gibt zwei werte zurück.

    die cursor variablen wurden einzeln abgefragt, weil dort jeweilsnoch die bildschirmposition (game.ScrollPosition.x bzw y) drauf addiert werden.
    Du kannst die koordinaten auch erst insgesamt abfragen und dann auf pos.x die game.ScrollPosition.x draufrechnen und das gleiche für y.

    Thread Captain

    2346 Posts

  • #9, by MachtnixSunday, 20. December 2015, 18:10 9 years ago
    Tja, es ist frustrierend und auch total sinnlos. Stundenlang habe ich jetzt einfach blindlings alle Schreibweisen ausprobiert und geschaut, was passiert.

    local x = (getCursorPos().x + game.ScrollPosition.x)
    local y = (getCursorPos().y + game.ScrollPosition.y)
    print(x, y)
    
    -- Test, dass tatsächlich was abgedruckt wird. Es werden IMMER dieselben Werte ausgedruckt, egal, wo die Maus steht --
    
    local m3 = getObject("Characters[Meteor2]"):getPoint(VCharacterPosition)
    print(m3.x, m3.y)
    
    -- bei getPoint wird immerhin 0 0 ausgedruckt - ohne Fehlermeldung! Da stimmt schon mal was. --
    
    m2 = getObject("Characters[Meteor2]"):VCharacterPosition
    print(m2.x, m2.y)
    getObject("Characters[Meteor2]"):VCharacterPosition("Characters[Meteor2]")
    print(m2.x, m2.y)
    local m1 = getObject("Characters[Meteor2]"):getObject(VCharacterPosition.x) 
    print (m1)
    local Meteorperson = getObject("Characters[Meteor2]")
    print ("Meteorposition")
    print (Meteorposition)
    print("Meteor2")
    print (Meteor2)
    local Meteorposition = getObject("Characters[Meteor2]"):getObject(VCharacterPosition.x) 
    print(Meteorposition)
    print(Meteorperson)
    local m4 = getPosition("Characters[Meteor2]"):getPosition(VCharacterPosition)
    print(m4.x, m4.y)
    print (m4)
    local m5 = getObject("Characters[Meteor2]"):ObjectPosition(VCharacterPosition)
    print(m5.x, m5.y)
    print(m5)
    
    usw. (es sind noch viel mehr...)
    

    Natürlich kommt da regelmäßig eine Fehlermeldung. Ist ja auch bekloppt. Ich komme mit dem Punktgedöns nicht klar und was wo stehen muss, wann Anführungszeichen, wann eckige Klammern, wann runde Klammern stehen müssen, wann was wem zugewiesen wird. Ich weiß zwar, dass es eine Art hierarchische "Adressierung" ist, also sowas wie: Weltall.Sonnensystem.Erde.Europa.Deutschland.München.Frauenkirche.linker_Turm. Taube_auf_dem_Dach, aber wie genau sich dieses in Visionaire zusammensetzt, kriege ich nicht raus.

    Ich habe die Koordinaten des Mauscursors. Ich möchte die Position eines Characters diesen Koordinaten zuweisen. Das geschieht in einer Schleife alle 20ms am Beginn der Kulisse. Mehr ist das nicht.
    Ich bin sicher, AFRLme scshafft das in 20 Sekunden...

    Auch wenn bis jetzt die Mauskoordinaten immer dieselben sind, dahinter werde ich auch noch kommen...

    Ich habe versucht, das Kompass-Sript abzuwandeln. Ich habe im Wike das getObject-Gedöns hoch und runter versucht. Ich habe versucht, irgendetwas von der Data Structure zu verstehen. Tut mir leid, mein Gehirn ist komplett blockiert. Ich habe einfach kein Händchen fürs Programmieren.

    Also: auch das vierte Minispiel klappt nicht ohne Programmier-Kenntnisse. Dann sollte man auch so ehrlich sein und sagen, dass Minispiele vielleicht machbar sind, aber eben NICHT ohne Lua und Kenntnisse des Visionaire-Objekt-Modell. Ganz besonders nicht ohne letztere...

    Machtnix

    Thread Captain

    1097 Posts

  • #10, by sebastianSunday, 20. December 2015, 19:38 9 years ago
    du musst dir im klaren sein wie die Struktur der abfragen aufgebaut sein müssen. Wie du schon erkannt hast sind sie ähnlich aufgebaut wie in deinem Weltall.Sonnensystem - Vergleich.

    Am Anfang von Objektbezogenen Abfragen steht immer das Objekt. Wenn du also dessen Position bekommen willst, brauchst du zuerst das Objekt und dann daraus dessen Position.

    Sachen wie du es bei m4 in deinem Codestück machst werden also nicht funktionieren.
    Genauso die Abfragen für m2 und andere, weil der syntax halt nicht stimmt.

    Allerdings weiß ich jetzt nicht, ob getPosition oder getPoint im Fall einer Characterpositionsabfrage richtig ist. getPosition wird eher für Sprites benutzt (animation oder Bild eines Objektes).

    Hier findest du eigentlich für alle Sachen den entsprechenden Syntax:
    http://wiki.visionaire-tracker.net/wiki/Scripting
    Man muss es dann nur auf das Character Objekt ummünzen.

    Grundsätzlich ist alles, was in Anführungszeichen (") steht als String zu verstehen. Hier kann der Inhalt also keine Variable sein.

    print("test") müsste "test" in den Log schreiben
    print(test) den wert variable "test"


    Das die für den Cursor immer die gleichen werte bekommst kann ich mir nur so vorstellen, dass du beim Log nicht ganz runter scrollst, sodass du den neuen Wert ablesen kannst...
    Bei mir funktioniert die Cursorabfrage aus deinem Code:
    function cursorpos()
    local x = (getCursorPos().x + game.ScrollPosition.x)
    local y = (getCursorPos().y + game.ScrollPosition.y)
    print(x, y)
    end
    

    inageme: TAB , dann "exec cursorpos()"


    Ich mach mir mal n paar gedanken zu der positionierung des Chars zum Cursor.
    Soll das "direkt" geschehen (teleport) oder dorthinbewegt werden (also der char soll dahin gehen)?

    Thread Captain

    2346 Posts

  • #11, by MachtnixSunday, 20. December 2015, 20:23 9 years ago
    Ah, du hast eine Funktion draus gemacht und die kann man dann abrufen. Hört sich gut an. Offensichtlich wird bei mir einfach immer nur dieselbe Anfangsposition ausgegeben und die scheint irgendwie fixiert zu sein (warum? keine Ahnung). Nein ich habe den Log mit print log immer neu aufgerufen und es war auch immer nur eine Seite, nix zum Scrollen.
    Ich finde, es fehlt hier einfach eine einführende und brauchbare Dokumentation. Lua zu lernen bringt mich nicht weiter, weil es hier ja um das interne Visionaire-Objekt-Konzept geht, was ich natürlich in keinem Lua-Buch finden werde...

    getPoint scheint ja ein echtes Ergebnis auzugeben, nur leider immer nur 0 0. Entweder beziehen sich die Koordinaten auf den Kulissen-Nullpunkt (da liegt der Charakter aber nicht) oder auf ein übergeordnetes Objekt, wie ich es aus Cinem4d kenne: alle untergeordneten Objekte beziehen sich auf das Mutterobjekt und sind relativ

    Vielen Dank für Deine Aufdröselung. Nach der Logik würde ich ja schreiben: getObject (Name) -> setPosition (Name). Aber sowas gibt es wohl nicht...

    Das mit den Sprites erschwert die Sache. Im Editor habe ich schnell gemerkt, dass ich zwar das Objekt verschieben kann, dessen Darstellung (Bild oder Ani, also Sprites) aber nicht hinterherkommt. Ich muss immer zwei Werte synchron ändern. Immerhin sieht der Spieler ja das Bild vom Objekt, die wirkliche Position des Objekts ist ihm herzlich egal...

    edit:
    Ich mach mir mal n paar gedanken zu der positionierung des Chars zum Cursor.
    Soll das "direkt" geschehen (teleport) oder dorthinbewegt werden (also der char soll dahin gehen)?
    Naja, die Plazierung des vermeintlichen Charakters ist nur der Fake, damit sich der Geschützturm nach ihm ausrichtet. Darum geht es ja die ganze Zeit. Der sogenannte Charakter ist nur dazu da, um nur das zu ermöglichen. Er besteht aus rein gar nichts. Ich könnte dasselbe ebensogut mit einem Objekt machen. Deshalb am liebsten sofortige Ausrichtung. Da das wahrscheinlich zu einer Endlosschleife führt, war vorgesehen: Plaziere Charakter auf Mausposition -> 20ms Pause -> Plaziere Charakter auf Mausposition usw.

    Machtnix

    Thread Captain

    1097 Posts