Wie baue ich Errungenschaften in mein Spiel ein?

  • GM 6

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wie baue ich Errungenschaften in mein Spiel ein?

    Guten Tag erstmal ^^ , ich habe es schon in vielen gm Spielen gesehen und möchte es nun auch in meine Spiele hinzufügen: Errungenschaften.

    Ich habe schon in der gm-hilfe nachgeschlagen und auch hier im Forum habe nichts gefunden :shifty: . Deswegen frage ich ob mir jemand erklären kann, wie man mit gml etwas wie Errungenschaften programmieren kann. Mit Errungenschaften meine ich zb, wenn man eine bestimmte Anzahl Gegner im Spiel tötet, das man dafür im Menü des Spiels einen Orden sieht. Wenn man das Spiel verlässt und neu startet sollen die Errungenschaften jedoch gespeichert bleiben, für jeden Spieler.

    Wie gesagt hab ich das schon öffter gesehen und hab nirgens ein tut oder etwas der gleichen gefunden. Ich würde mich über jede art von Andwort oder Tutorial oder Erklärung freuen, danke schonmal... :thumbsup:
  • du könntest das mit ner Variable machen:

    Also du machst ne Variable z.b. global.killenemy oder so was, die definierst du im Menu mit 0 und dann erhöht sie sich um 1 wenn du einen Gegner tötest und dann bei zum Beispiel 50 Gegner zeigt es dann im Menu an.

    Create-Event:
    Spoiler anzeigen

    GML-Quellcode

    1. global.killenemy = 0;


    In das Event wo du ein Gegner tötest, das kannst du dann z.b im Destroy-Event von deinem Gegner machen:
    Spoiler anzeigen

    GML-Quellcode

    1. global.killenemy += 1;


    und dann im Draw-Event von einem Objekt das im Menu existiert:
    Spoiler anzeigen

    GML-Quellcode

    1. if global.killenemy == 50
    2. {draw_text(x,y,"Orden: 50 Gegner getötet"
    Gruß Gamer
  • wenn du es nach erneutem programmstart imemr noch haben möchtest, dann musst du das irgendwo reinschreiben den wert der variable und beim programmstart wieder auslesen.

    zB mit file_text_ befehlen, schau dazu in der hilfe nach, dann schreisbt du den wert in eine datei rein und beim programsmtart liest du seie aus der datei aus, dafür gibts befehle.

    die datei kann man jedoch öffnen und editieren, also um es besser zu verstecken kannst du die werte auch in die registry schreiben lassen auch dafpür gibt es befehle aber wenn man sich damit nicht asukennt müllt man die nur zu, is in dem fall aber nicht schlimm,
  • @anti0ogen blau
    Erzähl keinen Quatsch, die Registry zumüllen ist mit Sicherheit keine tolle Idee.

    Im wesentlichen basiert das Ganze auf zwei Dingen:
    1. Du brauchst einen Zähler oder ähnliches das misst, was du für Achievements haben sollst (im Beispiel von Gamer sind das die getöteten Gegner).
    2. Brauchst du eine Abfrage, die diese Messwerte abfragt und schließlich einmal(!) das Achievement ausgibt.

    Damit das Ganze nur einmal ausgegeben wird, musst du entweder sichergehen, dass die Abfrage nur einmal gestartet wird oder du bedienst dich einer zweiten variable wie z.b. achievement_kills1, die auf true gesetzt wird, wenn das achievement bereits einmal verteilt wurde.
    Entsprechend müsstest du diese Variable natürlich initialisieren

    GML-Quellcode

    1. achievement_kills1 = false;

    und dann auch immer brav mit abfragen

    GML-Quellcode

    1. if (achievement_kills1 == false and global.killenemy == 50) {
    2. // Toller Code, der das Achievement visualisierst
    3. achievement_kills1 = true;
    4. }
    .
  • MewX ich bin hier wohl einer der einzigen der zuerst überleg tund dann schreibt?

    DU hast eben nur verfeinert was the gamer bereits erzählt hat (ist also nah dran an "schwanzvergleich" oder spam)

    und KEINE eurer "lösungen" befasste sich mit dem problem dass es sich auch nach erneutem programmstart noch gespeichert ist.

    registry zumüllen ist freilich schlecht, aber davon sprach ich nicht, ich sprach von registry benutzen.

    ein deinstallations-programm das er vielleicht schreiben kann (ode rwillsd du behautpen das könne er nich?) kann problemlos die mit eindeutigem pfad definierten einträge löschen, und somit die registry nur solnage "benutzen" wie es gebracuht wird.

    von zumüllen ist hier nie die rede gewesen ich habe nur darauf hingewisesn dasses vll nicht das beste is, da man sich mit registry auskennen sollte, aber du redest so al sob es imemr schlecht sei => falsch: somit implizierst du in deinem post dass du absolut siche rbist dass ER die registry zumüllen würde, und wirfst ihm "noob-haftigkeit" vor.

    zusammenfassung:

    unvollstädige porblemlösung

    sogar unnötiger post, da etwa desselbe wie the gamer

    unterstellung des gegenüber, dass er im gegensatz zu erfahrenen usern registry zumüllen würde, anstatt es richtig zu machen, wodurch es 0% probleme gäbe.


    eine nur zwischen den zeilen lesbare untersetllugn an den thread-autor


    deinem post kann man außerdem eine offensichtliche subjektive beleidigung entnehmen (an mich gerichtet)

    also :

    FLAMEWAR

    - GESTARTET BY MEWX ( in meinem post war 0% beleidigung o.ä, genau so wie in den anderne posts wo ich (auch wenns keiner glaubt) nie angefangen habe)

    Edit by MewX: Und beendet by MewX. Verwarnung aufgrund von Spam bzw. fragwürdigem Umgangston erteilt.
  • Ich bin tatsächlich nicht darauf eingangen, aber man kann auch Manuell das Spiel laden und speichern, wie es sonst über F5 und F6 gehen würde (gibts auch als Drag and Drop Befehle). Mithilfe dessen lassen sich globale Variablen auch abspeichern. Knackbar ist das natürlich, aber es sollte gut funktionieren und recht einfach umzusetzen sein.
  • das is ja lächerlich, meine objective darstellung deiner niedertracht hat dir wohl nicht gepasst?



    durch save wird doch das ganze spiel gesichert, aber vll will er dass nur eine variable gescihert wird ohne dass das spiel gesichert wird, also ich meine zB wird auch der room gesichert usw, falls das in sein spiel reinpasst passts ja , aber somit kann man ja nur das komplette spiel sichern, was dann sogar platzverbrauchend ist.

    man könnte auch eine datei fern vom stammverzeichnis des spieles erstellen so dass man sie nicht findet
  • Als Anfänger braucht man sich nicht um Sicherheit zu kümmern. Save und Load bieten eine einfahce Möglichkeit, dieses Problem zu lösen und "Hacken" nicht allzu trivial zu machen. Wo ist also das Problem?

    Wenn man mit dem Programmieren gerade erst anfängt, sollte es einen wenig interessieren, wie man ein paar dumme Variablen versteckt.

    Und jetzt Schluss mit dem Mist.
  • save und load per drag and drop ist genau so leicht wie sachen "verstecken" oder sogar schwer hack-bar uz machen, wenn man weiß wie man die verschiedenen mittel einsetzt.

    stell dir vor:

    ein großes haus zu baun ist genauso leicht wie ein kleine shaus zu baun, JEDOCH dauert es länger bis es fertig ist, aber die arbeit ist identisch.

    warum sollte man dem jenigen nicht wenigstens das große haus zeigen? wenn er es nicht "bezahlen" kann, kann er sich trotzdem fürs kleinere entscheiden, oder er nimmt gleich das größerer, da hier im forum ja die beantworter der fragen einen großteil der arbeit für das "große" haus abnhemen würden, zumindest falls interesse daran entstünde.

    wenn er das "große" haus dann hat, dann wird er nie mehr das kleien haus benutzen, also warum zeit mit ienem kleinen verschwenden?

    etz weniger metaphorisch.

    er kanns dch auch gleich gscheit machen, schließlich können hier genügend leute erklären wie das geht! oder willsd du ihm absichtlich "bildung" vorenthalten?
  • Dateien verstecken ist keine Bildung, sondern schlechter Programmierstil. Informatik- oder Mathestudium, lineare Algebra: Dort lernt man die Grundsätze der Verschlüsselung, und damit auch die Werkzeuge, um sich effektiv zur Wehr zur setzen.
    Wenn sich damit nicht befassen kann/will, kann man sich mal nach der DLL umschauen, die verschlüsselte 7zip-Archive unterstützt.
    Nur Dateien verstecken sollte man nicht. Wenn ich den Programmordner eines Spiels ohne Installation lösche, will ich auch keinen anderen Mist mehr auf der Platte davon haben.

    KiraStar wird sich mit Sicherheit damit befassen, sobald all seine anderen Fragen geklärt sind. Im Moment muss er aber stattdessen zusehen, wie sich hier jemand anscheinend ganz dringend profilieren muss. Ich rate dir ab, in diesem Thread noch einmal zu posten. Es hilft dem Threadersteller überhaupt nicht.
  • du hast angefangen (ja hast du ) und somit isses nicht fair wenn du das letzte wort haben willst (ja das willsd du).

    verschlüsselung aka kryptografie ist natürlich bessa, aber ich kann demjenigen nicht damit weiterhelfen, da ich das nicht gelernt hab, also ist es deine aufgabe.

    da du ihm dieses wissen vorenthalten willsd, was ich auch nachvollziehen kann ebi so einem thema, sollte4st du mit sowas garnicht hier in den thread kommen, und angeben dass du davon mal was gehört hast. (das habe ich ja shcließlich auch nicht getan, aber ja ich hatte schon einen vortrag gehört in der universtität bayreuth von einer kryptologin ex geheimdienst oder sowas <- natürlch ned geheimdiesnt sond würde sies ja nicht sagen dass sie daovn is nehm ich mal an, aber so ähnlich , aber das hab ich für mich behalten, da das absolut nicht der richtige weg ist hier zu helfen, ich kann selbstverstänlich mit fachbegriffen protzen wie du auch, zähme dich MewX !) ich hört erst auf zu posten wenn du aufhörst da die eindeutige beleidigungm, die als erstes ausgesprochen wurde von dir ausging, und nun ich eben mich zur wehr setze

    nun herrsct gleichstand und ich bin garnich auf sieg aus, gleichstand is völlig genug, also überlege dir was du als nöchstes machst ganz gut !

    Edit by MewX: Ich hab aber leider hier immer das letzte Wort. 3 Tage Auszeit wegen unzumutbarer Spammerei. Führ deinen Kreuzzug gegen die Ungerechtigkeit bitte woanders.
  • Ein großes Haus zu bauen ist von der Arbeit nicht identisch wie ein kleines Haus zu bauen. Man muss insbesondere bei der Statik wesentlich mehr beachten und achtsamer sein, als bei einem kleinen Haus. Man braucht also mehr Übung und Wissen um ein großes Haus zu bauen.

    Um diesen in meinen Augen hinkenden Vergleich auf die Softwareentwicklung zu übertragen:
    Je umfangreicher ein Softwareprojekt ist, desto schwieriger ist es alle Seiteneffekt zu beachten und den Überblick zu behalten. Das gilt für den Game Maker umso mehr, da er einen bei der Projektplanung und Analyse deutlich weniger unterstützt als andere Entwicklungsumgebungen.
    Anfänger sollte also erst mit möglichst einfachen Projekten einsteigen, und dann nach und nach größere, kompliziertere Projekte in Angriff nehmen. Es mag sein, dass es möglich ist per Drag und Drop eine exe scwer hackbar zu machen, aber leicht ist es nicht - du schreibst ja selbst, man muss wissen die entsprechenden Mittel einzusetzen, und wie soll sich Schwierigkeit in der Softwarentwicklung anders Zeigen als durch benötigtes Know-How.

    Und erklären wie es geht nützt ihm nicht allzu viel, wenn er nicht versteht wieso es so geht, wie man es ihm gezeigt hat.
    www.glowingorb.de
    „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

    (Schachweltmeister Emanuel Lasker)
  • aber wenn er nachfragt wrde ich es versuchen zu erklären und ihr faulen egoisten (ja!) woltl dies von anfang an nicht tun, ihr bahauptet also zwischen den zeilen dass derjenige dumm wäre, weil ers eh nie verstehen würde, das ist eine der schelchtesten eingeschagften die ein mensch haben kann

    Edit by MewX: Zur Unterhaltung ausnahmsweise vorerst nicht gelöscht.
  • Back to topic: Im grunde genommen ist es recht einfach die erforderlichen daten abzuspeichern.
    Ich werde es grade trozdem nocheinmal erklären, um dem threadersteller ei wenig unter die arme zu grifen:

    GML-Quellcode

    1. text1=file_text_open_write("dateiname")//eigentlich rehct einfach: Die datei Dateiname wird geöffnet und die id in text1 gespeichert

    zwei wege zum schreiben in eine text datei:

    GML-Quellcode

    1. file_text_write_string(text1,"Dein text")//schreibt in die datei mit id text 1 "dein text"
    2. file_text_write_real(text1,0000)//schreibt in die datei mit id text 1 eine zahl(hier 0000)

    zum auslesen:

    GML-Quellcode

    1. dein_text=file_text_read_string(text1)//liest aus der datei mit der id text1 eine zeichenkette und schreibt sie in die variable dein_text
    2. dein_text=file_text_read_real(text1)//liest aus der datei mit der id text1 eine Zahl und schreibt sie in die variable dein_text

    ziemlich einfach...was?
    das ganze geht noch mit ini dateien. aber dazu liest du dir bitte das dazugehörige tuturial durch da ich jetzt keine zeit mehr habe ;( :
    Ini Tutorial
    oder suchst in diesem script die antwort:
    Freischaltungs Tut Teil 2
    wenn du fragen hast kannst du dich immer per msn icq oder pn an mich wenden
    mfg gamer_08
  • Ich fand es bis jetz relativ amüsant wie anti0ogen blau die gesamte Zeit MewX angegriffen hat (So sieht es aus meiner Sicht aus).
    Das einzige was mir bis jetzt wirklich weiterhelfen konnte war das Kommentar von The Gamer. Danke dafür :thumbsup: .
    Trotzdem frage ich jetzt erneut die anderen (außer anti0ogen blau, weil ich keine Lust auf noch einen Streit hab :thumbdown: ) wie ich die Errungenschaften bei erneutem Starten des Spiels speicher. Nur nebenbei, ein wenig versteh ich die gml und hab mich schon selbst geschämt als ich merkte wie einfach das The Gamer erklärte.

    Also wenn jemand die Lust und die Freiheit besitzt ohne einen anderen anzugreifen mir zu erklären wie ich die Errungenschaften abspeicher, würde ich mich sehr freuen. Danke im vorraus :D
  • Nimm meine Trennung der Variablen und speicher, mit welcher Methode auch immer, die Variablen ab, die Aussagen, ob man das Achievement schon hat oder nicht. Wenn die Zähler sich nicht zurücksetzen sollen, dann müssen die natürlich auch gespeichert werden.

    Lies dich mal durch die Tuts dazu, das sollte einiges klären.
  • Theoretisch kannst du (falls du es nicht für den eigentlichen Zweck benötigst) das Highscoresystem des Gamemakers zum Speichern von bis zu 10 Achievements missbrauchen.
    Schreib dir dazu 2 Scripts:

    GML-Quellcode

    1. // scr_set_achievement
    2. for (i=0;i<10;i+=1)
    3. {
    4. if (highscore_value(i)==argument0) // falls das Achievement schon freigeschaltet wurde...
    5. {
    6. exit; // ...schalte es nicht erneut frei
    7. }
    8. }
    9. if (argument0<=10 && argument0>0) // wenn das Achievement im erlaubten Bereich von 1-10 ist...
    10. {
    11. highscore_add("achievement",argument0); // ...schalte es frei
    12. }
    Alles anzeigen


    GML-Quellcode

    1. // scr_get_achievement
    2. for (i=0;i<10;i+=1)
    3. {
    4. if (highscore_value(i)==argument0) // falls das Achievement freigeschaltet wurde...
    5. return true; // ...gib true zurück
    6. }
    7. return false; // ansonsten gib false zurück


    Ein kleines Testprogramm:
    Erstelle einen room und ein object, das du in diesem room platzierst. Dem object gibst du zwei key_pressed Events für ENTER und SPACE:

    GML-Quellcode

    1. // key pressed ENTER
    2. scr_set_achievement(get_integer("Welches Achievement freischalten?",0));


    GML-Quellcode

    1. // key pressed SPACE
    2. number=get_integer("Welches Achievent abfragen?",0);
    3. if (scr_get_achievement(number))
    4. {
    5. show_message("Achievement "+string(number)+" wurde freigeschaltet");
    6. }
    7. else
    8. {
    9. show_message("Achievement "+string(number)+" wurde nicht freigeschaltet");
    10. }


    Jetzt kannst du mit ENTER Achievements freischalten und mit SPACE abfragen, ob sie freigeschaltet wurden.

    Ist natürlich relativ beschränkt, wenn man keinen normalen Highscore benutzt und mit 10 Achievements auskommt, ist das jedoch eine billige Methode ohne eigene externe Dateien Achievements zu speichern.
  • Ich danke für die letzten drei Beiträge, das wird mir bestimmt weiterhelfen ;) . Ich kann diese Woche leider noch nichts davon ausprobieren da ich nicht zuhause bin.

    Trotzdem: Ich wollte in meinem Spiel insgesamt 20 Errungenschaften einbauen, deswegen werde ich die geniale Idee von interceptor (danke dafür :D ) leider nicht nutzen. Ich hab nur eine Frage, nämlich wollte ich später das fertige Spiel in das Netz zum freien spielen hineinsetzen. Jetzt frage ich mich nur noch, wenn der gm für die Errungenschaften daten von Speicherorten laden muss, wie klappt es wenn man das Spiel über das Netz spielt. Wie zb bei Yoyogames, also ohne es zu downloaden. Danke im voraus...
  • Wenn du spiele über Yoyogames "online" spielst, dann werden sie dennoch runtergeladen. Irgendwo in die Eigenen Dateien in einem anderen Dateiformat. (Glaub nur der Interpreter fehlt womit das Spiel etwas kleiner ist)
    Externe Dateien werden am selben Ort lokal abgespeichert.
  • Super, ich denke dann kann ich das Thema als erledigt erklären :thumbsup: . Vielen dank an: TrunX, interceptor, MewX, gamer_08 und an The Gamer ;) .

    Falls ich denoch irrgendein Problem haben sollte, werde ich euch einfach erneut fragen. Danke nochmal, und tschüss.