Civ-Clone: Karte erstellen?

  • Civ-Clone: Karte erstellen?

    Hallo,

    ich möchte ein Spiel programmieren, dass dem guten alten Civilization ähnelt :)

    Mir fehlt dabei eine gute Methode, um eine Karte (bestehend aus mehreren unterschiedlichen Landschaftsquadraten) zu erstellen.

    Ich möchte:

    1. Das die Einheit, die bewegt wird, erkennt auf welchem Terraintyp sie ist (wg Bewegungskosten u. ä.).

    Muss ich dazu alle Landschaftsquadrate als Objekte einfügen, oder gehts (wegen Rechenaufwand) auch anders? Wäre ja ein bischen viel, Die Karte aus mindestens 500 x 500 Objekten zusammenzusetzen.

    Wenn ich Tiles nehme, kann ich die Einheit doch nicht abfragen lassen, auf welcher Art Tile (Wüste,Wald, ect...) sie gerade steht, oder?



    2. Das Programm soll per Zufallsmodus eine Karte (Spielwelt) generieren. Jemand eine gute Idee???



    Schonmal vielen Dank!

    Casi82
  • zu 2: ich hab mal einen RandomWorldMap Generator geschrieben, hab jetzt leider keinen Zugriff darauf; da du aber ohnehin selber programmieren sollst, ist das ja kein Problem:

    hier das Gundprinzip:

    - die Karte ist ein 2-Dimensionales Array
    - Für jeden Landschaftstyp werden Wahrscheinlichkeiten definert, dass ein anderer Landschaftstyp angrenzt (z.B.: Neben einem Waldfeld ist mit 80%iger wahrscheinlichkeit noch ein Waldfeld mit 15%iger Wahrscheinlickeit Wiese und mit 5%iger Wahrscheinlichkeit Wasser)
    - ein erstes Feld wird zufällig gesetzt (optional auch mehrerer, Falls, z.B. der Rand komplett aus Wasser bestehen soll)
    - danach werden alle Felder durchgegangen und die Wahrscheinlichkeiten der jeweilgen Nachbarfelder kumuliert. Basierend auf den kumulierten Wahrscheinlichkeiten wird dann zufällig ein Landschaftstyp für das jeweilge Feld gewählt.
    - wenn alle Felder durch sind ist die Karte fertig.

    Vorteile dieser Methoe:
    Es können realitische Landschaften entstehen, z.B. Gebirgketten, Kontinente, Flüsse, Meere
    Nachteile:
    Bis man ein gescheites Ergebnis hinbekommt, ist bei der Auswahl der Wahrscheinlichkeiten viel Finetunig angesagt (n hoch 2 Wahrscheinlichkeiten müssen definiert werden, wobei n die Anzahl der Landschaftstypen ist)

    zu 1:
    Wenn du die oben beschriebene Methode verwendest kannst du bei der Wahrscheinlichkeitsdefinition auch gleich die Bewegunskosten für jedes Terrainfeld setzen. Darstellung geht dann über Tiles und Typabfrage über das Karten-Array.

    ps: Willkommen in der Domäne!
    www.glowingorb.de
    „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

    (Schachweltmeister Emanuel Lasker)
  • zu 1:

    Einma gibts die methode die karte so zu machen wie das schon Glow gesagt hat;

    Ich würds natürlich ganz umständlich machen und die karte in ein bild speichern xD // screen_save_part(fname,x,y,w,h) dann wieder als sprite laden etc.

    aber einfacher wäre es wenn du die feld typen in nen array packst und dann immer nach lädt wenn ein feld nicht aktiv ist(wenn du ernsthaaft 500x500 instancen zu nehmen wirst du nicht spielen können xD )

    Wenn ich Tiles nehme, kann ich die Einheit doch nicht abfragen lassen, auf welcher Art Tile (Wüste,Wald, ect...) sie gerade steht, oder?

    Das ist soweit ich weiß falsch ; )

    es gibt verschiedene methoden die Feldfarbe zu erkennen und daraus wiederum den feld typen(wobei man natürlich dann 2 feldern nicht die gleiche farbe geben kann)

    Wenn du jetzt ein 24x24 Tile hast machst du ganz oben links also dem pixel 0x0 einen pixel in einer farbe die kein anderes feld hat dannach benutzt du die draw_getpixel(x,y) <- glaub so hieß die ...
    und fragst einfach jenachdem welches feld du hast den pixel ab also:

    GML-Quellcode

    1. emo = draw_getpixel(x,y)
    2. if(emo = green) //ok war jetz faul *g*
    3. {feldtyp = graß}


    /////////////////////////////////////(alle tiles haben oben links einen kaum sehbaren farbigen punkt! abgesehn vom hintergrund )

    ///////Zur veranschaulichung Jedes Tile hat seine eigene Farbe Rot,orange,Gelb Suche ich nun nach nem tile typ such ich mit get_pixel einfach diese 3 farben ab\\\\\\\\\\\\\\\\

    Man muss bedenken wenn das abgefragte tile von nem zu großen Gegenstand überdeckt ist funktioniert das nichtmehr!

    //ADD:
    Falls dir die Get pixel funktion zu lahm ist gibts hier auch nee DLL: gmc.yoyogames.com/index.php?showtopic=294911

    EDIT:
    draw_getpixel(x,y) war die funktion ; ergäntzt!

    gm-d.de/help/405_04_shapes.html <- dort ganz runter scrollen

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

  • Tobi schrieb:

    GML-Quellcode

    1. emo = draw_getpixel(x,y)(POSx,POSy)
    Ich glaub da hätte das hingemusst ^^ :

    GML-Quellcode

    1. emo = draw_getpixel(POSx,POSy)

    oder

    GML-Quellcode

    1. emo = draw_getpixel(x,y)


    (entweder...oder... nicht beides...)


    Beides richtig und falsch xD

    x und y sind natürlich zu ergänzen mit den jeweiligen Tilegrösse * Feld

    Spoiler anzeigen
    Dieses Thema ist sehr verwierrend schon allein deswegen weil Ich die genaue Tile grösse nicht weiß und allein aus dem grund das ich zu faul bin sowas zu machn keine spiele entwerfe abgesehn von statischen Tools und TD(Turret Defence) Games x'D

    ^ meine meinung
  • Man sollte die Datenhaltung von der Graphischen Darstellung ändern, also finger weg von getPixel, denn das ist langsam (was in diesem fall aber nicht weiter tragisch ist), aber vor allen dingen macht es spätere änderungen von Graphiken nur umständlich. Außerdem: Stell dir vor du speicherst deine Sprites/Tiles extern, dan kann jeder einfach durch ändern der Farbe die Spiellogik ziemlich kaputtmachen.
    @benny: ich bezweifle dass man deinen einzelnen Pixel als Spieler nicht sieht. Ich habe auf meinem Laptop genau einen Pixelfehler und den seh ich ziemlich gut
    www.glowingorb.de
    „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

    (Schachweltmeister Emanuel Lasker)
  • Glowing Orb schrieb:

    Man sollte die Datenhaltung von der Graphischen Darstellung ändern, also finger weg von getPixel, denn das ist langsam (was in diesem fall aber nicht weiter tragisch ist), aber vor allen dingen macht es spätere änderungen von Graphiken nur umständlich. Außerdem: Stell dir vor du speicherst deine Sprites/Tiles extern, dan kann jeder einfach durch ändern der Farbe die Spiellogik ziemlich kaputtmachen.
    @benny: ich bezweifle dass man deinen einzelnen Pixel als Spieler nicht sieht. Ich habe auf meinem Laptop genau einen Pixelfehler und den seh ich ziemlich gut


    Das weiß ich alles schon ; )
    Aber es war nur zur veranschaulichung die richtrigen Pixel Farben kann man schliesslich am ende anpassen

    Das mit getpixel ist lahm weiß ich acuh wenn du meinen ersten post gelesen hast und ganz unten warst steht da nee DLL die ist wesentlich schneller + sie kann ebenfalls flächen abfragen;

    Siehe:
    //ADD:
    Falls dir die Get pixel funktion zu lahm ist gibts hier auch nee DLL: gmc.yoyogames.com/index.php?showtopic=294911
  • Ich bezweifle ja nicht, dass sie schneller ist als die getpixel Funtion des Gamemakers (alles ist schneller als Pixelmanipulierende Funktionen des GMs). ICh kann mir nur nicht vorstellen, dass sie schneller sein soll als ein Array-Zugriff. (und Arbeit spart man sich dadurch ja auch nicht)
    www.glowingorb.de
    „Wenn es im Universum noch irgendwo intelligente Lebewesen gibt, dann kennen sie vielleicht Schach, höchstwahrscheinlich jedoch GO

    (Schachweltmeister Emanuel Lasker)
  • Man hat die Information welche tiles wo sind schon.

    Ohne die kann keine tilemap angezeigt werden.

    Man muss nicht noch mit einer langsamen Funktion oder dll prüfen, auf welchem Feld die Einheit steht.

    Das kann man mit der Position der Einheit und der Tilegröße ausrechnen.
  • Man könnte auch ein 2tes Progrämchen machen bei dem man eine art Gitter hat und die karte erstellt
    diese zahlen und daten von der map lässt man dann in nen vllt eigenen Dateityp einlesen.(Ini wäre gut aber bei mehr als 30x30 tiles dauerts scho seine sekunden sind dann ja 900*3 tiles die gelesen werdn müssn x'D)
    //Vorteilhaft ist es bei nem eigenen datei typ in der ersten reihe die grösse zu haben z.b. 30x30 Tiles das wäre dann 900(im programm einfach die wurzel ziehn. ; ))
    Dannach kommen die zahlen und der Typ man kann entweder jede reihe 1 tile oder ununterbrochen arbeiten wird aber falls man sie per hand editieren will unübersichtlicher
    BSP Datei:
    900 30 30 //900 tiles in einem raster von 30 x 30
    0 0 1 //zelle 0,0 Terraintyp 1
    0 1 1 //zelle 0,1 TP 1
    0 2 1 // ''
    ...

    Auslesen kannst du ihn mit den spezielen string funktionen die du dir am besten selber ansiehst ; ) (du kannst wenn du nee durchgehende reihe hast extrem viel speicher saren so c.a. 20-30% und du darfst in nem eigenen dateityp keine kommands machn wie ich ausser du proggst dir dafür nen Code)



    Kleine hilfe: Achte unbedingt darauf das du einen string nicht plötzlich als reele zahl verwendest der fehler hat mir nee woche arbeit gekostet xD


    MfG