PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : No problems ^,^] Adrian2000 - Problemthread(RGSS)



SMWma
11.04.2010, 13:03
Momentane Frage(n):

So, erneut habe ich eine Frage ^,^
Und zwar möchte ich, dass im laufendem Spiel eine Datei auf dem Desktop erstellt wird. Dabei ist es aber wichtig, dass die enstprechende .txt-Datei niergendswo im Game Ordner liegt. Dabei möchte ich den Text innerhalb Ruby selber bestimmen. Allerdings ist der Text bloß einzeilig.

Wichtig ist auch, dass der Name der .txt Datei bestimmbar ist.
Zum Beispiel wäre es sehr sinnvoll, dass die Datei den Namen »Blatt Papier.txt« heißt und den Inhalt: ,,Dies ist ein Blatt Papier"
bekommt.

Wie bereits gesagt ist es sehr wichtig, dass die Datei am Ende im Spieleordner nicht ist.
Dabei ist es mir eigentlich egal, ob die Datei im ~/MeinProjekt/Graphics/texte/Blatt Papier.txt/ ist und am Ende, wenn das Spiel verschlüsselt wird, nicht mehr einsehbar ist, aber vom Maker aus auf dem Desktop kopierbar ist oder ob sie sogar ganz mit Ruby erstellt wird, was ja bei einem einfachen Text Dokument nicht schwer sein sollte.

Außerdem: Wie ändere ich den Titel dieses Threads? ^,^


Wie lasse ich ein Icon anzeigen mittels Ruby?

Die Frage ist simple, die Antwort bestimmt auch ^.^
Ich möchte wissen, wie man Texte mit Ruby und auch Windows von der Seite einfahren lässt. Ich habe mir überlegt, dass ich am Anfang die Fenster außerhalb des Fensters, also zum Beispiel x = 640 y = 0. Und das klappt ja logischerweise auch ^.^ Aber mehr geht nicht. Also wie lasse ich ein Fenster und ein Text, welches unabhängig vom Text ist, einfahren?



1. Wichtigere Frage:

Wie erstelle ich am besten einen blinkenden Coursor?
Bisher habe ich nur das hier:

# Check for "Pfeiltasten" (whats the f*cking english word?)

case Input.dir4
when 4
$smi - 1
if $smi = -1
$smi = 2
end

when 6
$smi + 1
if $smi = 3
$smi = 0
end

end

# Check for current Index

if $smi = 0

end
if $smi = 1

end
if $smi = 2

end
Nun soll je nach dem Wert von der Variablen smi der Coursor wo anders angeziegt werden.
Dazu muss ich noch wissen, wie ich den Courser wieder disposen kann.

---

Warum funzt mein Skript nicht?
Es soll nach Pixel scrollen, wenn man eine bestimmte Taste drückt. Dabei soll der actor nicht mitbewegt werden.
Was ich bisher habe ist bloß das hier:

#------------------------------------------------------------------------------#
# In diesen Abschnitt wurde das Pixelscrollsystem eingebaut.
# $scrollspeed ist eine Variable, die eingestellt werden kann... später ^,^
#------------------------------------------------------------------------------#

class Game_Player
def update
last_moving = moving?
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
case Input.dir8
when 1
$game_map.scroll_left($scrollspeed)
$game_map.scroll_down($scrollspeed)
when 2
$game_map.scroll_down($scrollspeed)
when 3
$game_map.scroll_down($scrollspeed)
$game_map.scroll_right($scrollspeed)
when 4
$game_map.scroll_left($scrollspeed)
when 6
$game_map.scroll_right($scrollspeed)
when 7
$game_map.scroll_up($scrollspeed)
$game_map.scroll_left($scrollspeed)
when 8
$game_map.scroll_up($scrollspeed)
when 9
$game_map.scroll_up($scrollspeed)
$game_map.scroll_right($scrollspeed)
end
last_real_x = @real_x
last_real_y = @real_y
super
if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
$game_map.scroll_down(@real_y - last_real_y)
end
if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
$game_map.scroll_left(last_real_x - @real_x)
end
if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
$game_map.scroll_right(@real_x - last_real_x)
end
if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
$game_map.scroll_up(last_real_y - @real_y)
end
unless moving?
if last_moving
result = check_event_trigger_here([1,2])
if result == false
unless $DEBUG and Input.press?(Input::CTRL)
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
if Input.trigger?(Input::C)
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
end
end





Wie ändere ich die Character Graphic vom Helden X?
Beim Interprenter wird dies so gemacht:


# Get actor
actor = $game_actors[@parameters[0]]
# Change graphic
if actor != nil
actor.set_graphic(@parameters[1], @parameters[2],
@parameters[3], @parameters[4])
end
# Refresh player
$game_player.refresh
# Continue
return true
Aber jetzt was daraus verstehen? Nee ^,^

Lösung von Shisu:

Die Methode dazu sieht so aus =>
Code:
#--------------------------------------------------------------------------
# * Change Graphics
# character_name : new character file name
# character_hue : new character hue
# battler_name : new battler file name
# battler_hue : new battler hue
#--------------------------------------------------------------------------
def set_graphic(character_name, character_hue, battler_name, battler_hue)
@character_name = character_name
@character_hue = character_hue
@battler_name = battler_name
@battler_hue = battler_hue
end
Der erste Parameter ist der neue Name des Charsets, der zweite vom Farbton, der dritte ist wieder der Name der Battlergrafik und der 4. wieder der dazugehörige Farbton.

-KD-
11.04.2010, 13:41
Warum sollte "mehr" nicht gehen? Hast du es denn mal ausprobiert?

SMWma
11.04.2010, 14:34
nein... Ich meite von meinen momentanen Wissenstand kann ich nicht mehr. Ich hab null Ahnung, wie ich ein Fenster bewegen kann ^.^

The_Burrito
12.04.2010, 12:07
Im Endeffekt musst du doch nur in der Update-Methode der entsprechenden Szene die x und y Koordinaten anpassen.

Beispiel:


if window.x < 50
window.x += 2
end


So wird das Fenster in jedem Frame um 2 Pixel nach rechts geschoben, bis x bei 50 angelangt ist.

VegaCenter
12.04.2010, 16:20
Oh, ja das wollte ich auch 'mal wissen.
Aber so, dass die Textbox von unten kommt und oben sichtbar ist. Also so ein 1 Sekunden langer Fade-in Effekt. Sieht bestimmt besser aus, als beim normalen. Ich kenns so von Ocean of Mana ;-)

SMWma
12.04.2010, 22:23
sodele(lol, sodele? ^.^) es hat geklappt. Hatte zwar ein paar Probs, aber dies hatte mit nem Tippfehler zu tun xD
Hab geschrieben
@command-window.x
man beachte, dass ich vergessen habe, auf die Großstelltaste zu drücken ^.^
Naja, hat ja wunderbar hingehauen.

SMWma
13.06.2010, 12:52
*hust*
NACH OBEN SCROLLEN BITTE ^,^
*no more hust*

The_Burrito
14.06.2010, 09:39
Das kommt ganz darauf an wo du dieses Icon angezeigt haben möchtest. In einem Window würde z.b.


icon = RPG::Cache.icon(name, hue)
self.contents.blt(x, y, icon, icon.rect)

genügen. Das funktioniert natürlich auch mit jedem beliebigen anderen Bitmap.

Wenn du es eigenständig irgendwo am Bildschirm anzeigen möchtest brauchst du dafür ein Sprite.


sprite = Sprite.new
sprite.x = x
sprite.y = y
sprite.bitmap = RPG::Cache.icon(name, hue)


Ein bisschen mehr Information wäre schon nützlich ;)

SMWma
14.06.2010, 20:13
ich habe allgemein geredet ^,^ Danke xD

SMWma
04.09.2010, 16:29
Bitte beachten Sie den ersten Post. Dort wurden bereits zwei Fragen reineditiert, die mit einen · versehen wurden. Danke. ^,^

ETeCe
05.09.2010, 00:42
Für Position:
Mir fiele da keine andere Lösung ein als jedes Event abzufragen:
Mindestens ein Event:

def event_on_position( x, y) #neue Funktion
$game_map.events.each_value do |event| # wiederhole für jedes Event:
return true if event.x == x and event.y == y # gebe <true> zurück wenn Koord. übereinstimmen
end #
return false # wenn nichts gefunden wurde gebe <false> zurück
end #Genau ein Event:

def event_on_position( x, y) #neue Funktion
event_found = false # initialisiere Flag für gefundenes Event
$game_map.events.each_value do |event| # wiederhole für jedes Event:
if event.x == x and event.y == y # wenn Koordinaten übereinstimmen:
return false if event_found # gebe <false> zurück wenn bereits zuvor ein Event gefunden wurde
event_found = true # setze Flag auf <true>
end #
end #
return event_found # gebe Flag zurück
end #=>
event_on_position( x, y)Für Terrain-Tag gibts im RMXP hingegen bereits eine nützliche Funktion:

$game_map.terrain_tag( x, y)

-KD-
05.09.2010, 21:34
Mit Enumerable#any? kannst du auch prüfen ob ein Element einer Collection eine bestimmte Eigenschaft inne hat.

$game_map.events.any? do |event_id, event|
event.x == x && event.y == y
end

SMWma
06.09.2010, 13:00
Für Terrain-Tag gibts im RMXP hingegen bereits eine nützliche Funktion:

$game_map.terrain_tag( x, y)
Das bedeutet, möchte ich nun den Terrain Tag des Feldes X/Y herausfinden und diesen Wert in einer game_variable abspeichern, so müsste ich lediglich diesen Code abfrufen:


$game_variables[9] =
$game_map.terrain_tag(1,2)

Der Zeilenunbruch ist deshalb, weil der Call-Skript-Befehl leider nur kürzere Befehle aufnehmen kann.

Doch das löst nicht so richtig mein Problem: Gebe ich dem Wasser den Terrain-Tag 1, so gibt es 2 aus. Doch gebe ich den Wasser den Terrain-Tag 2, so bekommen ich 1. Und bei 7 für das Wasser bekomme ich auch den Wert 1 zurück.

Und dein kleines Skript:

def event_on_position( x, y) #neue Funktion
$game_map.events.each do |event| # wiederhole für jedes Event:
return true if event.x == x and event.y == y # gebe <true> zurück wenn Koord. übereinstimmen
end #
return false # wenn nichts gefunden wurde gebe <false> zurück
end sieht vielversprechend aus. Also müsste ich nun im Spiel den Call-Skript-Befehl:
event_on_position( 1, 2)
aufrufen. Doch wie lasse ich einen Switch einschalten, wenn auf ( 1, 2) ein Event befindet?

-KD- Was meinst du genau? Du sprichst viel zu hoch für mich ^,^ Bin halt noch ein riesiger Anfänger xD Und ich lese mir auch schon dein Tutorial durch ^,^

ETeCe
06.09.2010, 14:51
Soo... erstmal meinen Code leicht verbessern:


def event_on_position( x, y) #neue Funktion
$game_map.events.each_value do |event| # wiederhole für jedes Event:
return true if event.x == x and event.y == y # gebe <true> zurück wenn Koord. übereinstimmen
end #
return false # wenn nichts gefunden wurde gebe <false> zurück
end(kleine Änderung in Zeile 2, ich hatte $game_map.event irrtümlich für ein Array gehalten...)

Am besten wäre wohl diese Funktion in die Klasse Game_Interpreter einzubauen, um diese Funktion im Call-Script zu nutzen...
(wenn du dir nicht sicher sein solltest wo du das einfügen kannst erstell am besten ein neues Script, schreibe in die erste Zeile
class Game_Interpreter
füge ab der zweiten Zeile den Code ein und schließe mit einer weiteren Zeile
end
ab)

Um einen Switch zu aktivieren wenn sich an der Position ein event befindet müsstest du entweder

event_on_position( x, y)in einem Conditional Branch verwenden und bei Zutreffen einen Switch aktivieren oder als
Callscript:

$game_switches[ z ] =
event_on_position( x, y)(x, y, z entsprechend ersetzen)
Bei dieser Call-Scriptvariante würde der Switch ausgeschaltet wenn an der Stelle kein Event ist...


Zum Terrain-Tag:
Joa, genau so... funktioniert bei mir auch super...
evtl. liegt der "Fehler" darin dass die Tiles von links nach rechts bzw. oben nach unten von 0 beginnend durchnummeriert werden...
(das Feld oben-links entspricht also (0,0) , das rechts daneben (1,0) etc.)

-KD-
06.09.2010, 16:29
-KD- Was meinst du genau? Du sprichst viel zu hoch für mich ^,^ Bin halt noch ein riesiger Anfänger xD Und ich lese mir auch schon dein Tutorial durch ^,^ Mir gings einfach nur darum das man sowas:

def gefunden?
collection.each do |element|
if element.irgendwas == irgendwas then
return true
end
end
return false
end
auch kürzer schreiben kann:

def gefunden?
collection.any? {|element| element.irgendwas == irgendwas }
end

Muss man nicht machen. Ist wie gesagt nur ein Vorschlag. Mein Code macht genau dasselbe wie ETeCe seiner. Ist also egal welchen du nimmst.


Doch das löst nicht so richtig mein Problem: Gebe ich dem Wasser den Terrain-Tag 1, so gibt es 2 aus. Doch gebe ich den Wasser den Terrain-Tag 2, so bekommen ich 1. Und bei 7 für das Wasser bekomme ich auch den Wert 1 zurück.
Neben dem was ETeCe gesagt hat wäre noch möglich, dass du über dem Wasser ein anderes Tile mit einem Terrain-Tag hast. Die Funktion terrain_tag gibt dir nur den Terrain-Tag des obersten Tiles (also im obersten Layer) zurück. Nur wenn dieser keinen Terrain-Tag hat wird der Terrain-Tag eines tieferen Layers zurückgegeben.

SMWma
01.10.2010, 14:38
okej dokej ^,^
Und auch heute habe ich ein neues Problemchen ^,^

Ich habe da nichts an den Standartskripten verändert. Veränderungen tue ich immer über Main rein. Und zwar bloß das nötigste.

SMWma
29.11.2010, 20:39
Neues Problemchen ^,^ Das alte ist aber immernoch ungelöst und ich wäre bei beiden sehr dankbar.

-KD-
30.11.2010, 00:42
1.) Bissel dürftig, das Codebeispiel, aber falls du Windows verwendest, so gibt das Attribut Window#active an, ob der Cursor blinkt oder nicht, und das Attribut Window#cursor_rect gibt an wo sich der Cursor befindet und wie groß er ist. Bsp:

window = Window.new
window.width = 100
window.height = 100
window.cursor_rect = Rect.new(25, 25, 25, 25)
window.active = true

Siehe auch: Rubykurs: Windows (http://www.rpg-studio.de/scientia/Ruby/RGSS/Tutorials/Rubykurs/3_-_RGSS/3)

2.) Eigentlich hat das nichts in der Game_Player Klasse zu tun. Ich würde den Code in die Scene_Map Klasse packen. Wenn der Spieler sich nicht mehr bewegen soll, lässt du einfach die $game_player.update Methode raus, oder (wenn du wirklich NUR die Bewegung unterbinden willst) du fügst eine neue Bedingung in die unless moving? or $game_system.map_interpreter.running? or ... Bedingung in Game_player#update Methode ein.

Ah, und dein Code scheint generell etwas eigenartig auszusehen. Globale Variablen (beginnend mit einem $-Zeichen) solltest du möglichst vermeiden. Und zum umsetzen von Variablenwerten musst du schon einen Zuweisungsoperator verwenden.

# das hier macht gar nichts
$smi - 1
# wenn schon dann so
$smi = $smi + 1
# oder in der Kurzform
$smi += 1

SMWma
30.11.2010, 14:30
Das mit den globale Variablen: Warum sind sie so schlecht? Das höre ich oft. Aber ich kann mit denen besser arbeiten.

window.cursor_rect = Rect.new(25, 25, 25, 25)
window.active = true

Das habe ich mir selber schon überlegt.
Ich hätte, ich hätte es dazu getippt, aber andauernd vergesse ich etwas wichtiges zu erwähnen ^,^
Der Cursor soll außerhalb eines Fenster angezeigt werden. Und auch über andere Fenster.
Und je nach dem Wert von $smi soll er an einen komplett anderen Platz auf dem Bildschirm, also X und Y werden sich immer unterscheiden.

Und aus irgendeinen Grund will der Code:

case Input.dir4
when 4
$smi = $smi - 1
if $smi = -1
$smi = 2
end
print("Links")
when 6
$smi = $smi + 1
if $smi = 3
$smi = 0
end
print($smi)
end nicht funktzionieren. Die globalen Variablen ändern sich nicht. Der Wert bleibt immer auf null.

Und in deinen Rubykurs finde ich nichts zum Cursor.

Zum zweiten: Das werde ich gleich mal probieren ^,^

Cepanks
30.11.2010, 16:35
Der Code tut nicht das was du willst, weil man Variablen nicht mit = sondern mit == vergleicht. Mit einem einfachen Gleichheitszeichen weist du einer Variablen nur einen neuen Wert zu.

Deine Abfragen überprüfen also letztlich ob -1 bzw. 3 true ist – was immer zutrifft. Daher wird $smi auch jedesmal auf 0 gesetzt, wenn du nach rechts drückst.

-KD-
30.11.2010, 20:00
Das mit den globale Variablen: Warum sind sie so schlecht? Das höre ich oft. Aber ich kann mit denen besser arbeiten.Weil das den Code unflexibel macht und seine Wiederverwendung erschwert. Normalerweise kann man bestimmte Scripte, wie z.B. ein Fenster-Script, an mehreren Stellen des Spiels verwenden. Das bedingt aber, dass die Scripte sich untereinander nicht dieselben Variablen teilen. Da globale Variablen aber eben global sind, würden dann alle Scripte auf dieselben Variablen zugreifen und damit untereinander in Konflikt geraten. Mal als Beispiel: Angenommen die Auswahlfenster würden ihren Index alle in der globalen Variable $i speichern, dann würdest du, während du im Skillmenü einen Skill auswählst, auch gleichzeitig im Itemmenü und im Kampfaktionsauswahlmenü den Cursor bewegen. Mag ja sein, dass globale Variablen am Anfang erstmal einfacher erscheinen (weil man ja auch im Maker globale Variablen gewohnt ist). Aber es schadet ja nicht, sich von Anfang an den richtigen Stil anzugewöhnen.


Der Cursor soll außerhalb eines Fenster angezeigt werden. Und auch über andere Fenster.
Und je nach dem Wert von $smi soll er an einen komplett anderen Platz auf dem Bildschirm, also X und Y werden sich immer unterscheiden.Dann kannst du keinen Window-Cursor verwenden. Der kann nur innerhalb eines Fensters angezeigt werden. Du müsstest eine eigene Sprite_Cursor Klasse schreiben, die überall angezeigt werden kann. Wenn du mal in den früheren Kapiteln meines Kurses blätterst: Dort wird auch erwähnt wie man Menüs aus Sprites erzeugt und eigene Cursor zeichnet.

SMWma
30.11.2010, 21:07
Achso. Aber nur mal so nebenbei: Bei was wäen globale Variable sinnvoll?

Und zur Sprite_Cursor: Yay, eine Herausforderung für mich ^.^ Das war dann alles, was ich wissen wollte. Ich probiere das jetzt in den nächsten Tagen, lese mal deinen RGSS-Kurs durch(was ich schon immer mal machen wollte, aber wegen Schule noch keine Zeit hatte).

Also danke ^,^
Und zu Cepanks: Jep, du hattest recht xD Danke

€dit: Ein Problem habe ich noch:

$smi = $smi - 1

Da erscheint eine Fehlermeldung:

Script 'Menu' line 184: NoMethodError occured.

undefined method `-' for nil:NilClass

-KD-
30.11.2010, 21:25
Dann hat deine Variable $smi noch keinen Wert. Du musst ihr ja irgendeinen Anfangswert zuweisen, bevor du sie erhöhen bzw. verringern kannst.

Eigene globale Variablen machen im Maker eigentlich gar keinen Sinn. Man sollte generell auf Instanzvariablen und lokalen Variablen setzen.

SMWma
30.11.2010, 22:01
okaj. Allerdings habe ich die Variable schon mehrmals benützt. Und das jetzt alles zu verändern... boah ^,^
Aber ich werde es mal beim nächsten Skript machen.

SMWma
01.12.2010, 17:54
case Input.dir4
when 4
$smi = $smi - 1
when 6
$smi = $smi + 1
end
überprüft ja, ob eine Pfeiltaste bzw. Number-Key gedrückt ist. Aber wie bewerkstellige ich es, dass die Befehle nur dann ausgeführt werden, wenn die entsprechende Pfeiltaste gedrückt wurde?

Btw: Google → RGSS Pfeiltasten abfragen → 3. Ergebnis → Hier landen ^,^

-KD-
01.12.2010, 19:05
Input.trigger?(Input::DOWN)
fragt ab ob die UNTEN-Taste gedrückt WURDE.

SMWma
01.12.2010, 23:00
So ^,^ Damit ist mein Skript offiziel fertig. Das erste Adventstürchen ist sozusagen offen xD

SMWma
11.12.2010, 14:14
ähhhmmm ja...


# Get actor
actor = $game_actors[@parameters[0]]
# Change graphic
if actor != nil
actor.set_graphic(@parameters[1], @parameters[2],
@parameters[3], @parameters[4])
end
# Refresh player
$game_player.refresh
# Continue
return true

Das ist der Code, mit den die Character Graphic ausgewechselt wird... Mit parameter xD
Für mehr Infos erster Beitrag... wieder mal...

Shisu
11.12.2010, 15:11
Die Methode dazu sieht so aus =>

#--------------------------------------------------------------------------
# * Change Graphics
# character_name : new character file name
# character_hue : new character hue
# battler_name : new battler file name
# battler_hue : new battler hue
#--------------------------------------------------------------------------
def set_graphic(character_name, character_hue, battler_name, battler_hue)
@character_name = character_name
@character_hue = character_hue
@battler_name = battler_name
@battler_hue = battler_hue
endDer erste Parameter ist der neue Name des Charsets, der zweite vom Farbton, der dritte ist wieder der Name der Battlergrafik und der 4. wieder der dazugehörige Farbton.

SMWma
11.12.2010, 15:25
und das hatte geklappt ^.^

(btw. warum bekomme ich immer so schnelle Antworten? Das ist fast schon mysteriös... Ein neuer Fall für Galileo Mystery xD)

LordBavaira13
13.01.2011, 19:39
Hallo
Ich habe mir ein Palast erstellt bei dem ich König bin. Und eine Stadt hab ich mir erstellt mit Einkaufsläden.
Dann habe ich mir einen Butler erstellt bei dem man auf die Antwort "Steuern einnehmen" klicken kann. Dann habe ich verschiedene Läden(Waffenladen, Itemshop, Pension, Wirtshaus) auf die man danach klicken kann. Ich möchte es so machen, dass wenn man dan z.b. auf Waffenladen klickt man 1000 Gold erhält. Will aber nicht, dass man das die ganze Zeit machen kann sondern nur so jede Stunde. Und jetzt kommt endlich die Frage^^: wie kann ich das einstellen, das ich einstellen kann das man nur jede Stunde 1000 Gold bekommt nur man hinklickt, nicht einfach so. Und wenn wenn noch keine Stunde vergangen ist und man auf Steuern einnehmen und z.b. auf Waffenladen klick soll so was kommen wie "du kannst nur jede Stunde Steuern einnehmen". Ich hoffe ihr könnt mir beschreiben wie ich das machen kann. Ich habe auch schon ein bisschen Erfahrung mit RPG Maker XP.

------------------------------------------------------------------------------
Programmiere mit RPG Maker XP

SMWma
14.01.2011, 20:44
mach einen eigenen Thread auf, bittä ^,^

SMWma
26.03.2011, 15:00
So, erneut habe ich eine Frage ^,^
Und zwar möchte ich, dass im laufendem Spiel eine Datei auf dem Desktop erstellt wird. Dabei ist es aber wichtig, dass die enstprechende .txt-Datei niergendswo im Game Ordner liegt. Dabei möchte ich den Text innerhalb Ruby selber bestimmen. Allerdings ist der Text bloß einzeilig.

Wichtig ist auch, dass der Name der .txt Datei bestimmbar ist.
Zum Beispiel wäre es sehr sinnvoll, dass die Datei den Namen »Blatt Papier.txt« heißt und den Inhalt: ,,Dies ist ein Blatt Papier"
bekommt.

Wie bereits gesagt ist es sehr wichtig, dass die Datei am Ende im Spieleordner nicht ist.
Dabei ist es mir eigentlich egal, ob die Datei im ~/MeinProjekt/Graphics/texte/Blatt Papier.txt/ ist und am Ende, wenn das Spiel verschlüsselt wird, nicht mehr einsehbar ist, aber vom Maker aus auf dem Desktop kopierbar ist oder ob sie sogar ganz mit Ruby erstellt wird, was ja bei einem einfachen Text Dokument nicht schwer sein sollte.

Cornix
26.03.2011, 15:37
Wenn du eine .txt-Datei erstellen willst tust du folgendes:


PATHNAME = "E:/IrgendEineDatei.txt"
MODE = "wb"
TEXT= "Dies ist ein Test"

f = File.open(PATHNAME, MODE)
f.write(TEXT)
f.close

PATHNAME gibt den Pfad der Datei an. Du kannst die Datei an jede beliebige Stelle auf dem Computer speichern.
Der MODE ist im Moment auf "wb" == write-binary gestellt. Damit kannst du einen Text in die Datei schreiben, jedoch nicht lesen. Außerdem wird der Inhalt der Datei bei jedem öffnen dadurch gelöscht.

Das sollte bereits alles sein was du brauchst, nun musst du nur den Pfad finden auf welchen du die Datei kopieren möchtest.
Willst du übrigens herausfinden auf welchem Pfad der RPG-Maker XP installiert ist machst du: File.expand_path(""), dadurch bekommst du den Pfad des RPG-Makers als String zurückgegeben. Zum Beispiel: "E:/Spiele/Maker/RPG-Maker XP/".

SMWma
26.03.2011, 18:28
PATHNAME =
"C:/users/ich/Desktop/Nachricht.txt"
MODE = "wb"
TEXT= "Dies ist ein Test"

f = File.open(PATHNAME, MODE)
f.write(TEXT)
f.close
Das klappt ja zum Teil.
Aber die Sache ist die, sobald ich ja das an einen anderem PC mache, wo der Nutzername nicht ich ist, würde das ja nicht mehr gehen.
Und für
PATHNAME = "C:/users/Public/Desktop/Nachricht.txt"
ist die Zeile zu kurz... Also geht das auch nicht.
Wie stelle ich das am besten an?

Cornix
26.03.2011, 18:38
Zeile zu kurz?
Du machst das per Eventcommand?
Du kannst das ganze auch aus Teilstrings zusammen setzen:
a = "C:/users/"
b = "Public/Desktop"
c = "/Nachricht.txt"
d = a+b+c
Und schon kann man der kurzen Zeile entgegen kommen.

Es sollte aber wahrscheinlich auch einen Weg geben den Benutzernamen zu erfassen, im schlimmsten Fall über WinApi. Damit kenne ich mich allerdings nicht aus.

Cepanks
26.03.2011, 18:53
In Ruby gibt es dafür das Objekt ENV, das Zugriff auf die Umgebungsvariablen des OS bietet.
Für den Desktop kann man schreiben:

path = ENV['USERPROFILE']+'/Desktop/Nachricht.txt'

SMWma
26.03.2011, 19:46
bei mir klappt aber:

a = "ENV['USERPROFILE']"
b = "+'/Desktop/Nachricht.txt'"
c = a+b
PATHNAME = c
MODE = "wb"
TEXT= "Dies ist ein Test"

f = File.open(PATHNAME, MODE)
f.write(TEXT)
f.close nicht.

Cepanks
26.03.2011, 19:52
a = ENV['USERPROFILE']
b = "/Desktop/Nachricht.txt"
PATHNAME = a+b
MODE = "wb"
TEXT= "Dies ist ein Test"

f = File.open(PATHNAME, MODE)
f.write(TEXT)
f.close

SMWma
26.03.2011, 19:56
klappt perfekt. Danke ^,^

-KD-
26.03.2011, 22:26
Wenn du Text reinschreiben willst, solltest du nicht "wb" sondern "w" verwenden, sonst stellt Ruby die Zeilenumbrüche nicht richtig dar. Weiterhin solltest du die Variablennamen (außer ENV natürlich) alle klein schreiben, sonst werden Konstanten draus.