Ergebnis 1 bis 4 von 4

Thema: Suche RGSS Kenner - Passability Abfragen in Movementskript einbauen!

  1. #1

    Suche RGSS Kenner - Passability Abfragen in Movementskript einbauen!

    Hi,

    Habe ne Zeit lang ein Skript bzw. einen Skripter gesucht, der mir ein Movementskript erstellen könnte. Genauer gesagt, ich möchte dass die Charaktere nicht 32 pixel weit bei einem schritt laufen sondern 16 pixel.

    Ein Pixel Movement Skript ist in meinen Augen 1. sinnfrei und unnötig und 2. zu viel performance fressend.

    Ich habe auch glücklicherweise das Skript bekommen. Derula (Techniker von Genocide) hat freundlicherweise sein Movementskript, mit welchem u.a. die bewegungen mit 16 pixel laufen frei zur verfügung gestellt.

    Das ist das Skript



    Funktioniert auch wunderbar... allerdings ist ein Problem vorhanden. Da man in meinem Fall ja jetzt 16 pixel mit einem schritt macht, kann man quasi auch zwischen 2 events stehen (von der position her). Das sähe so aus:


    Wie man vllt. schon ahnen kann, geht es mir genau um so einen Problemfall. Denn momentan ist es so, dass der Held im aufgeführten Beispiel nach unten gehen könnte. Das ist und soll aber nicht möglich sein. Denn, wenn der Held jetzt nach unten geht, steht er zwischen 2 Feldern bei denen keine passability nach links bzw. nach rechts vorhanden ist.

    Lösung:


    Oben, wenn der Held nach rechts oder links läuft und eben zwischen 2 Feldern steht.

    Unten, wenn der Held nach oben oder unten läuft und zwischen 2 Feldern ist.

    Beim Roten Punkt sollte keine Bewegung möglich sein, beim Grünen Punkt schon. Das heißt, eine zusätzliche Abfrage bei jeder Richtung, Links und Rechts die selbe Abfrage sowie bei Oben und Unten.

    Links und Rechts: Hat oberes Feld eine Begehbarkeit nach unten und unteres Feld eine Begehbarkeit nach oben?

    Oben und Unten: Hat linkes Feld eine Begehbarkeit nach rechts und rechtes Feld eine Begehbarkeit nach links?

    Ich habe jetzt nur die relevanten Begehbarkeitspfeile reingezeichnet, da es ja sowieso nicht möglich ist, wenn man zwischen zwei Feldern ist, sich z.B. von links nach rechts zu bewegen, wenn eins der 2 Felder keine Begehbarkeit nach links besitzt. Das heißt also auch, dass eben nur die eingezeichneten Pfeile abgefragt werden müssen.

    Es wäre wirklich nett, wenn ein fähiger Skripter diese Abfragen in das Skript noch einbauen könnte.

    greetz

  2. #2
    muh
    Code:
    module Genocide_Movement
    	class :Game_Character
    		def passable?(x, y, d, s = EVENT_DISTANCE, n = get_new_coordinates(x, y, d, s))
    			# Get new coordinates
    			new_x, new_y, dx, dy = *n
    			# If coordinates are outside of map: impassable
    			return false unless $game_map.valid?(new_x, new_y)
    			# If through is ON: passable
    			return true if @through
    			# Get move distance
    			s *= 0.25
    			# Standfeld berechnen
    			fx, fy = x.to_field, y.to_field
    			# Überprüfen, ob neues Feld betreten wird
    			cx = ((x - fx).abs < s and 0 < dx*(new_x - x))
    			cy = ((y - fy).abs < s and 0 < dy*(new_y - y))
    			#if cx and cy
    			#	return false unless $game_map.passable?(fx, fy, d) and $game_map.passable?(fx + dx, fy + dy, 10 - d)
    			if cx
    				return false unless $game_map.passable?(fx, fy, 5 + dx) and $game_map.passable?(fx + dx, fy, 5 - dx)
    				# Wenn y-Koordinate *,5 ist, Feld daneben prüfen
    				if y != fy 
              unless $game_map.passable?(fx, fy + (y <=> fy), 5 + dx) and
    													$game_map.passable?(fx + dx, fy + (y <=> fy), 5 - dx)
                return false
              end
              unless $game_map.passable?(fx + dx, fy + (y <=> fy), 8) and
    													$game_map.passable?(fx + dx, fy + (y <=> fy), fy + dy, 2)
                return false
              end
    				end
          end
    			if cy
    				return false unless $game_map.passable?(fx, fy, 5 - 3*dy) and $game_map.passable?(fx, fy + dy, 5 + 3*dy)
    				# Wenn x-Koordinate *,5 ist, Feld daneben prüfen
    				if x != fx 
              unless $game_map.passable?(fx + (x <=> fx), fy, 5 - 3*dy) and
    													$game_map.passable?(fx + (x <=> fx), fy + dy, 5 + 3*dy)
                return false
              end
              unless $game_map.passable?(fx + (x <=> fx), fy + dy, 4) and
    													$game_map.passable?(fx + (x <=> fx), fy + dy, 6)
                return false
              end
    				end
    			end
    			# Loop all events
    			for event in $game_map.events.values
    				next if event == self or event.through
    				# If through is OFF and (self is player => partner graphic as character)
    				# and event coordinates are consistent with move destination
    				if #not event.through and event.character_name != "" and
    					(self != $game_player or event.character_name != "") and
    					(event.x - new_x).abs < 1 and (event.y - new_y).abs < 1
    					# impassable
    					return false
    				end
    			end
    			# If self is not player, player through is OFF coordinates are consistent
    			# with move destination and your own graphic is the character
    			if self != $game_player and not $game_player.through and
    				@character_name != "" and ($game_player.x - new_x).abs < 1 and
    				($game_player.y - new_y).abs < 1
    				# impassable
    				return false
    			end
    			# passable
    			return true
    		end
      end
    end
    diese boolsche algebra ist die hölle ._.
    wie immer ein ostereierscript...viel spaß beim eier bugs finden. habs nicht ausreichend getestet.^^

    falls du was finden solltest bescheid geben und mir auf die finger haun.

  3. #3
    Man, du hättest aber echt mal sagen können, wie mans einbaut lol xD. Ich hab erst probiert und geguckt, ob mans vllt. ins skript selber einfügt und was überschreibt etc. Aber habs jetzt als neues Skript natürlich reingemacht.

    Und... FUNKTIONIERT! Geil ^^... Vielen Dank! Ich denke mal, es werden keine Bugs auftreten (hoffentlich). Wenn doch, meld ich mich entsprechend .

    greetz

  4. #4

    Users Awaiting Email Confirmation

    Hab beide Skripte kurz angetestet, und durch die 8-Dir Steuerung tauchen immer noch Fehler auf.
    Bei PLAYER_DISTANCE = 1 und 2, schiebt sich der Charakter diagonal so ungeschickt in die Kanten, das er dann dort drinnen stecken bleibt (und höchstens mit Maker-Strg rauskommt).



    Bei DISTANCE 3, bleibt er nur Teils hängen, geht aber auch diagonal mitten durch den Zaun (und 4 ist ja Standart).

    Wenn man die 8-Dir Steuerung jedoch auf False setzt, läuft es auf den ersten Blick einwandfrei (ausser das man recht häufig gegen die Kanten läuft). ^^

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •