• Anmelden

1

Freitag, 10. September 2010, 03:45

Kriege ne Krise mit dem Event ! Brauche mal bitte Hilfe ^^

Hi Leute ! Ich komm gleich zur Sache. Folgende Situation:

Mein Held hat eine Spitzhacke in der Hand und fuchtelt damit fröhlich in der Gegend rum wenn man die "F" Taste drückt. (Alle-Tasten-Script)
Sobald ihm ein Felsen im Weg steht kann er diesen mit der Spitzhacke zerstören. So... das klappt auch "fast" wunderbar. Steht der Held links vom Felsen und guckt nach rechts, drückt man also die F-Taste und der Felsen ist kaputt. ^^ Das ganze funktioniert auch wenn er rechts vom Felsen steht und auch wenn er über dem Felsen steht, es funktioniert nur nicht wenn er unter dem Felsen steht (und halt nach oben schaut). Warum weiß ich nicht. Ich habe den Code nun schon etliche male nach Fehlern durchsucht und einfach nichts gefunden. Ich bitte die jenigen, die etwas Ahnung von Event-Scripting haben, mal den Code durchzuschauen. Ich hoffe auch Hilfe :)

Hier das Event "Stein1"

Bild

Das Event hat halt noch eine 2. Seite die dann also mit dem "Stein1_kaputt"-Switch aktiviert wird. Die Seite ist leer und ohne Grafik. Die Hero X/Y Werte sind in einem seperaten Parallel Process-Event als Variable gespeichtert. Ich gehe ja eigtl. davon aus das der Fehler im markierten Bereich sein sollte. Ist er "meiner Meinung nach" aber nicht. Oder bin ich doch blind !?^^Ich hab echt keine Ahnung warum das nicht funktioniert. Zumal ja auch keine anderes Event o.ä. dazwischen funkt. Wie gesagt die anderen Richtungen funzen doch auch. Warum denn die nicht !? ^^

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

2

Freitag, 10. September 2010, 07:25

Wann weist du den Variablen "Spieler X" und "Spieler Y" die Werte zu?
Schau am besten mal mithilfe des Debug-Menüs (F9 im Testspiel) nach ob "Spieler Y" den richtigen Wert enthält...

Btw: da du die Heldenkoordinaten sowieso noch in "Control Variables" verrechnest könntest du dort eig. sogar direkt mit der Spielerposition arbeiten :)

ED: noch etwas aufgefallen:

Im zweiten CB fragst du ab, ob "Stein X" gleich 0 ist. Unter "Else" fragst du allerdings das Gleiche nocheinmal für den Fall ab dass der Held unterhalb des Felsens steht...
Da "Stein X" nicht gleichzeitig gleich 0 und ungleich 0 sein kann wird die in rot eingefasste Codestelle folglich niemals ausgeführt.

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Irrlicht« (10. September 2010, 08:48)


3

Freitag, 10. September 2010, 10:08

ok.. lösch deinen code komplett.. und code das hier nach:
Bild

Effizienter, Zeilenschonender und Übersichtlicher!
There was a Cave,
below a Silent's Grave.
Tunnels, extending far, running wide,
going deep into the World on the other Side.
Poor little Child, that was to brave,
died painfully deep down, in the Devil's Cave.

Motto: ich bin der brennende schinken

  • Nachricht senden

4

Freitag, 10. September 2010, 11:49

Mach es zwar wie esper ABER ersetz die evals ( Script: ) durch den schnelleren event-variablen.
eval ist langsam von daher nicht umbedingt immer wiederholen lassen wenn es auch ohne geht.
;( :jagen:

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

5

Freitag, 10. September 2010, 12:08

@Genocide: Ohne dass ich nun wüsste wie schnell nun deine Variante gegenüber Callscript ist: in dem Fall dürfte der Unterschied realtiv gesehen wirklich extrem minimal sein... ...zumal die betreffende Stelle sowieso nur abgefragt wird wenn die F-Taste gedrückt wurde...

(wobei ich in diesem Fall aber aus Prinzip schon vorschlagen würde hier mit "Button Input Processing" anstatt der Tastenabfrage des CB zu arbeiten... aber das wäre hier eher eine spieltechnische Änderung)

ED nach unten:
Wenn du trigger verwendest solltest du aber aufs "Wait" verzichten, sonst besteht eine Chance dass ein Tastendruck wärend des 2-Frame-Wait geschluckt wird...

ED2: Wurde eines besseren belehrt^^

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Irrlicht« (10. September 2010, 12:46)


6

Freitag, 10. September 2010, 13:51

Es wird nicht immer wiederholt.. sondern nur wenn die F Taste gedrückt wird..
Hab den ganzen Block ned umsonst in eine if gepackt..
Achja.. selbst auf meinem arschlahmen Netbook habe ich erst mit 57 dieser Events einen Frame verlust.. von lansgam kann keine Rede sein XD
Und ob ich jetzt den Eventbefehl für Variablen nehme, der über 1 Command, das Event und den Interpreter laufen.. oder direkt Eval mittels direktem Call Script.. Ist kein unterschied.
Zudem verballert die scriptvariante nicht für jedes Event 2 variablen, sondern arbeitet als standalone mit eben diesen 4 variablen.


Kleiner Tipp noch nebenbei

NICHT ".press?" verwenden.. sondern ".trigger?"
Vorteil: Trigger setzt vorraus, das die taste auch wieder losgelassen wird. somit hat man den code wirklich nur einmalig bei tastenanschlag.
There was a Cave,
below a Silent's Grave.
Tunnels, extending far, running wide,
going deep into the World on the other Side.
Poor little Child, that was to brave,
died painfully deep down, in the Devil's Cave.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chaosgod Espér« (10. September 2010, 13:51)


7

Samstag, 11. September 2010, 12:43

Danke für eure Hilfe. Leider funktioniert das mit dem Script nicht @Chaosgod. Jedesmal wenn ich dann im Spiel die F Taste drücke, zeigt er mir n Syntax-Error Fehler.

Zitat

Im zweiten CB fragst du ab, ob "Stein X" gleich 0 ist. Unter "Else" fragst du allerdings das Gleiche nocheinmal für den Fall ab dass der Held unterhalb des Felsens steht...
Da "Stein X" nicht gleichzeitig gleich 0 und ungleich 0 sein kann wird die in rot eingefasste Codestelle folglich niemals ausgeführt.
Aber die gleiche Sache hab ich doch bei CB 3 & 4 auch ? nur halt mit Y = 0. Das funzt ja auch !? Also wenn Hero links,rechts, über event steht. Ich mein wie muss ich das denn ändern damit es auch für "unter Event" funzt !? :)

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

8

Samstag, 11. September 2010, 13:07

Das Problem ist die Reihenfolge bzw. die Position des "Elsecase": dort funktioniert es weil du dort ebenfalls zuerst die X-Koordinate abfragst, die in beiden Fällen jedoch einzigartige Werte haben:
Insgesamt sieht die Abfrage zZ. so aus:

- Wenn die X-Variable 0 ist überprüfe, ob der Held nach oben schaut und unterhalb des Events steht -> Ende
- wenn diese Variable nicht 0 ist überprüfe ob die X-Variable 0 ist, der Held nach unten schaut und oberhalb des Events steht -> finde den Fehler^^
- Wenn diese Variable immernoch nicht 0 ist überprüfe ob die X-Variable 1 ist, der Held nach rechts schaut und auf einer Höhe mit dem Event steht -> Ende
- Wenn diese Variable nicht 0 und nicht 1 ist überprüfe ob die X-Variable -1 ist, der Held nach links schaut und auf einer Höhe mit dem Event steht -> Ende


Am besten löst du es nach dem bereits von Esper vorgeschlagenen Prinzip:
- Wenn die Taste nicht gedrückt wurde mache gar nichts (wozu auch?)
- Berechne die Koordinaten des Events
- Berechne die Koordinaten des Helden und korrigiere sie so, dass die Koordinaten das Feld vor dem Helden angeben (mit dem dieser auch interagieren würde)
- frage ab ob die X- und Y-Koordinaten identisch sind und führe nur dann den "Zerstörungs"-code aus (wahlweise ziehe die Koordinaten des einen von den Koordinaten des anderen ab und überprüfe, ob als Differenz in beiden Fällen 0 herauskommt)

deine Vorteile:
- du musst die Position nur einmal überprüfen und nur einmal den "Zerstörungs"-code einfügen (deutlich kürzer und du verhaspelst dich nicht in widersprüchlichen Bedingungen^^)


Wenn du deinen Code im Grunde behalten willst gäbe es u.A. diese 2 Möglichkeiten:

- Du fragst auch bei oben/unten zuerst die Koordinate ab, die die jeweilige Richtung eindeutig festlegt (Y-Koordinate, da dort ein Wert von 1/-1 in keiner anderen Richtungsabfrage vorkommt)
- Du verzichtest auf "Elsecase" und schreibst alle 4 Richtungsabfragen untereinander (sodass alle 4 Richtungen abgefragt werden... evtl. zusammen mit "Exit Event Processing" am Ende des "Zerstörungs"-code)

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »Irrlicht« (11. September 2010, 14:39)


Jeff Thunderbolt

Shoutbox-Camper

Motto: Es ist alles eine Frage der Definition

  • Nachricht senden

9

Samstag, 11. September 2010, 13:10

Du solltest darauf achten, dass du in Espérs Event, beim letzten Conditional Branch:
@px == @ex && @py == @ey
schreibst. Also 2 Mal & anstatt nur 1 Mal.
&& wird halt bei den Event Commands nur als & angezeigt, und wenns nicht da ist gibts halt nen Syntax Error.

~ Dark Thunder
  • HP :home:

    Bild
  • Forentreffen :foaf:

    BildBild

Reborn

hat beim Stromkonzern schon Rabatt

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

10

Samstag, 11. September 2010, 14:35

Ein & reicht auch Dark Thunder, man sollte dann nur @px == @ex und @py == @ey ausklammern

Ruby Quellcode

1
(@px == @ex) & (@py == @ey)

denn & hat eine höhere priorität als == daher auch der Syntax Error denn wenn bei dieser Zeile @ex & @py zuerst überprüft werden wird es binär genommen und es kommt irgend eine Zahl raus und es würde folglich nur noch dran stehen @px == irgendeine_zahl == @ey, was zu einem Fehler führt.
Aber bei (@px == @ex) & (@py == @ey) werden die geklammerten Sachen zu boolean und dann logisch mit & verglichen was dann den selben Effekt hat wie zwei &&.

Aber jetzt zum eigentlichem Thema.
Bei Espers's Methode müsste er ziemlich viel Cut&Paste anwenden und es währe am schluss sogar noch mehr geschriebenes als bei derMethode von Nebulaz, wobei ich nicht ganz verstehe wieso du abfrägst ob der Stein vor jemanden liegt. Naja auf jeden Fall meine Idee hier zu währe:

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Interpreter
  alias_method(:stone_destroy_initialize, :initialize)
  alias_method(:stone_destroy_update, :update)
  def initialize()
    stone_destroy_initialize()
    @in_the_area = false
  end
  def update()
    stone_destroy_update()
    if Keys.press?(Keys::F)
      name = $game_map.events[@event_id].charachter_name
      if name == "stone" # "stone" should be the name of the event pic else change the name of the pic or the string
        px, py = $game_player.x, $game_player.y
        ex, ey = $game_map.events[@event_id].x, $game_map.events[@event_id].y
        distance = (px - ex + py - ey).abs()
        if distance == 1
          @in_the_area = true
        end
      end
    end
  end
end

Über Main.

Jetzt musst du in jedem Event nur noch abfragen ob @in_the_area auf true steht um dann die animation von deinem Player in nem common event abzuspielen. Das ganze dann mit Parallelprocess.
Mehr als a Allgäuer ka a Mensch it wera.


Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?


Spoiler: OpenSource-Projects
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Reborn« (11. September 2010, 14:35)


11

Samstag, 11. September 2010, 14:42

Hm. :/ Also das Script von Chaosgod funzt immernoch nicht. Weder mit Klammern noch mit && oder auch beidem. ^^ Es kommt immer ein Syntax Error. Hab jetz meine Methode beibehalten und nach Irrlichts Anweisung geändert. Klappt jetzt alles. :)

Trotzdem würde ich noch gern wissen was an dem Script falsch ist bzw. warum es nicht geht, weil würde es gehen wär es ja sehr praktisch da es nicht so zeitaufwenig ist wie meine Variante. Man bedenke das im Spiel weit mehr als 1 Stein vorkommt ^^
Ich habe nochmal geschaut ob ich irgendwas falsch abgeschrieben habe, aber es ist alles korrekt. Das einzige was ich mich frage ist ob ich vielleicht die Variablen falsch eingetragen habe !?
Bei den Zeilen:

@ex = game_map.events[@event_id].x
@ey = game_map.events[@event_id].y

muss ich doch bei [@event_id] die nummer der variable eintragen oder nicht !? Also in meinem Fall hab ich es so geschrieben:

@ex = game_map.events[@30].x
@ey = game_map.events[@31].y

!? ^^

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

12

Samstag, 11. September 2010, 14:50

@ex = $game_map.events[@event_id].x
@ey = $game_map.events[@event_id].y

Du hast das $ vor game_map vergessen,
zudem bezeichnet @event_id die ID des gerade abgehandelten Events:
willst du dort eine andere ID einsetzen kannst du auch eine andere Zahl dort hineinschreiben, in diesem Fall aber ohne @


Wenn du eine allgemeingültige Funktion brauchst die mit quasi 0 Anpassung auf beliebig vielen Maps mit beliebig vielen Felsen funktioniert kann ich dir nur zu Hindis Variante raten :)

13

Samstag, 11. September 2010, 15:33

Danke :) Geht aber immernoch nicht.^^
Dafür bekomm ich jetz aber kein Syntax Fehler mehr, sondern eher sowas hier: "NoMethodError...undefined method ´events´ for nil:NilClass".

Und Hindis Variante kapier ich irgendwie nich : /

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

14

Samstag, 11. September 2010, 15:44

Der Fehler tritt auf, wenn man das in einem Parallel Process macht.

Du musst das Event leicht umändern.

Page 1, Autorun: Switch irgendwas = ON
Page 2, Parallel Process: Irrlichts Code
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

Social Bookmarks