Seite 3 von 7 ErsteErste 1234567 LetzteLetzte
Ergebnis 41 bis 60 von 130

Thema: [Vorstellung + Entwicklertagebuch] SANTRIA!

  1. #41
    UPDATE: EINE STADT WÄCHST

    Seit dem letzten Entwicklereintrag ist Pine Falls ein gutes Stück gewachsen. Ich bin zwar nicht so weit, wie ich es gerne wäre, dennoch erkennt man schon grobe Stadtstrukturen. Langsam und mühsam ernährt sich das Eichhörnchen. Ich habe ein Übersichtsbild der Aseprite-File mitgebracht, damit ihr euch ein eigenes Bild machen könnt. Ich merke schon jetzt, dass ich nen größeren Fokus auf abwechslungsreiche Vegetation setzen muss, da ich mit einer Tannensorte nicht das gewünschte Waldfeeling erzeugen werde.



    Zwei ausgewählte WIP-Gebiete der Stadt möchte ich ich euch trotzdem noch zeigen und ein wenig erzählen:



    Das erste Bild ist das Forschungszentrum der SANTRIA Company, der erste Dungeon im Spiel und Ursprungsort des Pine Tonics, einem sehr bekömmlichen Energy-Drink mit leicht radioaktivem Nachgeschmack. Die alte Version mit ein bisschen Dungeontalk könnt ihr auf der ersten Thread-Seite anschauen. Wahrscheinlich werde ich noch ein Transportfahrzeug in die freie Fläche parken, aber das kann ich erst abschätzen, wenn ich den Platzbedarf der Cutszene wissen werde. Freue mich schon sehr, wenn ich endlich am Dungeon basteln kann!




    Das zweite Bild zeigt den besten (und einzigen) Supermarkt in ganz Pine Falls! Der ULTRA-Markt! Der Parkplatz wirkt noch ein wenig leer, da noch eine Motorrad-Gang Platz finden wird. Ich bin mit der Farbgebung zufrieden und mag besonders den orangenen Streifen an der Wand.

    Soviel erstmal zu den Fortschritten.

    Ich überlege, zusätzlich einen englischsprachigen Devlog laufen zu lassen, um das Spiel außerhalb des Ateliers bekannt zu machen/devlog-vernarrte Leser zu erreichen. Habt ihr damit Erfahrungen gemacht? Wordpress, tumblr, reddit, tigsource? Berichte und Meinungen?

    Bis zum nächsten Mal und stay tuned!

  2. #42
    UPDATE: EMOTIONS AND INTERACTIONS

    Ich animiere gerade ein paar Emotion-Bubbles, um die Gefühle der Charaktere besser auszudrücken. Bin momentan bei rund 9 verschiedenen Varianten und habe euch heute mal die Glühbirnen-Bubble mitgebracht. Es ist eine gute Idee, ins Kino zu gehen, nicht war Tarquin (geht Zoomania schauen, starke Empfehlung)? Die Bubble an sich gefällt mir schon gut, die Charaktere dagegen sind mir noch zu statisch. Ich werde mir noch paar Charakter-Animationen überlegen, um die Bubbles besser rüberzubringen.




    Ein weiteres Element, das ich heute testweise implementiert habe: wenn Tarquin sich einem interessanten Objekt nähert, erscheint eine Lupe als Hinweis darüber. Meine Gedanke war, dass es dem Spieler leichter fällt alle Spots zu finden, die man untersuchen kann ohne sich enter-hämmernd durch die Map zu bewegen. Was haltet ihr davon? Sinnvoll oder würdet ihr den Hinweis auf Dauer nervend finden? Bin auf eure Meinung gespannt!



    Bis zum nächsten Mal und stay tuned!

  3. #43

    Hier wird nicht geterrort
    stars_gf
    Ich find den Effekt mit der Lupe ganz niedlich! Würde mich glaube auch auf Dauer nicht wirklich stören

  4. #44
    Kann man die Einstellung mit der Lupe auch ausschalten?
    Ich meine jetzt für die Leute, die lieber ohne Hilfe alles untersuchen möchten. :3

  5. #45
    Zitat Zitat von Sabaku Beitrag anzeigen
    Ich find den Effekt mit der Lupe ganz niedlich! Würde mich glaube auch auf Dauer nicht wirklich stören
    Danke für dein Feedback! Der schwebenden Diskette über dem Speicherpunkt steht nichts im Weg!
    Zitat Zitat von Avoki Beitrag anzeigen
    Kann man die Einstellung mit der Lupe auch ausschalten?
    Ich meine jetzt für die Leute, die lieber ohne Hilfe alles untersuchen möchten. :3
    Gute Idee, der Spieler soll bei Spielbeginn selber entscheiden, ob er die Hinweise sehen möchte oder nicht! Das Feature zu implementieren ist kein Problem. Was mich interessieren würde: denkst du, die Lupe würde die Freude am Entdecken schwächen? Sie erscheint ja erst, wenn man mehr oder minder vor dem Gegenstand steht.

    (Habe letztens dein Let's Play zu Agoraphobia beim Pixeln gehört. Gute Arbeit und mal eine angenehme Abwechslung zu den gewöhnlichen RPG-Maker-Rant-LPs! )

  6. #46
    Aus persönlicher Erfahrung kann ich behaupten, dass ich viele Dinge zum Entdecken als unscheinbar betrachte und dadurch einiges übersehe. Um so mehr freut es mich, wenn ich diese Dinge dann doch anklicken kann. (und ich klicke alles gerne an.) xD
    Die Lupe würde aber niemanden die Freude am Entdecken nehmen - es wär einfach nur etwas schwieriger ohne die Lupe. Ich mag das. Vielleicht ist dies aber auch nur mein Empfinden.

    Woah ~ Danke schön, freut mich, dass dir "das hör - Let's Play" so gut gefallen hat. Hahahaha~

  7. #47
    Zitat Zitat von Avoki Beitrag anzeigen
    Aus persönlicher Erfahrung kann ich behaupten, dass ich viele Dinge zum Entdecken als unscheinbar betrachte und dadurch einiges übersehe. Um so mehr freut es mich, wenn ich diese Dinge dann doch anklicken kann. (und ich klicke alles gerne an.) xD
    Die Lupe würde aber niemanden die Freude am Entdecken nehmen - es wär einfach nur etwas schwieriger ohne die Lupe. Ich mag das. Vielleicht ist dies aber auch nur mein Empfinden.

    Woah ~ Danke schön, freut mich, dass dir "das hör - Let's Play" so gut gefallen hat. Hahahaha~
    Vielen Dank für deine ausführliche Meinung, das hilft mir sehr bei der Entwicklung

    UPDATE: TITLE SCREEN AND SOCIAL MEDIA

    Hallo Atelier! Das Wetter ist schön und die Vögeln zwitschern. Ein perfekter Zeitpunkt für einen weiteren Entwicklereintrag! Ich habe mich die Tage mit dem Titelbildschirm beschäftigt und versucht, den Pine Falls-Charme und die Atmosphäre möglichst konzentriert rüberzubringen. Der Titelbildschirm ist meiner Meinung nach sehr wichtig, da es das Erste ist was der Spieler sieht und damit schon ein erstes Urteil über das restliche Spiel gefällt wird. Das Startmenü ist nach dem Stil des Spielmenü-GUIs aufgebaut um alles wie aus einem Guss wirken zu lassen. Ein finaleres () Spiellogo wurde entworfen und bringt hoffentlich den rustikalen Charakter einer Kleinstadt in der amerikanischen Wildnis rüber. Ich habe mit Parallax rumgespielt (es kann nicht genug Parallax in einem Spiel geben, oder Lachsen? Herrlicher Gamedev-Stream am Montag! ). Das Gebirge besteht aus zwei Schichten und in einer früheren Version hatte sich eine Schicht in geringer Geschwindigkeit zusammen mit den Bäumen bewegt... nun, sagen wir ich bin von den bewegenden Bergen sehr schnell abgekommen!



    Das Menü ist schon stellenweise funktionell, New game und Load game funktionieren grob. Ich habe ein Bild des Ladebildschirms mal mitgebracht. Santria unterstützt zwei Files, zu denen Informationen über Standort, Spielzeit (noch nicht implementiert), Anzahl der freigeschalteten Partymember und Lvl angezeigt werden. Wahrscheinlich baue ich noch ein Feld für einen 100%-Spielstand ein, der dann eine Trophy anzeigt. Die Settings werden als nächstes angepackt.



    Soviel erstmal zu diesem Update, ich bin auf eure Meinungen gespannt! Eine kleine Ankündung habe ich aber noch:

    Wer Lust hat, mehr über SANTRIA zu erfahren und kleinere Updates mitzubekommen, die keinen Post im Devlog rechtfertigen, ist herzlichst eingeladen, meinen Twitter-Account zu folgen!

    https://twitter.com/schottidev

    Ich freue mich über jede Unterstützung und bin gespannt, wie sich dieses Social Media-Experiment entwickelt!

    Stay tuned!

  8. #48

    Hier wird nicht geterrort
    stars_gf
    Wenn du noch eine bewegliche Schicht in deinem Panorama haben möchtest, kannst du ja noch Wolken einbauen...
    Aber wirklich ein sehr hübscher Titlescreen! Ich frage mich aber, ob das Logo noch mehr poppen würde, wenn der Schlagschatten der Schrift tiefer wäre, und die typische Schwarze Kontur noch dabei wäre

    Bei dem Speichermenü bin ich besonders neugierig - wie viel geht denn davon schon? Du benutzt ja auch den Game Maker, und speicherfunktionen schreiben ist etwas, woran ich mich selber noch nicht getraut habe...

  9. #49
    Zitat Zitat von Sabaku Beitrag anzeigen
    Wenn du noch eine bewegliche Schicht in deinem Panorama haben möchtest, kannst du ja noch Wolken einbauen...
    Aber wirklich ein sehr hübscher Titlescreen! Ich frage mich aber, ob das Logo noch mehr poppen würde, wenn der Schlagschatten der Schrift tiefer wäre, und die typische Schwarze Kontur noch dabei wäre

    Bei dem Speichermenü bin ich besonders neugierig - wie viel geht denn davon schon? Du benutzt ja auch den Game Maker, und speicherfunktionen schreiben ist etwas, woran ich mich selber noch nicht getraut habe...
    Flauschige Wolken wären das i-Tüpfelchen für das Panorama, fühle mich aber noch zu pixel-unerfahren um mich an sowas "Organisches" in der Größe zu wagen. Die Idee mit der schwarzen Kontur finde ich super und habe sie mal ausprobiert. Den Schlagschatten habe ich nicht tiefer gemacht, da es dann entweder zu gedrungen aussah oder die Buchstaben zu sehr in die Länge gestreckt. Ich denke, die Kontur hat das Logo nochmal verbessert, oder? Ist wohl wieder so eine typische "Über-Nacht-schlafen-dann-entscheiden"-Geschichte





    Ja, das Speicher- und Ladesystem habe ich auch lange vor mich her geschoben. Langsam bewege ich mich Richtung Quests und bevor ich diese einbaue, muss erstmal ein systematisches Speichersystem vorliegen, mit dem ich den Questfortschritt hinterlegen kann. Meine Funktionen sind noch in einem rudimentären Zustand mit Spieler-Position und Lvl... vor allem um das Menü zu testen. Momentan beschäftige ich mich mit dem Lesen/Schreiben von ds_lists/ds_maps und die Verschlüsselung der ini-Datei für eine vollständige Erfassung aller Variablen. Wenn du Interesse daran hast, schreibe ich gerne ein kleines Tutorial, wenn ich mit meinem Speichersystem im reinen bin und poliert habe. Vielleicht kriegen wir nen coolen Game Maker-Talk hin!

  10. #50
    Schön zu sehen wie es hier nach und nach voran mit dem Projekt geht.
    Der Titelbildschirm und der Ladebildschirm gefallen mir auch sehr gut. Passt gut zum restlichen Grafikstil und zur Farbpalette.
    Freue mich schon auf eine Demo, bis dahin verfolge ich weiterhin den Thread

  11. #51
    Zitat Zitat von Mondlichtung Beitrag anzeigen
    Schön zu sehen wie es hier nach und nach voran mit dem Projekt geht.
    Der Titelbildschirm und der Ladebildschirm gefallen mir auch sehr gut. Passt gut zum restlichen Grafikstil und zur Farbpalette.
    Freue mich schon auf eine Demo, bis dahin verfolge ich weiterhin den Thread
    Danke dir! Solche Posts motivieren mich sehr!

    UPDATE: SAVE,LOAD, REPEAT!


    Ich habe gestern lange an meinem Speicher/Lade-System rumgespielt und bin jetzt zufrieden damit. Die Telefonhäuschen in der Spielwelt sind Speicherpunkte, die unser kleiner Held nutzen kann um sein Spiel zu sichern. Das ganze System läuft wie folgt ab:



    DIe meiste Frimmelarbeit haben tatsächlich das Menü + Interaktion und das Anzeigen der Dateien aus den Files gekostet. Die Speicher- und Ladefunktionen dagegen gingen kurz und knackig. Da Sabaku neugierig war, wie die Funktionen ablaufen, möchte ich euch ein bisschen darüber erzählen. Fragt gerne nach, wenn etwas unklar ist.

    Das grobe Prinzip des Game Makers: Spiele bestehen aus verschiedenen Räumen, die verschiedene Objekte beinhalten können. Diese Objekte werden beim Betreten des Raums geladen und können mit Code versehen werden, um bestimmte Aktionen durchzuführen. Ein Object kann verschiedene "Events" beinhalten. Die (meiner Meinung nach) wichtigsten Events:

    1. Creation: Ein Codefragment, das beim Erstellen des Objects einmal ausgeführt wird. Damit können Variablen initiiert werden.

    2. Step:
    Ein Codefragment, das jedes Frame abgespielt wird. Sehr mächtig, um das Spielsystem an sich zu steuern.

    3. Draw:
    Ein Codefragment, das jedes Frame abgespielt wird und die gewünschte Information auf dem Bildschirm "zeichnet" (Bilder, Sprites). Quasi der "Zeichnen-Step".

    Natürlich gibt es noch unzählig andere Events, die sehr nützlich sind, die möchte ich aber an dieser Stelle nicht ansprechen.

    Wenn das Spiel gestartet wird, landet der Spieler beim Titelbildschirm. Beim Betreten dieses Raumes wird ein Object initiiert, welcher "main_control" heißt und alle wichtigen Spielvariablen über sein Creation-Event festlegt. Ich habe ein paar Beispiele aufgezählt, damit ihr ein Gefühl kriegt, wie das aussieht:

    Code:
    // Die Zeit im Spiel
    global.seconds = 0;
    global.minutes = 0;
    global.hours = 0;
    
    // Ein Beispiel für die Attribute von Tarquin
    attributes=ds_map_create();
    var name="Tarquin";
    
    attributes[? name+"_hp"]=100;
    attributes[? name+"_hp_max"]=120;
    attributes[? name+"_attack"]=15;
    attributes[? name+"_defense"]=7;
    attributes[? name+"_sp"]=80;
    attributes[? name+"_sp_max"]=100;
    attributes[? name+"_speed"]=12;
    attributes[? name+"_psi"]=12;
    attributes[? name+"_xp"]=0;
    attributes[? name+"_xp_max"]=50;
    attributes[? name+"_lvl"]=1;
    
    // Ein Beispiel für die Gegenständsattribute
    inventory = ds_map_create();
    var name = "Bat";
    
    inventory[? name+"_name"] = "Bat";
    inventory[? name+"_type"] = "weapon";
    inventory[? name+"_attack"] = 3;
    inventory[? name+"_defense"] = 0;
    inventory[? name+"_psi"] = 0;
    inventory[? name+"_speed"] = 0;
    inventory[? name+"_hp_max"] = 0;
    inventory[? name+"_sp_max"] = 0;
    inventory[? name+"_usedby"] = "Tarquin";
    inventory[? name+"_heal"] = false;
    inventory[? name+"_healvalue"] = 0;
    inventory[? name+"_psipoints"] = false;
    inventory[? name+"_psivalue"] = 0;
    inventory[? name+"_buyprice"] = 10;
    inventory[? name+"_description"] = "An old baseball bat.#ATK +3";
    inventory[? name+"_discard"] = true;
    Beim Codebeispiel wird die Zeitzählung auf null gesetzt, die Attribute des Helden geladen und die (ich nenne es mal so) Gegenstandsdatenbank geladen, damit das Spiel weiß, was ein Gegenstand für Attribute hat. Die Attribute werden in einer sogenannten "ds_map" geladen. Das ist eine Datenstruktur, die "Keys" mit entsprechenden "Werten" speichert, also sowas wie "HP" und den Wert der Lebenspunkte.

    Soviel also zu den Variablen. Immer, wenn das Spiel startet, werden diese Variablen geladen und festgesetzt. Der Spieler startet also immer bei Lvl 1, etc. Nun möchte ich aber meinen Spielstand festhalten und darauf zugreifen können. Dafür eignet sich folgendes Speicherskript, welches ich beispielhaft vorstelle:

    Code:
    // Ini-Datei öffnen
    ini_open("File1.sav");
    
    // Zeiten in Ini-File speichern
    ini_write_real("global", "hours", global.hours);
    ini_write_real("global", "minutes", global.minutes);
    ini_write_real("global", "seconds", global.seconds);
    
    // Attribute in Ini-File speichern
    attributes_savestring = ds_map_write(main_control.attributes)
    
    //String in Ini-File speichern
    ini_write_string("player", "player_attributes", attributes_savestring);
    
    // Ini-Datei schließen
    ini_close();
    Das Spiel öffnet damit eine Ini-Datei, die im "AppData"-Ordner von Windows abgelegt wird. Über den Befehl "ini_write_real(section, key, value)" können Zahlen dort abgelegt werden, eingeteilt nach Sektionen und dann als Key-Value-Wertepaar gespeichert. Das ist bei einfachen Variablen kein Thema. Was ist aber mit unseren komplexen Datenstrukturen wie den "ds_maps"? Alles einzeln einzutippen wäre zu aufwendig. Zum Glück hat der Game-Maker die Funktion "ds_map_write". Damit wird die gesamte ds_map in einen unleserlichen Zeichenstrang umgewandelt, den "String". Dieser String kann kann unproblematisch in die Ini-File abgelegt werden. Das Ganze sieht das ungefähr so aus:



    Über das Prinzip können auch Quest/Story-Fortschritte einfach abgespeichert werden. Ich werde zu diesen Zwecken ebenfalls eine Datenstruktur mit Key und Value wählen, z.B. "Switch1" und "0" bzw "1". Diese entspricht vom Prinzip der "Switch"-Liste beim RPG-Maker und kann genau wie dort auch hier genutzt werden. Wenn ein Quest aktiviert ist, stellt man den Switch für diese Quest von "0" auf "1" und das Spiel was bescheid. Statt 0 und 1 gehen natürlich auch "true" und "false" (die klassischen Booleans halt). Wie ihr bemerkt habe, habe ich die Gegenstandsattribute nicht gespeichert. Das macht Sinn, weil sie von Anfang bis Ende (hoffentlich!) konstant bleiben!

    Nun starten wir das Spiel neu oder die Variablen werden neu initiiert und sind wie vor dem Speichern. Wie laden wir die abgespeicherten Daten nun? Dazu nutze ich ein Load-Skript, welches die initiierten Variablen mit den gespeicherten Variablen überschreibt.

    Code:
    ini_open("File1.sav");
    global.hours = ini_read_real("global", "hours", 0);
    global.minutes = ini_read_real("global", "hours", 0);
    global.seconds = ini_read_real("global", "seconds", 0);
    global.partysize = ini_read_real("player", "partysize", 0);
    
    attributes_savestring1 = ini_read_string("player", "player_attributes", "unknown");
    ds_map_read(main_control.attributes, attributes_savestring1);
    ini_close();
    Die Ini-Datei wird geöffnet, die Variablen neu festgelegt und der String wird rausgelesen und über die "ds_map_read"-Funktion wieder in die funktionierende Datenstruktur übersetzt. Alles schick, ein Problem ist noch da: der Spieler kann dieses Save-File selber öffnen und sich so natürlich mehr Attribute und Level zuschummeln (ach, als Kind habe ich so viele Spiele gehackt! ). Hierfür hat der Game-Maker eine Verschlüsselung. Über "base64_encode(string)" kann ein String in einen verschlüsselten String umgewandelt werden und über "base64_decode(string)" beim Laden wieder in einen leserlichen String umgewandelt werden. Bei Zahlen muss der Wert erst in einen String umgewandelt und nach dem Decoden wieder in eine Zahl zurückgewandelt werden.


    Soo, ich hoffe ich konnte für ein bisschen Klarheit sorgen und euch die Speicher- und Ladefunktionen näher bringen. Ihr könnt den Code natürlich nutzen wie ihr wollt und ein bisschen rumspielen! Sagt mir bescheid, ob euch solche technischen Abhandlungen interessieren, dann schreibe ich gerne öfter über sowas.

    Stay tuned und bis zum nächsten (und weniger technischen) Devlog!

  12. #52

    Hier wird nicht geterrort
    stars_gf
    Ja sehr gut! Da werd ich mir den Beitrag wohl später mal ganz genau ansehen, und kucken ob ich das wohl auch so hinbekomme. Vielen lieben Dank für deine Ausführungen, ich empfinde das als sehr hilfreich

  13. #53
    Zitat Zitat von Schotti Beitrag anzeigen
    Die Ini-Datei wird geöffnet, die Variablen neu festgelegt und der String wird rausgelesen und über die "ds_map_read"-Funktion wieder in die funktionierende Datenstruktur übersetzt. Alles schick, ein Problem ist noch da: der Spieler kann dieses Save-File selber öffnen und sich so natürlich mehr Attribute und Level zuschummeln (ach, als Kind habe ich so viele Spiele gehackt! ). Hierfür hat der Game-Maker eine Verschlüsselung. Über "base64_encode(string)" kann ein String in einen verschlüsselten String umgewandelt werden und über "base64_decode(string)" beim Laden wieder in einen leserlichen String umgewandelt werden. Bei Zahlen muss der Wert erst in einen String umgewandelt und nach dem Decoden wieder in eine Zahl zurückgewandelt werden.
    Stopstopstop. Base64 ist keine Verschlüsselung sondern encodiert einfach nur Binärdaten zu ASCII-Zeichen und wieder zurück.
    Den "einfachen Cheater" wird das vielleicht abhalten, aber bitte denke nicht, die Spielstände wären damit gegen Manipulation geschützt.
    Wobei ich das bei einem Single-Player-Spiel jetzt auch nicht großes Problem sehe. Wenn sich jemand den Spaß vermiesen will, soll er doch...

  14. #54
    Zitat Zitat von Cepanks Beitrag anzeigen
    Stopstopstop. Base64 ist keine Verschlüsselung sondern encodiert einfach nur Binärdaten zu ASCII-Zeichen und wieder zurück.
    Den "einfachen Cheater" wird das vielleicht abhalten, aber bitte denke nicht, die Spielstände wären damit gegen Manipulation geschützt.
    Wobei ich das bei einem Single-Player-Spiel jetzt auch nicht großes Problem sehe. Wenn sich jemand den Spaß vermiesen will, soll er doch...
    Oh, ok, wieder was gelernt! Das heißt also, der Spieler muss den ini-Inhalt einfach nur durch ein kleines Internet-Tool zum Decoden jagen? Du hast aber schon recht, wenn jemand sich die Mühe machen möchte, kann er es gerne machen, es ist sein Spielspaß. Hauptsache der ini-Inhalt ist nicht zuuu offensichtlich!

  15. #55
    Hallo Atelier! Wer meine Tweets die letzten Tage verfolgt hatte, weiß sicher schon, dass ich mich die letzten Tage mit der Namenseingabe beschäftigte. Ich bin mit dem System inzwischen zufrieden und möchte euch ein kleines Tutorial dazu präsentieren. Vielleicht interessiert es den Einen oder Anderen und kann Nutzen daraus ziehen!

    UPDATE: ENTER YOUR NAME! NOW!


    Santria ermöglicht es dem Spieler, die Hauptcharaktere am Anfang selber zu benennen und fragt außerdem nach dem Lieblingessen und -musikgenre. Ich möchte das Spielerlebnis individualisieren und dem Spieler ermöglichen, sich mehr mit der Spielwelt reinzuversetzen. Die ganze Sache sieht wie folgt aus:



    Der Game Maker ermöglicht dem Entwickler auf einfache Art und Weise, ein Textfeld im Spiel zu erzeugen, welches mit Maus angeklickt und mit Tastatur gefüllt werden kann. Diese Herangehensweise möchte ich vermeiden, da es für meinen Geschmack zu wenig "retro" ist und ich mir die Möglichkeit offen halten möchte, das Spiel auch auf Konsolen zu porten. Es musste also einen anwählbare Tastatur ins Spiel eingebaut werden. Das Layout ist, wie nicht schwer zu erkennen, aus den Zelda-Spielen entnommen. Was genau wurde getan?

    Die ganze Abfrage läuft über ein Objekt mit Creation, Draw und Step-Event. Ich werde den Code, wie schon vorher, nicht bis ins kleinste Detail und vollständig hier aufschreiben, da es nur ums Grundprinzip geht und ihr den Rest euren Vorlieben entsprechend ergänzen könnt. Wenn es Fragen gibt, gerne reinschreiben.

    Der Creationcode enthält folgende Variablen, die iniitiert werden:

    Code:
    // Animationsgeschwindigkeit
    image_speed = 0.07;
    
    // die Spalten
    s = 0;
    s_now =0;
    // die Zeilen
    z = 0;
    z_now = 0;
    
    // die linke obere Ecke der Grid
    gridx = view_xview[0]+35;
    gridy = view_yview[0]+100;
    
    // Bei welchem Buchstaben sind wir?
    letterlocation = 1;
    
    // Die Buchstabenplätze werden initiiert
    letter1 = " ";
    letter2 = " ";
    letter3 = " ";
    letter4 = " ";
    letter5 = " ";
    letter6 = " ";
    letter7 = " ";
    
    // Welche Buchstaben erkennt das Spiel? 
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890.- ";
    Kurze Erläuterung:
    Wir werden eine Tabelle mit Zeilen und Reihen zeichnen, die unsere Buchstaben, die wir über den String "letters" festgelegt haben, enthalten wird. Die Position der oberen linken Ecke (wo unser Spiel anfangen wird zu zeichnen) legen wir fest. Ich arbeite mit "Views", da ich Räume habe, die größer sind als die Auflösung des Spiels. Der View ist das Gebiet, welches die "Kamera" (in dem Fall unser Computerbildschirm") vom Raum erfasst und fängt oben links bei x=0 und y=0 an. Mit "letterlocation" weiß das Programm, bei welchen Buchstaben wird gerade eingeben und abschließend werden die Buchstabenplätze initiiert, welche gefüllt werden können (sind sieben, mehr will ich dem Spieler nicht geben).

    Nun gehen wir zum Zeichnen. Der Drawevent wird jeden Frame abgespielt. Jetzt mal langsam nach und nach:

    Code:
    if (letterlocation = 1){
     draw_sprite(spr_letter_underline, -1, view_xview[0]+80, view_yview[0]+54);
    } else {
    draw_sprite(spr_letter_underline, 0, view_xview[0]+80, view_yview[0]+54);
    }
    
    
    if (letterlocation = 2){
    draw_sprite(spr_letter_underline, -1, view_xview[0]+94, view_yview[0]+54);
    } else {
    draw_sprite(spr_letter_underline, 0, view_xview[0]+94, view_yview[0]+54);
    }
    
    // und so weiter und so fort
    Dieser Code zeichnet die Unterstriche, wie ihr sie beim Gif sehen könnt. Der Unterstrich ist ein Sprite, den ich erstellt habe. Der Sprite besteht aus zwei Bildern, einmal der Unterstrich an sich und einmal ein leeres Bild. Jede Buchstaben-Position hat eine if-Abfrage: Wenn wir den ersten Buchstaben eingeben wollen, ist die letterlocation =1 und die image_index wird auf -1 gesetzt. Was heißt das? Ein image_index = 0 zeichnet das erste Bild des Sprites, ein image_index von -1 wechselt zwischen den Bildern mit der Geschwindigkeit "image_speed" (erinnert ihr euch noch an den Creationcode?), eine Animation entsteht. Über den Code lassen wir also den Unterstrich nach Bedarf blinken.

    Weiter:

    Code:
    if (letterlocation>1){
    draw_text_shadow(view_xview[0]+81, view_yview[0]+40, letter1, c_white, c_black, 1);
    }
    
    if (letterlocation>2){
    draw_text_shadow(view_xview[0]+95, view_yview[0]+40, letter2, c_white, c_black, 1);
    
    // und so weiter, bis Nr. 7!
    }
    Dieser Code zeichnet die Buchstaben, die wir gezeichnet haben. Was macht er? Wenn wir nach dem zweiten Buchstaben suchen, ist der erste Buchstabe schon gewählt wurden (letterlocation > 1). Wir wollen deshalb, dass der erste Buchstabe schonmal über den Unterstich gezeichnet wird. Das passiert hier.

    Weiter gehts:

    Code:
    for (z=0;z<5;z++) {
        for (s=0;s<13;s++) {
            draw_letter = string_char_at(letters, (s+2) + (z*13 -1));
            draw_text_shadow(gridx+s*20, gridy+z*20, draw_letter, c_white, c_black, 1);
        }
    }
    Dieser Code ist tricky und das Herzstück. Er zeichnet die Buchstaben, Reihe für Reihe, Spalte für Spalte. Er fängt bei Zeile 1 an und geht die 13 Spalten durch, nimmt sich den richtigen Buchstaben nach Spalten- und Zeilen-Wert und klatscht diesen dann in die Tabelle, bevor der Code dann in die nächste Zeile geht. Schaut euch den Code genau an, guckt gegebenenfalls nochmal for-Schleifen und das Raussuchen von Buchstaben aus Strings an oder dann läuft es. Achja, zu meiner draw_text_shadow-Funktion: Das ist eine frei verfügbare Funktion aus dem Essential Script-Paket, erlaubt Schrift mit Schatten und sieht so aus: draw_text_shadow(x-Wert, y-Wert, was wird gezeichnet?, Farbe der Schrift, Farbe des Schatten, Alphawert). Als Hinweis, damit klar wird, wie die Buchstaben gesetzt werden und woher der Code dann weiß, welchen x- und y-Wert ein Buchstabe hat.

    So, und jetzt zum letzten Draw-Code, der Cursor! Das ist wiederum einfach:

    Code:
    draw_sprite(spr_registrationmarker, 0, gridx+z_now*20, gridy+s_now*20);
    Der Sprite mit dem Cursor wird auf die aktuelle Spalten/Zeilen-Kombi gepackt und schnieke!

    Puh, das war ein kleiner Kraftakt. Eins fehlt nur noch: Woher weiß das Programm, in welcher Spalte/Zeile wir uns nun befinden? Dafür brauchen wir jetzt den Stepevent!

    Code:
    if keyboard_check_pressed(vk_right){
    s_now++;
    }
    if keyboard_check_pressed(vk_left){ 
    s_now--;
    }
    if s_now < 0 s_now = 12;
    if s_now > 12 s_now = 0;
    
    if keyboard_check_pressed(vk_down){
    z_now++;
    } 
    
    if keyboard_check_pressed(vk_up) {
    z_now--;
    }
    if z_now < 0 z_now = 4;
    if z_now > 4 z_now = 0;
    Wundert euch nicht über 12 statt 13 und 4 statt 5, der Game Maker fängt immer bei 0 an zu zählen. je nach Tastendruck ändert sich mit dem Code die Spalte und Zeile. Wenn wir bei der Zeile am Ende ankommen, fängt der Cursor automatisch wieder am Anfang der Zeile an. Cool! Jetzt brauchen wir nur noch eine Enter-Abfrage im Code:

    Code:
            
    if keyboard_check_pressed(vk_enter){
            if (letterlocation = 1) {
                   letter1 = string_char_at(letters, (s_now+2) + (z_now*13 -1));
                   letterlocation = 2;
                   exit;        
            }
            
            if (letterlocation = 2) {
                   letter2 = string_char_at(letters, (s_now+2) + (z_now*13 -1));
                   letterlocation = 3;
                   exit;
            }
    }
    // und so weiter, bis Buchstabe 7
    Über Enterdruck wird der aktuell ausgewählte Buchstabe in "letterX" abgespeichert und das Programm geht auf die Suche nach dem nächsten Buchstaben! Ich habe bewusst auf die Erklärungen zu der "Back"-, "Default", und "Done"-Taste verzichtet, da es dieses Tutorial nochmal auf doppelte Größe aufblähen würde. Die wichtigsten Komponenten sind drin und sollten euch ermöglichen, nach bisschen Codeinspektion eine eigene Tastatur zu bastelt!

    Ich hoffe, ich konnte euch einen kleinen Einblick in das Spieleentwickeln mit dem Game Maker geben. Ihr seht, der Game Maker ist eine sehr mächtige Engine und ermöglicht euch, 2D-Spiele nach den eigenen Wünschen sehr individuell aufzubauen. Dafür müsst ihr aber auch alles von null auf selber aufbauen. Selbst so eine Kleinigkeit wie dieses Enter Name-Beispiel braucht eine gute Portion Code und Zeit (bei mir: 2-3 Nachmittage rumprobieren+grafische Oberfläche anpassen). Der Aufwand lohnt sich aber, da es ein sehr befriedigendes und befreiendes Gefühl ist, wenn ein Code endlich so aufgeht, wie man es geplant hat.

    Bevor ich diesen Entwicklereintrag schließe eine Frage an das Atelier, das mir seit paar Tagen im Kopf schwirrt:

    Ich überlege gerade, ob ich dem Spieler die Möglichkeit gebe, sich zwischen männlicher und weiblicher Hauptfigur zu entscheiden. Was haltet ihr davon? Würde euch so eine Option freuen oder ist es euch scheißegal? Das Spiel wird zum Teil Lifesim mit dem Love Interest-Aspekt, deswegen die Frage.

    Stay tuned und bis zum nächsten Mal!

  16. #56
    Hallo Atelier!

    Von meiner Seite werfe ich ein kleines Miniupdate rein, da ich mir heute den Arsch rundgepixelt habe (und das natürlich gerne jetzt zeige würde ) und ab morgen wohl in den Fängen des Hyper Light Drifters sein werde:




    Ihr seht den Pine Falls-See als neue Location und die Anfänge des Angel-Minispiels. Wenn die Mechanik so eingebaut ist, wie ich es mir vorstelle, werdet ihr mehr zu sehen bekommen. Wie findet ihr die neuen Pixeleien?

    Gruß,

  17. #57
    @Schotti:
    Also mir gefällt der Grafikstil richtig gut. Habe noch nichts gesehen was du gepixelt hast was mir nicht gefallen hätte

    Bei der Speicherfunktion ist mir noch etwas aufgefallen! Da würde ich das Confirm und Cancel von der Position her tauschen. Ist mMn bequemer wenn man nicht nach unten drücken muss um zu Bestätigen...

  18. #58
    Zitat Zitat
    Ist mMn bequemer wenn man nicht nach unten drücken muss um zu Bestätigen...
    Hahahaha ... ich freue mich schon drauf, wenn ich wie so ein Spaten, die ganze Zeit auf eine Taste drücke und versehentlich meinen Spielstand überschreibe, den ich gar nicht überschreiben will. xD

  19. #59
    Zitat Zitat von Memorazer Beitrag anzeigen
    @Schotti:
    Also mir gefällt der Grafikstil richtig gut. Habe noch nichts gesehen was du gepixelt hast was mir nicht gefallen hätte

    Bei der Speicherfunktion ist mir noch etwas aufgefallen! Da würde ich das Confirm und Cancel von der Position her tauschen. Ist mMn bequemer wenn man nicht nach unten drücken muss um zu Bestätigen...
    Zitat Zitat von Avoki Beitrag anzeigen
    Hahahaha ... ich freue mich schon drauf, wenn ich wie so ein Spaten, die ganze Zeit auf eine Taste drücke und versehentlich meinen Spielstand überschreibe, den ich gar nicht überschreiben will. xD
    Danke für das Lob, Memorazer!

    Ich habe die Position von Confirm und Cancel bewusst so gewählt, damit der Spieler nicht ausversehen seine Spielstände überschreibt und sich tierisch drüber ärgert. Ich hoffe, die Unbequemlichkeit dadurch ist nicht exorbitant groß. Ich fühle mich zumindest in meiner Wahl durch Avokis Kommentar bestätigt

  20. #60
    UPDATE: FISHING, FISHING, FISHING!



    Endlich habe ich das Angel-Minigame beendet! Im Prinzip ist es relativ simpel: Ihr haltet Enter länger gedrückt, um die Angel auszuwerfen. Damit will ich verhindern, dass Spieler ausversehen in das Minigame geraten und zusätzlich die Immersion ein wenig steigern. Anschließend versucht ihr beim Quick-Time Event die Mitte des Balkens zu treffen. Um Frust zu vermeiden, habt ihr in dieser Minispielphase unbegrenzt Zeit. Je höher euer Angelskill ist, umso langsamer bewegt sich der Cursor. Je besser ihr die Mitte mit dem Cursor trefft (und je höher euer Angelskill ist), umso höher ist die Wahrscheinlichkeit, etwas nützliches zu angeln. Zwischen Fischen und Schatztruhen ist alles möglich!

    Hat echt viel Spaß gemacht, das Minispiel zu designen! Als nächstes kümmere ich mich um eine Spielhalle mit Arcade-Spielen (Hyper Magician DX wird eins der spielbaren Games sein! Wer es noch nicht kennt: Ab in den Game Jam-Thread! >> KLICK! <<) und/oder um ein Höhlentileset, um das Intro etwas voranzubringen.

    Soviel von mir, stay tuned und bis zum nächsten Mal!

Berechtigungen

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