• Anmelden

1

Freitag, 27. Mai 2011, 17:16

Mehr Self-Switches

Da ich mehr als nur 4 Self-Switches haben wollte hatte ich folgende Idee:

Den zweiten Switch für die Condition auf jeder Eventseite brauche ich eigentlich nicht. Könnte man nicht diesen Switch in einen Self-Switch "umwandeln"?
Mit der Auswahl der Variablen würde man den Self-Switch auswählen, der als Kondition gilt. So würde die Variable 1 der Self-Switch A werden, Variable 2 der Self-Switch B und so weiter. Dann wäre man ja nicht an 4 Self-Switches gebunden.

Im Anhang habe ich noch ein kleines Beispiel wie es werden sollte. (Funktioniert halt nicht ganz so wie ich es will...)

Edit: Ok, ich glaube ich habe es selber geschafft. :)
Dennoch wäre es nett, wenn es sich jemand anschauen und eventuelle Fehler oder Verbesserungen berichten würde.
Meine Änderung kann man im Script über Main ("switch2 -> self-switch" Zeile 22 - 28 ) betrachten. Die Anwendung findet im linken Event statt.
»fjurios« hat folgende Datei angehängt:

Reborn

hat beim Stromkonzern schon Rabatt

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

  • Nachricht senden

2

Freitag, 27. Mai 2011, 17:36

Hättest du die Forensuche benuzt, hättest du sicher was gefunden, kann mich da nämlich noch an was erinnern, aber hier mal ne einfachere Lösung:

Ruby Quellcode

1
$game_self_switches[[map_id, event_id, self_switch]] # self_swicht kannst du mit irgendeinem String austauschen, der standard ist von 'A' - 'D'

Im Call Script würde das so aussehen:

Ruby Quellcode

1
2
3
map_id = $game_map.map_id
$game_self_switches[[map_id, 
@event_id, 'A']] = true

(Wenn du eine Varialbe auf false setzen willst, musst du am schluss immer noch in die letzte Zeile true schreiben!!!)
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

sorata

Champion

Motto: Eines Tages werden auch Schildkröten fliegen, jawohl! Und wenn es nur wie bei Gamera ist! °^°

  • Nachricht senden

3

Freitag, 27. Mai 2011, 17:46

Self Switches sollte man eigentlich nur für Kleinigkeiten, wie bei Truhen etc. nutzen, da reichen die 4 im Standard völlig aus. Wenn das doch nicht reicht, kannst du ja auch mal normale Switches oder gar Variablen nutzen. Von denen hat man nun mehr als genug.

MfG Sorata
  • Projekte

    Bild

    Vollversion:
    Fortschritt: 50%

4

Freitag, 27. Mai 2011, 18:18

Hättest du die Forensuche benuzt, hättest du sicher was gefunden, kann mich da nämlich noch an was erinnern, aber hier mal ne einfachere Lösung:
Genau das habe ich auch gemacht. Doch für self_switch gab es viel zu viele Ergebnisse die nichts mit meinen Wünsch zu tun haben und ein konkreteren Begriff wüsste ich nicht.
map_id = $game_map.map_id
$game_self_switches[[map_id,
@event_id, 'A']] = true
Damit könnte ich aber immer noch nicht mehr als die ersten vier (A..D) Self-Switches als Kondition benutzen (auf einer Eventseite).

@ sorata
Hmm, wie soll ich es erklären. Ich verstehe was du meinst. Ich versuche ein eigenes KS zu gestalten. Dabei arbeite ich mit vielen Eventseiten pro Gegner. So gibt es eine Eventseite die nur für den Fall zuständig ist, dass das Event von einem Pfeil getroffen wird. Diese Seite wird grundsetzlich mit dem xten Self-Switch aufgerufen.
Würde ich es mit globalen Schaltern machen, müsste ich für jeden Gegner ein Schalter anlegen. Aber nicht nur das, ich müsste mir in jedes Mal mühselig für das passende Event herraus suchen, während ich bei meiner Lösung immer den gleichen Self-Switch aktivieren muss. Nur halt bei dem entsprechenden Event.
Ich finde es daher viel leichter mit Self-Switches zu arbeiten als mit globalen Schaltern.

5

Freitag, 27. Mai 2011, 18:22

Ich glaube es gibt auch 'ne Menge Scripte, die SelfVariablen einführen (in dem z.B. die ersten X Variablen zu SelfVariablen umbestimmt werden). Für deine Bedürfnisse ist das vielleicht hilfreicher, da man mit Variablen oft eine Menge Switches sparen kann.

Aber zu deiner Frage: Poste das Script doch im Klartext. Es will sich nicht jeder eine exe runterladen nur um ein Script zu lesen.
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Bex

Seher

Motto: Lets have some Fun.

  • Nachricht senden

6

Freitag, 27. Mai 2011, 18:39

Versuch mal anstelle des Selfswitches eine Variable pro Gegner zu nehmen.
Mit der Variable könntest du eine von 25 oder mehr Eventseiten aufrufen.
Und du veränderst nur den Wert der Variable.

Aber bevor wir da näher drauf eingehen,eine Frage:

1. Warum willst du die Eventseiten des Gegners verändern wenn er getroffen wurde ?
2. Reicht es nicht in dem Event das den Treffer berechnet bei dem Gegner eine Animation zu machen?
(z.B. ne Explosion oder halt einfach nur das der Gegner Rot aufblinkt und nen sound dazu)

(Ich bin auf dem Gebiet selber kein Experte deshalb frag ich so kritisch um zu sehen ob man bei denkfehlöern helfen kann
bzweise falls du die Eierlegende Wollmilchsau entdeckst will ich wissen wies geht^^).

7

Samstag, 28. Mai 2011, 15:27

Ich glaube es gibt auch 'ne Menge Scripte, die SelfVariablen einführen (in dem z.B. die ersten X Variablen zu SelfVariablen umbestimmt werden). Für deine Bedürfnisse ist das vielleicht hilfreicher, da man mit Variablen oft eine Menge Switches sparen kann.
Das hört sich wirklich noch besser an (zumindest wenn ich es richtig verstanden habe).
Aber zu deiner Frage: Poste das Script doch im Klartext. Es will sich nicht jeder eine exe runterladen nur um ein Script zu lesen.
Gesagt, getan(Zeile 22 - 28 ): :)

Spoiler

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
class Game_Event < Game_Character
	#--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
	# Initialize local variable: new_page
	new_page = nil
	# If not temporarily erased
	unless @erased
  	# Check in order of large event pages
  	for page in @event.pages.reverse
    	# Make possible referrence for event condition with c
    	c = page.condition
    	# Switch 1 condition confirmation
    	if c.switch1_valid
      	if $game_switches[c.switch1_id] == false
        	next
      	end
    	end
    	# Switch 2 condition confirmation
    	if c.switch2_valid
      	key = [@map_id, @event.id, c.switch2_id]
      	if $game_self_switches[key] != true
        	next
      	end
#      	if $game_switches[c.switch2_id] == false
#        	next
#      	end
    	end
    	# Variable condition confirmation
    	if c.variable_valid
      	if $game_variables[c.variable_id] < c.variable_value
        	next
      	end
    	end
    	# Self switch condition confirmation
    	if c.self_switch_valid
      	key = [@map_id, @event.id, c.self_switch_ch]
      	if $game_self_switches[key] != true
        	next
      	end
    	end
    	# Set local variable: new_page
    	new_page = page
    	# Remove loop
    	break
  	end
	end
	# If event page is the same as last time
	if new_page == @page
  	# End method
  	return
	end
	# Set @page as current event page
	@page = new_page
	# Clear starting flag
	clear_starting
	# If no page fulfills conditions
	if @page == nil
  	# Set each instance variable
  	@tile_id = 0
  	@character_name = ""
  	@character_hue = 0
  	@move_type = 0
  	@through = true
  	@trigger = nil
  	@list = nil
  	@interpreter = nil
  	# End method
  	return
	end
	# Set each instance variable
	@tile_id = @page.graphic.tile_id
	@character_name = @page.graphic.character_name
	@character_hue = @page.graphic.character_hue
	if @original_direction != @page.graphic.direction
  	@direction = @page.graphic.direction
  	@original_direction = @direction
  	@prelock_direction = 0
	end
	if @original_pattern != @page.graphic.pattern
  	@pattern = @page.graphic.pattern
  	@original_pattern = @pattern
	end
	@opacity = @page.graphic.opacity
	@blend_type = @page.graphic.blend_type
	@move_type = @page.move_type
	@move_speed = @page.move_speed
	@move_frequency = @page.move_frequency
	@move_route = @page.move_route
	@move_route_index = 0
	@move_route_forcing = false
	@walk_anime = @page.walk_anime
	@step_anime = @page.step_anime
	@direction_fix = @page.direction_fix
	@through = @page.through
	@always_on_top = @page.always_on_top
	@trigger = @page.trigger
	@list = @page.list
	@interpreter = nil
	# If trigger is [parallel process]
	if @trigger == 4
  	# Create parallel process interpreter
  	@interpreter = Interpreter.new
	end
	# Auto event start determinant
	check_event_trigger_auto
  end
end
zum Lesen den Text mit der Maus markieren


Versuch mal anstelle des Selfswitches eine Variable pro Gegner zu nehmen.
Mit der Variable könntest du eine von 25 oder mehr Eventseiten aufrufen.
Und du veränderst nur den Wert der Variable.
Habe ich mir auch schon überlegt, aber dann müsste ich immer noch für jeden Gegner im Spiel eine Variable. Ich finde es wird damit unübersichtlich. Da finde ich es leichter einfach die ID des Events einzugeben und den nötigen Schalter oder die nötige Variable zu ändern. Abgesehen davon finde ich es besser universell zu "programmieren". Soll heißen, ich lasse einfach die Events auf eine Kollision überprüfen und sage im Anschluss, dass bei den kollidierten Events der Schalter umgelegt werden soll. Damit hätte ich schon alle Fälle abgedeckt und müsste nicht dem Spiel sagen, wenn das Event kollidiert, dann lege den Schalter um und bei einem anderen einen anderen... Etwas verwirrend, ich hoffe du konntest mir folgen. Ansonsten, frag. :)
1. Warum willst du die Eventseiten des Gegners verändern wenn er getroffen wurde ?
2. Reicht es nicht in dem Event das den Treffer berechnet bei dem Gegner eine Animation zu machen?
(z.B. ne Explosion oder halt einfach nur das der Gegner Rot aufblinkt und nen sound dazu)
Auf einer Eventseite ist das "Verhalten" des Gegners beschrieben. Wenn er getroffen wird soll diese "Verhalten" unterbrochen werden. Zudem soll nicht nur der Schaden berechnet werden, sondern einige andere Dinge würden sich auch ändern (er wird zurückgeschleudert oder auch nicht...).
Ich könnte es höchstwahrscheinlich auch auf einer Seite machen können, aber ich finde es viel leichter und übersichtlicher es auf mehrere Eventseite auf zu teilen.
Konkretes Beispiel:
Auf der ersten Seite ist beschrieben, welche Angriffe, in welcher Reihenfolge, unter welchen Bedingungen der Gegner ausführt. Wird er getroffen, soll dies unterbrochen werden, also lasse ich auf eine andere Seite schalten. Diese ändert die Grafik, je nach Gegner und Attacke wird er zurück geschleudert (er springt weg...). Anschließend wird wieder auf die erste Seite geschaltet und der Gegner greift weiter an.

8

Samstag, 28. Mai 2011, 15:43

Dein Script, so wie es gerade ist, macht etwas anderes als du ursprünglich wolltest. Es stellt dir nicht einen zusätzlichen SelfSwitch zur Verfügung, sondern 5000 viele. Du kannst ja bei den Event-Condition einen zweiten Switch auswählen. Dieser kann ja ein Switch von #1 bis #5000 sein. Je nachdem welchen dieser Switches zu auswählst, bekommst du einen anderen SelfSwitch. Du hast also die SelfSwitches A, B, C, D und #1 bis #5000 zur Verfügung (was dir ja nur recht sein kann). Du musst aber eben darauf achten, dass du auch dieselben Switch-Ids auswählen musst, wenn du die selben SelfSwitches verwenden willst.
Um den SelfSwitch #200 auf ON zu setzen, musst du schreiben:

Ruby Quellcode

1
$game_self_switches[[@map_id, @event_id, 200]] = true


Willst du den SelfSwitch #150 auf OFF setzen, schreibst du

Ruby Quellcode

1
2
$game_self_switches[[@map_id, @event_id, 150]] = false
true

Beachte das true in der zweiten Zeile! Sonst hängt sich der Interpreter auf (ist ein Bug oder sinnloses Feature des Makers - ich weiß es nicht so genau).
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

9

Sonntag, 29. Mai 2011, 00:26

Vielen Dank. Vor allem für den Hinweis mit dem true in der nächsten Zeile. Ich würde sicherlich daran verzweifel...

Bex

Seher

Motto: Lets have some Fun.

  • Nachricht senden

10

Sonntag, 29. Mai 2011, 15:18

Ich verstehe es jetzt fjurio, könnte wirklich einfacher werdenmit den Self Switches.

Das Problem das der Gegner nicht angreift während der Held einen Treffer bei ihm Landet, hab ich so gelöst:
Wenn ein Gegner einen Treffer bekommt wird der Schalter HUD Gegner aktualiesieren eingeschaltet.
Dieser gleiche Schalter lässt auch das Event mit dem GegnerAngriff auf eine 2te leere Seite springen.
Das bringt eine halbe Sekunde Zeit...plus das die Gegnertrefferabfrage auch immer mit Wait 30Frames beginnt ,also 1Sekunde
Held unverwundbar wenn er erfolgreich getroffen hat.
Manchmal treffen sie sich zwar noch gegenseitig aber in 90% der fälle kann der Held ran an Feind, schlagen und sich auch wieder entfernen
ohne getroffen zu werden.Es kann kein Feind den Helden für diese Sekunde treffen da ja alle Gegner in einem Event berechnet werden,aber er schlägt ja auch erfolgreich,
also ist das nur mehr als normal,zumal dann auch keine Bugs auftreten durch mehrfache änderung eines Events durch verschiedene Events zur gleichen Zeit.
Da du es aber Skriptest wie ich jetzt erkenne, hilft dir das wohl nicht viel weiter.

Gruss Bex

11

Sonntag, 29. Mai 2011, 16:41

Da du es aber Skriptest wie ich jetzt erkenne, hilft dir das wohl nicht viel weiter.

Naja, ich versuche es. :) Aber falls du denkst, dass für diese Änderung (Mehr Self-Switches) große Scriptkenntnisse nötig sind oder du dich auf diese Weise vom Script "abhängig" machst, kann ich dich beruhigen. Mehr als das gespostete Script über Main einzufügen brauchst du nicht und die Switches änderst du anstatt des Eventbefehls mit einem Scriptcall wie es Kai gepostet hat.
Als Condition verwendest du anschließend den zweiten Switch. Die ID der Variabel die du hier anwählst ist auch gleichzeitig die ID des Selfswitch.

Ich denke es könnte dir auch helfen, auch wenn du das meiste per Events lösen möchtest.

Social Bookmarks