Guten Abend zusammen,
ich bastel momentan an einer kleinen Engine für ein nicht weiter wichtiges Projekt.
Die Engine ist im Grunde eine kleine Top-Down Engine.
Bedeutet die Spielfigur wird aus einer "fast" Vogelperspektive gesteuert.
Egal, ich verscuhe mal das Problem zu schildern:
Der Spieler hat verschiedene Waffen, eine Waffe definiert sich aus 18 Variablen.
Einer der Variablen gibt an wie stark der recoil/Rückstoß durch die Waffe ist.
Wenn ich einen Rückstoß von einem Pixel habe dann ist dies generell kein Problem.
Der Rückstoß beginnt, es wird auf Collision hin geprüft und dann werden die Koordinaten der Instanz angepasst.
Wenn der Rückstoß-Wert allerdings größer als 2 ist so werden innerhalb eines Steps entsprechend viele Pixel übersprungen... dies sieht sehr unschön aus und ich würde dann lieber zwar den Rückstoß von der stärker her beibehalten, aber den Rückstoß flüssiger ausgeben... am besten soll der gesamte Rückstoß innerhalb von in etwa room_speed/2 stattfinden... also eine halbe Sekunde für das flüssige Darstellen des Rückstoßes.
Der Rückstoß selber wird derzeit innerhalb des Global Mouse Left Button Events aktiviert.
Hier wird dann folgendes Skript aufgerufen:
Alles anzeigen
Das Problem besteht leider weiterhin.
Ich hab nun schon mehrere Jahre nichts mehr wirklich mti GM gemacht und hänge daher an diesem evtl. bescheuertem Problem fest.
Ich hatte gehofft dass ich durch das äußere repeat() das Verschieben der Koordinaten auf eine halbe Sekunde (room_speed/2) strecken kann...aber wie mir scheint klappt dies nicht
wirklich und die Aktion an sich erfolgt weiterhin innerhalb eines Steps.
Wie wäre denn nun die genaue Vorgehensweise für eine derartige Problematik?
Danke im Vorraus
Edit:
Generell ist mir klar wo das Problem liegt. Das Script wird innerhalb eines Steps ausgeführt, was ich bräuchte wäre ein step pro Schleifen-Durchlauf (repeat-schleife).
Momentan sehe ich keine Möglichkeit dies umzusetzen ohne größeren Aufwand betreiben zu müssen.
Edit:
Okay, sorry, das war dann einfach.
Des Rätsels Lösung ist einfach nur die Funktion screen_redraw.
Die Aktionen in der Schleife werden ja definitiv durchgeführt, nur da es noch immer derselbe Step ist wird es nciht visualisiert. Die screen_redraw Funktion erzwingt dies.
Am Ende sieht das ganze nun so aus:
Alles anzeigen
ich bastel momentan an einer kleinen Engine für ein nicht weiter wichtiges Projekt.
Die Engine ist im Grunde eine kleine Top-Down Engine.
Bedeutet die Spielfigur wird aus einer "fast" Vogelperspektive gesteuert.
Egal, ich verscuhe mal das Problem zu schildern:
Der Spieler hat verschiedene Waffen, eine Waffe definiert sich aus 18 Variablen.
Einer der Variablen gibt an wie stark der recoil/Rückstoß durch die Waffe ist.
Wenn ich einen Rückstoß von einem Pixel habe dann ist dies generell kein Problem.
Der Rückstoß beginnt, es wird auf Collision hin geprüft und dann werden die Koordinaten der Instanz angepasst.
Wenn der Rückstoß-Wert allerdings größer als 2 ist so werden innerhalb eines Steps entsprechend viele Pixel übersprungen... dies sieht sehr unschön aus und ich würde dann lieber zwar den Rückstoß von der stärker her beibehalten, aber den Rückstoß flüssiger ausgeben... am besten soll der gesamte Rückstoß innerhalb von in etwa room_speed/2 stattfinden... also eine halbe Sekunde für das flüssige Darstellen des Rückstoßes.
Der Rückstoß selber wird derzeit innerhalb des Global Mouse Left Button Events aktiviert.
Hier wird dann folgendes Skript aufgerufen:
GML-Quellcode
- /*
- Moves a object due to recoil effect after shooting
- argument0 = Object to get the recoil
- argument1 = Recoil strength
- argument2 = Recoil direction
- argument3 = bbox_top_offset
- */
- var _targetid, _xincr, _yincr, _rep;
- argument0.input = false
- if (argument1 > 1)
- _rep = room_speed/2
- else
- _rep = 1
- repeat(ceil(argument1))
- {
- //If the recoil strength is above 1 it will look cut-off..so we reduce the actual recoil strength
- //and instead increase the repeat
- _xincr = 1 / _rep
- _yincr = 1 / _rep
- //Check in what direction the recoil will push the object
- _xincr *= scr_direction_to_xincrement(argument2)
- _yincr *= scr_direction_to_yincrement(argument2)
- repeat(_rep)
- {
- _targetid = collision_rectangle(argument0.bbox_left+_xincr,argument0.bbox_top+_yincr+argument3,argument0.bbox_right+_xincr,argument0.bbox_bottom+_yincr,par_block,false,false)
- if !(_targetid)
- _targetid = collision_rectangle(argument0.bbox_left+_xincr,argument0.bbox_top+_yincr+argument3,argument0.bbox_right+_xincr,argument0.bbox_bottom+_yincr,par_target,false,false)
- if !(_targetid)
- {
- argument0.x += _xincr
- argument0.y += _yincr
- }
- }
- }
- argument0.input = true
Das Problem besteht leider weiterhin.
Ich hab nun schon mehrere Jahre nichts mehr wirklich mti GM gemacht und hänge daher an diesem evtl. bescheuertem Problem fest.
Ich hatte gehofft dass ich durch das äußere repeat() das Verschieben der Koordinaten auf eine halbe Sekunde (room_speed/2) strecken kann...aber wie mir scheint klappt dies nicht
wirklich und die Aktion an sich erfolgt weiterhin innerhalb eines Steps.
Wie wäre denn nun die genaue Vorgehensweise für eine derartige Problematik?
Danke im Vorraus
Edit:
Generell ist mir klar wo das Problem liegt. Das Script wird innerhalb eines Steps ausgeführt, was ich bräuchte wäre ein step pro Schleifen-Durchlauf (repeat-schleife).
Momentan sehe ich keine Möglichkeit dies umzusetzen ohne größeren Aufwand betreiben zu müssen.
Edit:
Okay, sorry, das war dann einfach.
Des Rätsels Lösung ist einfach nur die Funktion screen_redraw.
Die Aktionen in der Schleife werden ja definitiv durchgeführt, nur da es noch immer derselbe Step ist wird es nciht visualisiert. Die screen_redraw Funktion erzwingt dies.
Am Ende sieht das ganze nun so aus:
GML-Quellcode
- /*
- Moves a object due to recoil effect after shooting
- argument0 = Object to get the recoil
- argument1 = Recoil strength
- argument2 = Recoil direction
- argument3 = bbox_top_offset
- */
- var _targetid, _xincr, _yincr, _rep;
- argument0.input = false
- //If the recoil strength is above 1 it will look cut-off..so we reduce the actual recoil strength
- //and instead increase the repeat
- _xincr = argument1 / (room_speed/2)
- _yincr = argument1 / (room_speed/2)
- //Check in what direction the recoil will push the object
- _xincr *= scr_direction_to_xincrement(argument2)
- _yincr *= scr_direction_to_yincrement(argument2)
- //The complete recoil will be done within half a second (room_speed/2)
- repeat(room_speed/2)
- {
- _targetid = collision_rectangle(argument0.bbox_left+_xincr,argument0.bbox_top+_yincr+argument3,argument0.bbox_right+_xincr,argument0.bbox_bottom+_yincr,par_block,false,false)
- if !(_targetid)
- _targetid = collision_rectangle(argument0.bbox_left+_xincr,argument0.bbox_top+_yincr+argument3,argument0.bbox_right+_xincr,argument0.bbox_bottom+_yincr,par_target,false,false)
- if !(_targetid)
- {
- argument0.x += _xincr
- argument0.y += _yincr
- screen_redraw()
- }
- else
- break;
- }
- argument0.input = true
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von BlaXun ()