Rundenbasierte Strategiespiele

  • GM 7

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

  • Rundenbasierte Strategiespiele

    Hallo zusammen,
    ich habe vor ein rundenbasiertes Strategiespiel zu erstellen und nehme als Vorbild die "advance wars" reihe.
    dazu habe ich einige ideen und will jetz nach der umsetzbarkeit eure Meinung einholen.
    und habe auch noch einge Punkte wo ich nicht weis wie dass gehen soll
    das sind
    - die Bewegung der Einheiten (welche je nach Einheitentyp verschiedene bewegungsradien haben sollen und je nach terrain langsamer oder garnicht vorankommen sollen)
    - und wie man dass automatisch testen lässt, wenn man eine Einheit zieht ob dann in einem angrenzenden Feld sich eine Einheit befindet , was dann zurfolge hat dass man die Option des angreifens freigeschalten kriegt (nahkampf einheiten)
    - und wie man bei fernkmapf einheiten abfrägt ob sich etwas im angriffradius befindet
    -zusätzlich falls sich jemand mit advance wars auskennt , sind hier automatische schadenberechnungstabellen gerne erwunschen

    bitte keine gespamme und geflame und vielen dank im voraus für eure konstruktiven Vorschläge

    mfg matheass
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]
  • Hui, da hast du dir aber was vorgenommen ^^
    Zunächst mal sei angemerkt, dass so ein komplexes Spiel wie Advance Wars - wo es ja beinahe zahllose Kombinationen von Einheiten und Gelände gibt - mit der Lite-Version des GM und mit stumpfem D&D nicht zu proggen ist - auch mit Pro und GML dauert das sehr lange. Schließlich wurde Advance Wars von einer ganzen Kolonne Programmierer erstellt, ein Einzelprogger tut sich daran schon schwerer. ;)

    Zu deinen Fragen:
    Das grundlegende Bewegungssystem der Einheiten würde ich mit einem Raster lösen, auf dem sie sich bewegen - move_snap() hilft dir da vermutlich weiter.
    Den Bewegungsradius kannst du mit einer eigens definierten Variable einstellen, allerdings weiß ich nicht, wie du die Form des Radius auf dem Raster hinbekommst... *grübel*

    Aber mit der automatischen Schadensberechnung sollte es eigentlich die wenigsten Probleme geben...
    zum Beispiel kannst du sowas machen:

    GML-Quellcode

    1. if effektiv=0 schaden=(angriff-verteidigung)
    2. else schaden=(angriff-verteidigung)*1.2

    was den Schaden ver-1.2-fachen würde, wenn die entsprechende Einheit (z.B. Walze) anfällig gegen eine andere (z.B. Bomber) ist.
    Leider weiß ich nicht, wie das Schadensberechnungssystem von Advance Wars tatsächlich funktioniert, daher wirst du wohl rumprobieren müssen, bis du's getroffen hast - oder du machst ein eigenes, ganz anderes ^^

    Ich hoffe mal, ich konnte dir für den Anfang ein paar Denkanstöße geben. Viel Glück beim Proggen
  • danke für deine ideen

    Es ist erst mal klar dass ich mal mit wenigen einheiten anfangen werde (obwohl ich auch n paar leute habe, zwar alles rookies in sachen gm, und sogar nen sprite designer) also "infanterie, mech , späher , jadgpanzer und artillerie), trotzdem muss das grundgerüst stehen eben "darstellung (null problem da gm eh rasterförmige räume hat), bewegung , schadensberechung)

    das mit dem effektiv deines programmierbeispiels versteh ich net (vllt meinst du dass zb mg gegen panzer keine chance hat)
    auserdem is das mit dem angriff minus vert net so einfach es spielen wie du schon gesgat hast unzählige faktoren eine rolle (terrainang, terrainvert , waffentyp, agrieferlp, vertlp, und der verteidigende einheitentyp)aber ich hab da schon mal formeln zusammengebastelt
    : (1,x * lpa * at)\(1,y * lpv * vt)*z
    wobei 1,x schadensbonus durch deckung des angreifers
    lpa die lp des angreifers
    at der angriffstyp also waffentyp
    1,y deckungsbonus des verteidigers
    lpv lp des verteidigers
    vt die eigens definierte rüstung der einheit gegen den waffentyp
    z spezial schaden wegen gabe oder char

    noch ein groses problem is der rückfeuerschaden der bei 2 nahkampfeinheiten im gefecht auftritt (oder ausnahme "PAK")
    aber da hast du recht das wird nicht das eigentliche problem sondern nur rumprobiere bis es in etwa mit dem original übereinstimmt.

    das mit dem bewegen is zurzeit mein gröstes problem , denn ich kenne mich mit der "waffe" move_snap() und allgemein rastern nicht aus, kenne insgesamt nur die grundscript befehle (vllt hat jmd nen link wo die alle aufgelistet sind) und eben den d&d aus (die allerdings sehr unübersichtlich in ihrer vielzahl werden würden)

    achja nochn problem sinn gaben und kommandatnen mit spezialstärken , also falls jeamnd n gutes konzept "herzaubern" kann is gernen erwünscht
    ansonsten werd ich mich mal net übernehmen und des rauslassen ums net unnötig kompliziert und zeitaufwendig zu machen

    jo jedenfalls brauch ich eben n grundgerüst und hoffe das dank meines bemühens und euren kommentaren bald hinzubekommen

    mfg matheass (an der mathematik und am verständnis mangelts nicht ^^)

    P.S. "Ich hoffe mal, ich konnte dir für den Anfang ein paar Denkanstöße geben" danke dafür , weil ich hab mir gottseidank no überhaupt net n kopf drüber zerbrochen wie ich des auf die reihe bringen soll , ich frag au immer in nem threat nach wie die lösungsformel für quadratische gleichungen lautet wenn ich die gleichung "4 = x^2 " vor mir hab (da gibts wirklich welche) ^^. also nix für ungut, aber des musste ich relativieren.
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Mathe-Ass ()

  • Stichwort : Instanzen

    Die grösste ungelöste Frage die ich grad hab is folgende
    wenn ich mehrere instanzen eines objects habe ,
    wie kann ich ihnen eigene anzahl von lebenspunkten zuweisen ,wobei beim treffer ebn nur der einen instanz etwas abgezogen wird
    und wie kann ich zb die instanz mit der höchsten lebenspunkten herausfinden lassen
    - und wie lautet der befhel in gml um eine instanz eines objekts zu erstellen und die ganzen anderen draganddrop befehle für gml und nicht das visual

    glaubt mir ich habe genügend danach gegooglet aber kann nichts finden was meinen fragen entspricht,

    mfg matheass
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]
  • Gib der Instanz eine Variable, namens lp (=Lebenspunkte) oder so. Und wenn diese angegriffen wird, ziehst du nur der lp ab (other.lp-=10 zum Beispiel).

    Zu der zweiten Frage entnehm ich einen Code aus der Hilfe, den ich ein wenig abändere:

    Lass mich ein Beispiel geben. Angenommen jede Einheit in deinem Spiel hat ein bestimmte Anzahl an Lebenspunkten und du willst die mit den meisten ermitteln - verwende folgenden Programmcode:

    GML-Quellcode

    1. {
    2. var maxid,maxlp;
    3. maxid = -1;
    4. maxlp = 0;
    5. for (i=0; i<instance_count; i+=1)
    6. {
    7. iii = instance_id[i];
    8. if (iii.object_index == unit)
    9. {
    10. if (iii.lp > maxlp)
    11. {maxid = iii; maxlp = iii.lp;}
    12. }
    13. }
    14. }
    Alles anzeigen

    Nach der Schleife enthält maxid die id der Instanz mit den meisten lp. (Vernichte keine Instanzen während eines solchen Schleifendurchlaufs, weil sie automatisch aus dem Array genommen werden und als Folge wirst du Instanzen überspringen).


    gml zum erstellen einer Instanz ist "instance_create(x,y,obj)" falls das deine Frage war.

    Ich hoffe ich konnte dir helfen ;)
  • Hi, hoffe du wertest das jetzt nicht als Spam aber was die Umsetzbarkeit angeht: Ja es ist definitiv umsetzbar!
    Ich selbst arbeite jetzt seit ca 1,5 Jahren an meinem rundenbasierendem Spiel.
    Es weicht allerdings stark von der Advance War / Battle Isle Reihe ab weshalb ich dich da nicht als Konkurenz einschätze.
    Ich weiß nicht wie deine Geduld, Zielstrebigkeit und Selbsteinschätzung dahingehend ist oder ob du vielleicht nur besser oder erfahrener als Programmierer bist als ich es bin, aber mit einer Entwicklungszeit von 1-2 Jahren musst du schon rechnen... achja und den einen Tipp gebe ich dir noch... benenne alle Objekte und alle Sprite genau so wie du sie am Anfang haben willst, mache nicht den Fehler und belasse es erstmal bei Sprite0465 und Object0506 denn du wirst dich für den Rest deines Lebens dafür hassen wenn du in die "Überarbeitungsphase" deines Spiels kommst...
    Ach ja... und fast 70% hat man nachher auf irgendwelchen vollgekritzelten Collegblöcken und nicht im GML-Code.
    Soviel zu meinen Erfahrungen, wünsche dir dabei schon mal im Voraus viel Glück, Erfolg und vorallem Geduld ;)
  • @superdaniel
    der code kann shcon stimmen aber da ih den warscheinlich nie genau so ins spiel einbauen kann
    ist das problem dass ich ihn verändern muss , und wie soll das gehen wenn ih nicht genau verstehe was im code passiert
    da fehlen immer die legenden ^^
    und das mit leben meinst du so oder

    GML-Quellcode

    1. {
    2. var lp;
    3. lp = 100 ;
    4. //wenn sie kämpft zb
    5. lp -= 10 ;
    6. if lp == 0 destroy_instance; //frage is blos ob da nach instanz noch iwelche parameter stehen müssen oder ob die instanz zerstört wird
    7. //und ist hier eine else notwendig , falls ja was muss ich machen dass dbei nichts passiert



    @jokohono
    jaah mit den blöcken könntest du recht haben ^^ da hab ich jetz schon genügend

    die sprites hamm bei mir alle einheitennamen_corpsabkürzung32(anzahlderpixel(vom sprite erstellen her übernommen weil verschidene formate))spr
    also zb recon_os32spr
    das gleiche mit den obj
    falls du das meinst

    bei der entwicklungszeit denke ich aber dass ich den prototyp in 1-2 monaten hinbringe,
    dann kommen halt noch bessere sounds (die ich warschienlich abkopier ^^), viel mehr einheiten,kommandanten mit spezialfähigkeiten und "gaben"
    auserdem muss es ja nicht eine komplette kopie von adavance wars oder battle isle sein, sonst kann man ja gleich das zocken XD

    mfg matheass
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]
  • Ressourcen-Namen: Im GMschen Raum ist es Standard "spr_blabla32" zu schreiben, manche nehmen auch "sprBlabla32". Naja, es ist dein Ding ;)

    Der Script: Ist nicht ganz richtig:

    GML-Quellcode

    1. if (lp <= 0) {instance_destroy();}

    Die Klammern ( () und {} ) sind optional, aber mit ihnen kann man besser erkennen, was wohin gehört.
    instance_destroy() ist eine Funktion, die Klammern müssen da auf jeden Fall hin, auch wenn es keine Argumente hat.
    Angenommen du hast 10 lp, dir zieht jemand 15 ab, dann hast du -5 lp. Die Abfrage würde nicht eintreffen.
    Also statt == (gleich) nimmst du <= (kleiner gleich).
  • @copyboy
    ja is richtig des mit negativen lp hab ich übersehen, danke dafür

    naja ich hab jetz ,zt durch eure hilfe, einige probleme gelöst
    dafür tun sich neue auf
    -also ich möchte machen dass man am anfang der runde pro stadt, base, flughafen ,hafen und headquarters 1000geldeinheiten bekommt
    als geld nehm ich einfach die punkte die man ganz leicht durch die score leiste anzeigen lassen kann (da man in diesem spiel eh keinen score braucht)
    wie kann ich jetz die anzahl der instanzen meiner corpsfarbe (rot) durchzählen lassen
    die instanzen der objekte die durchzuzählen sind : city_os32obj, das gleiche mit vorn dran anstatt city mit base, port, airport, hq

    und ist es richtig wenn ich

    GML-Quellcode

    1. {
    2. var x;
    3. x = x+18000; // gibts hier dann nen error oder verändert es das vorherige x indem er 1mal 18000 dazuzählt ?
    4. }


    noch ein problem: also ich hab nen objekt cursor, die basis und die zu erstellende einheit
    des problem is dass es geht dass mehrere objekte auf dem gleichen feld stehen was nicht sein darf (immer nur eine einheit pro feld)
    zu beheben wäre das indem ich die einheiten alle solid true mache und eine bedingung dass neue einheit nur gebaut werden kann wenn die basis kein collicison mit einer soliden einheit hat
    das problem is dass ich die einheit nicht mehr anklicken kann weil der cursor hat den befehl step towards mouse_x mouse_y und stopt nur bei soliden objekten, da die auf der basis stehende einheit solide ist kann ich sie nicht mehr anklciken ,
    wie kann ich das umgehen?

    mfg matheass
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mathe-Ass ()

  • Also, die Sache mit dem Geld pro Runde:

    GML-Quellcode

    1. with (city_os32obj) { // Mit jedem "city_os32obj"-Objekt
    2. score += 1000; // Erhöhe score um 1000.
    3. }

    x = x+18000; geht ohne Probleme. Da du aber x als var vorangestellt hast, könnte es Probleme geben. var bedeutet, dass die genannte(n) Variable(n) nur für den Script gelten, und nicht darüber hinaus. Andere locale Variablen werden dabei ignoriert, funktionieren aber danach weiter wie normal. Da x (noch) keinen Wert hat, kannst du zu ihm auch nichts dazuzählen.

    Cursor:
    Versuchs mal mit Jump to a given position :D
  • jah auf das mit jumptoagivenposition bin ich selber gekommen ;)
    und danke für die with-construction

    es is nur so ich bin ziemlicher anfänger und verstehe die zusammenhänge der variablen, also ob global oder nur für objekt bzw instanz nict wirklich
    zudem kommt bei mir immer ein fehler "unknown variable blblabla at blablabla"
    hab mir des komplette tut durchgelesen sowie gröstenteils die hilfe die ja einige seiten enthält
    aber darauf habe ich nicht wirklich eine antwort gefunden
    hätte gerne eine ^^

    ich hoffe ich ärgere euch mit solchen "dummen" fragen nicht aber ich bin auch nur ein mensch und auch google hat seine grenzen

    mfg matheass

    [Zusammengeschoben durch CAS]

    so hab jetz alles auser bewegung und kampf(schadensberechnungen)
    also zum thema bewegung
    ich habe also verschiedene einheitentypen
    welche pro runde eine bestimmte anzahl von feldern fahren können (je nach einheitentyp) sollen
    also zum punkt : hat jemand ne idee wie man
    auswählen lassen kann auf welches feld man möchte und welchen weg durch andere felder man dadurch zurücklegt
    und wie man dann abzählen lassen kann dass zb schon die 6 felder gefahren worden sind und jetz nichts mehr geht
    (falls das unklar formuliert ist ,lasst es mich bitte wissen)

    (falls jemand obiges nicht gelesen hat , es soll rundenbasiert sein, also eben dass der spieler immer nur 1einheit auf einmal kontrollieren kann und immer nur 1 spieler an der reihe ist)

    und immer noch: wie definiert man diese globalen und lokalen variablen sicher , weil 1mal klappts , 1mal nicht -.- (unknown variable error)

    mfg matheass
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]
  • Mach dir ein Raster (oder stells dir vor, egal). Hmm, is doch net so einfach. So hier mal die billige Methode. Mach dir für jedes Rasterteil eine Instance (die unsichtbar ist) nun du willst zu einer Position... collision_line mit mouse_x|y (moment, vorher noch mit instance_nearest abchecken wo das näheste raster obj ist und die x|y Werte auf die Mitte des Rasters zuschneiden)und dem derzeitigen RAsterpunkt wo die Einheit ist. So wichtig ist, dass du das ganze mit with (obj_raster) machst damit jede zelle und nicht nur die letzte gefunden wird. Dann speicherst du alle ids der zellen in einem array (am besten machst du das ganze mit einer for schleife und gibst wenn es eine kollision gibt die id in das nächste array von zb raster_auf_linie[x])und fragst ab wie viele bew. punkte noch übrig sind und gehst zum entsprechenden rasterpunkt. (Schau einfach nach welche entfernung die jeweilige id hat mit point_direction...mit dem richtigen umgang von floor, ceil und round müsstes du mit der for schleife herausfinden können welche id die richtige ist)
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • @trompadon

    mhm mag alles richtig sein, aber so wirklich kapiert hab ichs nicht an allen ecken
    zudem ist des äuserts unpraktisch weil ich
    1. jedes feld mit dem objekt "zuspammen" muss und dass bei grossen karten lange dauert
    2. auserdem zerstört mir das das gameplay weil bei dem bau einer einheit abgecheckt wird ob sich ein objekt darauf befindet und die enhet nur ertellt wird wenn nicht

    und wie kann ich bei deiner methode auswählen üer welche felder es sich zum zielfeld bewegt?

    mfg matheass
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]
  • Das ist bei größeren Maps natürlich ein Problem, da sag ich mal einfach instance_deactivate_region...
    Ich weiß das die Lösung auf jeden Fall nicht die einfachste ist, und bei größerer Entfernung falsche Ergebnisse bringen wird (zwischen Einheit und Mauszeiger), ich hoffe das müsste aber trotzdem klappen.
    Hier mal ein Bild von meiner Idee:

    trompadon.bplaced.net/media/Raster.jpg
    Zuerst wird geprüft zu welchem Rasterteil die Maus am nähesten ist, und dann von diesem die mittelpunkt koord. genützt.
    So jedes Rasterobjekt wird nun mit with abgefragt ob es mit der Linie kolidiert (die zwischen zu bewegenden Obj und den vorher ausgerechneten zu der Maus nähesten Mittelpunktkoordinaten liegt), wenn ja wird die id in einem nächsten array abgespeichert.
    Nun musst du nur noch mit einer Variable wissen wie weit sich das Obj bewegen kann. Als nächstes sortierst du die Ids so das die nächste (von Abstand her) im ersten Array liegt und die weit enfernteste im letzten. Jetzt kannst du mit der Varible wie weit sie noch gehen kann den richtigen array aussuchen.
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Trompadon ()

  • EDIT: in meinem spiel soll es möglich sein feindlcihe oder neutrale stützpunkte mit infanterie und mech zu besetzen
    und zwar sollen zum besetzen 20 punkte gebraucht werden(wie bei advance wars)
    und pro runde sollen punkte in höhe der noch vorhandenen lp der besetzenden inafnterie/mech von den 20 abgezogen werden
    wenn punkte <= o wird die instanz des stützpunkt in die farbe des besetzter corps geändert

    wie also stell ich es an dass nicht immer ein fester wert abgezogen wird , sondern die anzahl der lp der infanterie ?
    und wie zeigt man die anzahl der noch runterzubesetzenden punkten am besten an ohne für jeden punkt einen eigenen sprite zu erstellen ?

    mfg matheass
    Wir sollten nie vergessen, dass wir Menschen nur Werkzeuge für die
    Software sind, damit sich diese verbreiten kann.
    [Thomas Steffen]

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Mathe-Ass ()