Lieber Besucher, herzlich willkommen bei: RPG Studio - Make your World real. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Sonntag, 23. April 2017, 23:12

Eigenes Fenster auf der Map anzeigen im MV

Hallo Leute,
so ein eigenes kleines Fenster mit Informationen auf der Map anzeigen - sowas will irgendwann jeder mal. Und heute lernen wir wie es geht. :dance:
Unser Ziel ist es, dass wir auf der Map ein kleines Fenster haben, das oben links sitzt und uns einen Icon und den Wert einer Variable anzeigt. Wir werden ein Plugin schreiben, auf die Details der Pluginerstellung selber aber nicht eingehen. Dafür empfehle ich euch dieses wunderbare Tutorial: Eigene Plugins erstellen, was alle Details beleuchtet. Wir kümmern uns hier wirklich nur um das Fenster. Die einzelnen Schritte werden möglichst genau erklärt, damit ihr auch leicht das entstandene Fenster an eure Bedürfnisse anpassen könnt.
  • Ich bin etwas Betriebsblind aktuell, also schreibt mir sehr gerne Anmerkungen, wie ich das Tutorial verständlicher machen kann, wo kann ich noch etwas mehr erklären. Sollange ihr JavaScript-Basics drauf habt, und wisst wie ihr so ganz allgemein Plugins erstellt *sollte* dieses Tutorial verständlich sein. Wenn es das nicht ist, schreibt mir wo ich was ausarbeiten soll.

(1) Das Grundgerüst


Unser Fenster definieren wir in einer neuen Klasse, die wir Window_HUD nennen. "HUD", so wie Head-up-Display. Um es mal gesagt zu haben: Der Name ist vollkommen frei wählbar, wir könnten die Klasse auch Mein_eigenes_Fenster nennen, aber es ist Konvention die Fensterklassen mit "Window_" zu prefixen.

Die Blaupause eines jeden frischen Fensters (was keine Usereingabe erwartet) sieht wie folgt aus:

JavaScript Quellcode

1
2
3
4
5
6
7
8
9
function Window_HUD() {
    this.initialize.apply(this, arguments);
}
 
Window_HUD.prototype = Object.create(Window_Base.prototype);
Window_HUD.prototype.constructor = Window_HUD;
 
Window_HUD.prototype.initialize = function() {
};


Das ist auch schon ein fertiges Fenster. Etwas langweilig, weil es absolut nichts tut und auch nicht auf dem Bildschirm erscheint, aber das Grundgerüst. Wir definieren uns eine Klasse mit dem Namen Window_HUD (Zeile 1) als Unterklasse von Window_Base (Zeile 5). Window_Base liefert uns alle Basiseigenschaften und Methoden die ein Fenster ausmachen. Wir kümmern uns dann darum, diesem Fenster unsere eigene Note zu geben - halt der Gast-Weg. Cool muss es sein. Nicht leer, sondern es soll einen Icon anzeigen und eine Variable. Und dafür sorgen wir jetzt.

Kümmern wir uns erstmal darum, dass das Fenster wenn es später erzeugt wird auch wirklich sichtbar ist. Dafür füllen wir die Initialisierungsfunktion (Zeile 8) mit Leben.

JavaScript Quellcode

8
9
10
Window_HUD.prototype.initialize = function() {
    Window_Base.prototype.initialize.call(this, x, y, breite, höhe);
};

Das wichtigste ist, dass wir die Initialisierung wie in der Superklasse Window_Base definiert durchführen. Dafür können wir einfach deren Funktion callen (aufrufen). Hier geben wir dann die Position und Abmessung des Fensters an. Wir könnten hier direkt fixe Werte reinschreiben:

JavaScript Quellcode

8
9
10
Window_HUD.prototype.initialize = function() {
    Window_Base.prototype.initialize.call(this, 0, 0, 240, 72);
};

Aber wir bauen unsere Klasse direkt so, dass sie leicht erweiterbar ist und sich auch Änderungen in anderen Klassen anpasst:

JavaScript Quellcode

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Window_HUD.prototype.initialize = function() {
    var width = this.windowWidth();
    var height = this.windowHeight();
    Window_Base.prototype.initialize.call(this, 0, 0, width, height);
 
    this.refresh();
};
 
Window_HUD.prototype.windowWidth = function() {
    return 240;
};
 
Window_HUD.prototype.windowHeight = function() {
    return this.fittingHeight(1);
};
 
Window_HUD.prototype.refresh = function() {
    this.contents.clear();
};

Wir lagern die Breite und Höhe des Fensters in eigene Funktionen aus - so könnte ein weiteres Plugin diese Werte leicht verändern. Auch das Einfügen eines Icons und das Anzeigen eines Variablenwerts lagern wir in eine eigene Funktion refresh aus. Dadurch können wir beliebig oft den Fensterinhalt aktuallisieren, indem wir immer wieder die refresh-Funktion aufrufen. Sehr praktisch, weil sich der Wert der anzuzeigenden Variable ja auch live ändern könnte.
Einen Moment möchte ich noch auf die Funktion windowHeight eingehen und was da passiert: Wir geben für die Fensterhöhe keine fixe Zahl an, sondern wir lassen die Fensterhöhe von der Funktion fittingHeight berechnen. Diese bestimmt die Höhe so, dass genau eine Zeile Text reinpasst. Dafür addiert sie einfach die Rahmenbreite auf die Zeilenhöhe - der Vorteil den wir daraus ziehen: Selbst wenn sich mal die Zeilenhöhe ändert oder die Rahmenbreite, weil der Benutzer sich dafür entscheidet einen extravaganten Windowskin zu verwenden: Unser Fenster wird immernoch funktionieren und perfekt aussehen.

(2) Das Fenster mit Inhalt befüllen: Die refresh-Funktion


Hier kommt nun unsere wirkliche Kreativität zum tragen: Was soll im Fenster zu sehen sein? Wir entscheiden uns für dieses Tutorial für einen Icon mit der ID 296 und den Wert der Variable #12. Wir sollten uns dafür zwei Funktionen ansehen, die uns zur Verfügung stehen:
  • this.drawIcon( iconId, x, y);
    Mit dieser Funktion zeichnen wir ein Icon mit gewünschter ID an die Position (x|y).
  • this.drawText( text, x, y, maximaleBreite, Ausrichtung );
    Mit dieser Funktion zeichnen wir einen Text an die Position (x|y) der wenn er zu breit ist etwas gestaucht wird. Optional können wir eine Ausrichtung (0=Linksbündig, 1=Zentriert, 2=Rechtsbündig) angeben.

Das ist auch eigentlich alles was wir brauchen. Ein eigenes Fenster ist sehr komfortabel gemacht.

Was wir jetzt noch brauchen sind die Positionen der einzelnen Infos. Wo steht der Icon, wo steht der Text? In diesem Fall möchten wir den Icon ganz links haben und daneben soll der Text anfangen. Also berechnen wir mal fix die Positionen. Auch hier gibt es wieder viele vorgefertige Funktionen, die wir verwenden können, damit unser Fenster sich perfekt in jedes Spiel einbettet. Ich zeig mal den Code und erklär dann, was wir benutzen:

JavaScript Quellcode

24
25
26
27
28
29
30
31
Window_HUD.prototype.refresh = function() {
    var textX = this.textPadding() + Window_Base._iconWidth;
    var width = this.contents.width - textX - this.textPadding();
 
    this.contents.clear();
    this.drawIcon(296, 0, 0);
    this.drawText( "Platzhalter", textX, 0, width, 0 );
};

Wir brauchen die X-Position wo der Text startet und die maximale Breite des Textes - dafür schauen wir uns mal dieses Schaubild an, was die gesammte Breite des Inhaltsbereichs in vier Abschnitte aufteilt:
Bild
Unser Text soll in den grauen Bereich gezeichnet werden. Also entspricht die X-Startposition der Breite des Icons plus einem kleinen Padding, damit Text und Icon nicht aneinander gequetscht werden. Diese Rechnung findet sich auch oben wieder. Alles benötigte, wie die Bestimmung der Iconbreite oder des Paddings werden uns frei Haus bereitgestellt. Und für die Zeilenbreite nehmen wir einfach die gesammte Breite des Contentbereichs und ziehen dann den linken Rand (blau+rot) und den rechten Rand (rot) ab. Schon haben wir die Zeilenbreite.
Anschließend ab Zeile 29 im Codeausschnitt oben können wir den Icon ganz nach links (x=0) und daneben unseren Text (x=textX) zeichnen. Nagut aktuell zeichnen wir noch nicht den Variablenwert, sondern nur einen Platzhaltertext, aber dazu kommen wir jetzt, dass da ein vernünftiger Text steht.

(2.1) Den Wert einer Variable anzeigen


Schreiben wir uns erstmal eine Funktion, die den aktuellen Wert für unser Fenster zurückliefert:

JavaScript Quellcode

33
34
35
Window_HUD.prototype.value = function() {
    return $gameVariables.value( 12 );
};

Prima. Jetzt kann unser Fenster immer abfragen, was der aktuelle Wert der Variable #12 ist. Mehr macht die Funktion nämlich nicht - sie liefert eben diesen aktuellen Wert zurück. Nachdem ich jetzt oft genug "aktuell" gesagt habe, kann ich ja zeigen warum diese Unterscheidung wichtig ist: Es gibt neben dem aktuellen Wert der Variable noch den, den das Fenster gerade anzeigt. Später im Abschnitt update werden wir uns darum kümmern, was wir tun, wenn sich diese beiden Werte unterscheiden.
Erstmal bekommt unsere Klasse aber ein Attribut _displayedValue, indem sich der im Fenster angezeigte Wert gemerkt wird. Bei jedem refresh aktuallisieren wir den Wert in diesem Attribut mit dem aktuellen Wert der Variable (siehe Zeile 27 im folgenden Code) und zeichnen diesen dann (siehe Zeile 30 im folgenden Code).

JavaScript Quellcode

24
25
26
27
28
29
30
31
Window_HUD.prototype.refresh = function() {
    var textX = this.textPadding() + Window_Base._iconWidth;
    var width = this.contents.width - textX - this.textPadding();
    this._displayedValue = this.value();
    this.contents.clear();
    this.drawIcon(296, 0, 0);
    this.drawText(this._displayedValue, textX, 0, width, 0 );
};

Und damit wird der Variablenwert jetzt korrekt angezeigt. Jetzt müssen wir nurnoch dafür sorgen, dass refresh aufgerufen wird, wann immer sich _displayedValue vom aktuellen Wert der Variable unterscheidet. Das tun wir im nächsten Abschnitt.

(3) Update


Die update-Funktion unseres Fensters wird jedes Frame einmal aufgerufen und dient der Aktuallisierung der Anzeige. Theoretisch könnten wir jedes Frame unser Fenster refreshen, aber das verbraucht unnötig Rechenkraft. Stellt euch vor das Spiel wir auf einem Smartphone gespielt - da will man nicht unnötig Akku verbrauchen, weil wir unser Fenster jedes Frame komplett neuzeichnen. Wir wollen also nur refreshen, wenn das auch nötig ist. Unsere update-Funktion sieht also so aus:

JavaScript Quellcode

37
38
39
40
41
42
43
44
45
Window_HUD.prototype.update = function() {
    Window_Base.prototype.update.call(this);
    if( this.needsRefresh() ){
        this.refresh();
    }
};
 
Window_HUD.prototype.needsRefresh = function() {
};

Wir machen die standard Updatesachen (Zeile 38) und wenn ein refresh gebraucht wird, refreshen wir. Fehlt nurnoch eine Definition, wann ein Refresh gebraucht wird (ab Zeile 44). Das ist aber garnicht so schwer zu verstehen: Wir brauchen ein Refresh, wenn sich der _displayedValue vom aktuellen Wert unterscheidet:

JavaScript Quellcode

44
45
46
Window_HUD.prototype.needsRefresh = function() {
    return this._displayedValue != this.value();
};

Und das war der letzte Handgriff an unserem Fenster. Das Fenster selber ist damit fertig. Jetzt müssen wir nurnoch das Fenster in die Map einbauen. Das tun wir im vierten Abschnitt, also schnell weiterlesen!

(4) Einbau in die Map


Wollen wir, dass unser Fenster auf der Map angezeigt wird, müssen wir es in die Scene_Map einbauen. Dafür geben wir ihr erstmal eine neue Methode, die unser Fenster erzeugt. Dazu braucht es nur zwei Zeilen. Wir erzeugen ein neues Window_HUD-Objekt und speichern dieses in ein Attribut der Scene_Map. Zusätzlich müssen wir es noch als Child hinzufügen, damit es auf den Bildschirm gezeichnet wird und automatisch und regelmäßig geupdatet wird. Das war es schon.

JavaScript Quellcode

1
2
3
4
Scene_Map.prototype.createHUDWindow = function() {
    this._hudWindow = new Window_HUD();
    this.addChild(this._hudWindow);
};

Jetzt müssen wir diese Methode nurnoch an geeigneter Stelle aufrufen - eine gute Stelle ist die, wo auch die anderen Fenster erzeugt werden. Das sieht dann wie folgt aus, mehr Details findet ihr im Tutorial Eigene Plugins erstellen in Kapitel 3.

JavaScript Quellcode

1
2
3
4
5
6
var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
 
Scene_Map.prototype.createAllWindows = function() {
    _Scene_Map_createAllWindows.call(this);
    this.createHUDWindow();
};

Jetzt noch ein Schönheitskniff und wir sind durch:
Im RPG Maker MV ist es so, dass wenn man das Menü aufruft ein Screenshot der Map gemacht, dieser mit einem Unschärfefilter versehen wird und dann dieser im Hintergrund des Menüs angezeigt wird. Wir möchten, dass unser Fenster auf diesem Screenshot nicht mit drauf ist - sonst sieht das komisch aus, wenn hinter den Menüfenstern noch andere Fenster zu sehen sind. Also verstecken wir unser Fenster kurz vor dem Screenshot:

JavaScript Quellcode

1
2
3
4
5
6
7
8
var _Scene_Map_terminate = Scene_Map.prototype.terminate;
 
Scene_Map.prototype.terminate = function() {
    if (!SceneManager.isNextScene(Scene_Battle)) {
        this._hudWindow.hide();
    }
    _Scene_Map_terminate.call(this);
};

Fertig. Unser Plugin ist betriebsbereit. Jetzt können wir noch eine Pluginbeschreibung ergänzen und vielleicht auch noch ein paar Dinge wie die VariablenID (hier 12) oder die IconID (hier 296) in Pluginparameter auslagern und vom Benutzer anpassen lassen. Aber das ist ganz euch überlassen. Hier nochmal der fertige Programmcode zum Vergleichen.
Spoiler: Quellcode

JavaScript 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
 /*:
 * @plugindesc Zeigt ein eigenes Fenster auf der Map an
 */
(function(){
 
//-----------------------------------------------------------------------------
// Window_HUD
//
// 
 
function Window_HUD() {
    this.initialize.apply(this, arguments);
}
 
Window_HUD.prototype = Object.create(Window_Base.prototype);
Window_HUD.prototype.constructor = Window_HUD;
 
Window_HUD.prototype.initialize = function() {
    var width = this.windowWidth();
    var height = this.windowHeight();
    Window_Base.prototype.initialize.call(this, 0, 0, width, height);
    this._displayedValue = 0;
    this.refresh();
};
 
Window_HUD.prototype.windowWidth = function() {
    return 240;
};
 
Window_HUD.prototype.windowHeight = function() {
    return this.fittingHeight(1);
};
 
Window_HUD.prototype.refresh = function() {
    var textX = this.textPadding() + Window_Base._iconWidth;
    var width = this.contents.width - textX - this.textPadding();
    this._displayedValue = this.value();
    this.contents.clear();
    this.drawIcon(296, 0, 0);
    this.drawText(this._displayedValue, textX, 0, width, 0 );
};
 
Window_HUD.prototype.update = function() {
    Window_Base.prototype.update.call(this);
    if( this.needsRefresh() ){
        this.refresh();
    }
};
 
Window_HUD.prototype.needsRefresh = function() {
    return this._displayedValue != this.value();
};
 
Window_HUD.prototype.value = function() {
    return $gameVariables.value( 12 );
};
 
//-----------------------------------------------------------------------------
// Show Window_HUD on Map
// 
 
var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
 
Scene_Map.prototype.createAllWindows = function() {
    _Scene_Map_createAllWindows.call(this);
    this.createHUDWindow();
};
 
var _Scene_Map_terminate = Scene_Map.prototype.terminate;
 
Scene_Map.prototype.terminate = function() {
    if (!SceneManager.isNextScene(Scene_Battle)) {
        this._hudWindow.hide();
    }
    _Scene_Map_terminate.call(this);
};
 
Scene_Map.prototype.createHUDWindow = function() {
    this._hudWindow = new Window_HUD();
    this.addChild(this._hudWindow);
};
 
})();
zum Lesen den Text mit der Maus markieren

2

Freitag, 28. April 2017, 17:54

sry war bis gestern nicht in der Lage das bett zu verlassen dadurch hab ich das nicht wirklich mitbekommen

ich danke dir von herzen für dieses script/plugin

leider muss ich zugeben das ich von scripten keine Ahnung habe
und dadurch keinen schimmer wie ich noch ne 2. variable dazu bringe auch noch angezeigt zu bekomme
Wär Rechscheirbfehler findet,
der tarf sie behahlten!

3

Freitag, 28. April 2017, 23:59

Im Zweifelsfall, kann man einfach die bestehenden Techniken dublizieren. (Josey-Style) Wir hatten eine Funktion value? Dann kommt jetzt noch eine Funktion value2 dazu. Entsprechend prüfen wir dann in needsRefresh nicht nur, ob der eine Wert aktuell ist, sondern beide aktuell sind, bzw. ob sich einer von ihnen geändert hat.
Außerdem wird unser Fenster jetzt zwei Zeilen hoch.

JavaScript Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Window_HUD.prototype.windowHeight = function() {
    return this.fittingHeight(2);
};
 
Window_HUD.prototype.refresh = function() {
    var textX = this.textPadding() + Window_Base._iconWidth;
    var width = this.contents.width - textX - this.textPadding();
    this._displayedValue = this.value();
    this._displayedValue2 = this.value2();
    this.contents.clear();
    this.drawIcon(296, 0, 0);
    this.drawText(this._displayedValue, textX, 0, width, 0 );
    this.drawText(this._displayedValue2, textX, this.lineHeight(), width, 0 );
};
 
 
Window_HUD.prototype.needsRefresh = function() {
    return (this._displayedValue != this.value()) || (this._displayedValue2 != this.value2());
};
 
Window_HUD.prototype.value2 = function() {
    return $gameVariables.value( 13 );
};


Wenn Du das noch weiter treiben willst, würde ich aber spätestens bei 4 Variablen einen anderen Weg vorschlagen. ;)

Josey

Storyteller

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Nachricht senden

4

Samstag, 29. April 2017, 09:08

*lach* XD
Ja, das ist der Josey-Style. Einfach alles doppelt nehmen, im Notfall ganz unsauber das ganze Script >XD
(BLOß NICHT NACHMACHEN! XD Lieber so, wie Playm es hier vorgibt ;D)
  • Joseys Wuselei

    • Meine Story - Pausiert
      Lust auf Abenteuer?
      So richtig mit Selbstbestimmung?
      Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
      "Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
      Hier die Antwort:
      Bild
      Bild
      Hier könnt ihr euren Lieblingschar wählen ;D
      Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt.
    • Meine Arbeiten
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star-half: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty: (Ein Stern- offiziell verliehen von Playm! XD)
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (Mein) Autismus
      Ich bin im autistischen Sprektrum-
      sollte ich mich komisch verhalten, oder unhöflich wirken
      (oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
      ist das nicht beabsichtigt.


      Josey. Epicgarantie.
      Nehmt das bloß nicht ernst! D:
    • Meine Welt
      Mein Ehemann Kain! :heart_full: :*
      Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
      Er verdient einfach einen Platz ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • Mein Support
      Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
      Bastelt mal Banner! : D

    • Meine beendeten Contests
      [Pixelcontest] Rund um den Kürbis
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: Scripted Desaster
      ("nicht ganz so ernstes Projekt")

      Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
      Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
      Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.

      Das bedeutet doch Spaß...
    • Pokémon EV
      :rmxp: Pokemon EV
      ("Zeitvertreib nebenbei - Kreatief-Helfer")

      Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
      Ist inzwischen alles schonmal dagewesen. XD
    • Lost Island
      :rmxp: Harvest Moon - Lost Island
      (Arbeitstitel, "Eventtechnik-Projekt")

      Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
      Das Spiel ist ein Harvest Moon Abklatsch. XD
      Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
  • Joseys Fortschritt

    • Endless Ending
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

5

Samstag, 29. April 2017, 14:51

Ich danke dir
Wär Rechscheirbfehler findet,
der tarf sie behahlten!

Social Bookmarks