Hi,
ich hoffe bei dem Thread-Titel weiß jeder Bescheid, was gemeint ist =)
Falls diese Frage zu einfach für komplexe Technikfragen ist, bitte ich das zu entschuldigen und den Thread den anderen Bereich zu verschieben.
Ich habe in einem anderen Thread nach einer Lösung gefragt um ein Objekt in Richtung eines zweiten beliebigen Objektes auszurichten. Entscheidend ist dabei die Ausrichtung der direction. Dabei soll der kürzeste Weg berechnet werden und die Möglichkeit gegeben sein den Rotationsbereich des zu drehenden Objektes festzulegen. Die Schwierigkeit dabei liegt in dem eben genannten Rotationsbereich und dem Sprung zwischen 0 und 359 Grad.
Mein erster Ansatz sah folgendermaßen aus:
Spoiler anzeigen
Alles anzeigen
Allerdings wußte ich nicht wie ich einen eingeschränkten Rotationsbereich integrieren sollte. Dann hat mir Shoba seinen Lösungsansatz gezeigt, den ich aufgrund besserer Überschaubarkeit und Kürze und sowieso prompt übernommen habe ;)
Letztendlich habe ich mit Hilfe eines Freundes es auch geschafft einen Rotationsbereich festzulegen:
Spoiler anzeigen
Alles anzeigen
Der Code dürfte für Jedermanns Verständnis genug auskommentiert sein. Falls doch nicht, könnt Ihr gerne nachfragen. Das Skript setzt den zu berechnenden Winkel als direction fest und geht davon aus, daß man den image_angle oder den image_index zur visuellen Darstellung benutzt. Das ist es, was im Switch-Statement abgehandelt wird. Genaueres steht im Header.
Da eine Lösung ja bereits vorliegt, werde ich den Thread auch gleich als gelöst markieren. Falls Jemandem eine noch bessere oder einfach nur andere Alternative einfällt, kann diese hier gerne gepostet werden. Auch Optimierungsvorschläge des letzten Skriptes sind gerne gesehen, Hinweise auf Schreib- oder Ausdrucksfehler sowieso.
ich hoffe bei dem Thread-Titel weiß jeder Bescheid, was gemeint ist =)
Falls diese Frage zu einfach für komplexe Technikfragen ist, bitte ich das zu entschuldigen und den Thread den anderen Bereich zu verschieben.
Ich habe in einem anderen Thread nach einer Lösung gefragt um ein Objekt in Richtung eines zweiten beliebigen Objektes auszurichten. Entscheidend ist dabei die Ausrichtung der direction. Dabei soll der kürzeste Weg berechnet werden und die Möglichkeit gegeben sein den Rotationsbereich des zu drehenden Objektes festzulegen. Die Schwierigkeit dabei liegt in dem eben genannten Rotationsbereich und dem Sprung zwischen 0 und 359 Grad.
Mein erster Ansatz sah folgendermaßen aus:
GML-Quellcode
- ////////////////////////////////////////////////////////////////////////////
- //! FLAK Rotation
- //!
- //! Created By : [esn]
- //! Created On : [2006-05-02]
- //! Modified By : [esn]
- //! Modified On : [2007-11-18]
- ////////////////////////////////////////////////////////////////////////////
- //! Description :
- //! Rotates an object to any specified target object.
- //!
- //! Arguments :
- //! -argument0: Target object
- //! -argument1: Amount of steps to rotate the flak
- //! -argument2: Rotation speed (functions through the alarm[0] event)
- //! -argument3: A switch that defines the sprite animation
- //! (1 = pre-pixeled; 2 = computed; default is computed)
- //! -argument4: If argument3 is 1 use this value to define the
- //! image_index formula (e.g. (direction / 22.5) if you got
- //! 16 images of rotaion)
- //! -argument5: Start of rotation ccw in degrees
- //! -argument6: End of rotation ccw in degrees
- //!
- //! Usage :
- //! Put this script in the alarm[0]-event of any FLAK-object.
- //!
- //! Notes :
- //! *If argument3 = 1, you have to use the proper arguments in the
- //! shot pattern script too!
- ////////////////////////////////////////////////////////////////////////////
- {
- var vNum_DirectionToPlayer;
- vNum_DirectionToPlayer = point_direction(x, y, argument0.x, argument0.y);
- if (direction > vNum_DirectionToPlayer)
- {
- if (direction - vNum_DirectionToPlayer < 180)
- {
- direction -= argument1;
- }
- else
- {
- direction += argument1;
- }
- }
- else
- {
- if (vNum_DirectionToPlayer - direction < 180)
- {
- direction += argument1;
- }
- else
- {
- direction -= argument1;
- }
- }
- // choses between pre-pixeled and computed image animation
- switch (argument3)
- {
- case 1: image_index = round(argument4); break;
- case 2: image_angle = direction; break;
- default: image_angle = direction;
- }
- // sets the speed(delay) of the flak rotaion
- alarm[0] = argument2;
- }
Allerdings wußte ich nicht wie ich einen eingeschränkten Rotationsbereich integrieren sollte. Dann hat mir Shoba seinen Lösungsansatz gezeigt, den ich aufgrund besserer Überschaubarkeit und Kürze und sowieso prompt übernommen habe ;)
Letztendlich habe ich mit Hilfe eines Freundes es auch geschafft einen Rotationsbereich festzulegen:
GML-Quellcode
- ////////////////////////////////////////////////////////////////////////////////
- //! FLAK Rotation
- //!
- //! Created on : [2006-05-02] by [esn]
- //! Modified on : [2007-11-26] by [esn]
- ////////////////////////////////////////////////////////////////////////////////
- //! Description :
- //! Rotates an object to any specified target object.
- //!
- //! Arguments :
- //! -argument0: Target object
- //! -argument1: Amount of steps to rotate the FLAK
- //! -argument2: Rotation delay (functions through the alarm[0] event)
- //! -argument3: A switch that defines the sprite animation
- //! (1 = pre-pixeled; 2 = computed; default is computed)
- //! -argument4: If argument3 is 1 use this value to define the image_index
- //! formula (e.g. (direction / 22.5) if you got 16 images of rot.)
- //! -argument5: Start of rotation ccw in degrees
- //! -argument6: End of rotation ccw in degrees
- //!
- //! Usage :
- //! Put this script in the alarm[0]-event of any FLAK-object. Set argument5 to
- //! 0 and argument6 to 359, to get full range rotation of 360 degrees.
- //!
- //! Notes :
- //! *If argument3 = 1, you have to use the proper arguments in the
- //! shot pattern script too!
- ////////////////////////////////////////////////////////////////////////////////
- {
- var vNum_TargetDirection,
- vNum_NewDirection,
- vNum_AngleDifference,
- vNum_WayOfRotation;
- vNum_TargetDirection = round(point_direction(x, y, argument0.x, argument0.y));
- vNum_AngleDifference = abs( direction - vNum_TargetDirection );
- // checks whether to rotate the object at all or not
- if ( vNum_AngleDifference >= argument1 )
- {
- // get the shortest way cw or ccw
- if ( vNum_AngleDifference > 180 )
- {
- // rotate object cw
- vNum_WayOfRotation = -1;
- }
- else
- {
- // rotate object ccw
- vNum_WayOfRotation = 1;
- }
- // calculation of the objects new angle
- vNum_NewDirection =
- ( sign(vNum_TargetDirection - direction) * vNum_WayOfRotation * argument1 +
- 360 + direction ) mod 360;
- // set new direction only if it lies in the rotation area specified by
- // argument5 and argument6. two cases are needed because of the jump
- // from 0 to 359 degrees. the first case cares about rotation without
- // jumping between 0 and 359...
- if ( argument5 <= argument6 )
- {
- if ((vNum_NewDirection >= argument5) && (vNum_NewDirection <= argument6))
- {
- direction = vNum_NewDirection;
- }
- }
- // ...and the second one cares about that issue
- else
- {
- if ((vNum_NewDirection >= argument5) || (vNum_NewDirection <= argument6))
- {
- direction = vNum_NewDirection;
- }
- }
- // choses between pre-pixeled and computed image animation
- switch (argument3)
- {
- case 1: image_index = round(argument4); break;
- case 2: image_angle = direction; break;
- default: image_angle = direction;
- }
- }
- // sets the delay of the flak rotaion
- alarm[0] = argument2;
- }
Der Code dürfte für Jedermanns Verständnis genug auskommentiert sein. Falls doch nicht, könnt Ihr gerne nachfragen. Das Skript setzt den zu berechnenden Winkel als direction fest und geht davon aus, daß man den image_angle oder den image_index zur visuellen Darstellung benutzt. Das ist es, was im Switch-Statement abgehandelt wird. Genaueres steht im Header.
Da eine Lösung ja bereits vorliegt, werde ich den Thread auch gleich als gelöst markieren. Falls Jemandem eine noch bessere oder einfach nur andere Alternative einfällt, kann diese hier gerne gepostet werden. Auch Optimierungsvorschläge des letzten Skriptes sind gerne gesehen, Hinweise auf Schreib- oder Ausdrucksfehler sowieso.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von esn ()