Tileset/Map problem

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

  • Tileset/Map problem

    Heyho ;)

    also ich hab derzeit ein Problem. Unzwar will ich einen Leveleditor und das passende Spiel machen. Aber die Map ist 4000 * 4000 groß und die tilesets sind 16 * 16 groß. Wenn ich nun die Tilesets als objekte nehmen würde dann ist schnell mit der geschwindigkeit schluss. Deswegen gleich die erste frage : kann man die Objekte die nicht sichtbar sind komplett abschalten oder aus dem speicher oder sowas nehmen damit das ganze schneller abläuft und dann wieder einschalten wenn sie im sichtbaren bereich sind ?
    Die nächste frage wäre : Wenn ich die Tilesets als Backgrounds hernehmen würde, gibt es eine möglichkeit direkt eine Kollision mit diesem hintergrund abzufragen ?

    hoffe es weiss einer rat :D


    EDIT: Habs grad selber rausgefunden.. mehr oder weniger per zufall *freuhupf* .. die lösung steht in der Gamermaker hilfe :D
    hier :

    GML-Quellcode

    1. {
    2. instance_activate_all();
    3. instance_deactivate_region(view_xview[0],view_yview[0],
    4. view_wview[0],view_hview[0],false,true);
    5. }

    da :)


    EDIT EDIT: Ok.. doch nocht nicht ganz.. also ich habs hinbekommen das alles deaktiviert wird was nicht im bereich ist.. aber eigentlich müsste doch theoretisch konstant mit der gleichen geschwindigkeit laufen wenn auch neue objekte erstellt werden die ausserhalb sind... oder zählt er irgendwie die deaktivierten objekte ausserhalb mit ? weil bei mir geht die fps dann doch wieder nach unten obwohl er nur die zählt die in dem sichtbaren feld sind... es gibt 62 500 felder.. davon sieht man immer nur maximal 1875 felder im sichtbaren bereich.. naja wie gesagt es geht alles super flüssig.. nur wenn die anzahl gigantisch annimmt dann wirds irgendwie langsamer :-/

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

  • Teste mal, ob es was verbessert, wenn du alles deaktivierst und nur das innerhalb des Views aktivierst.
    Wenn das auch nichts bringt, dann musst du schauen, wie weit der View innerhalb eines Steps verschoben werden kann. Damit kann man das evtl. so einfädeln, das z.B. am Anfang alles deaktiviert wird und nur das sichtbare aktiviert wird, und danach immer so im Bereich des Views links, rechts, oben und unten, alles wieder deaktiviert wird und innerhalb des Views wieder aktiviert wird. Macht in der Masse dann weniger Objekte, die verarbeitet werden müssen.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • ich würde den code "umdrehen". am anfang und wärend des spiels alles deaktivieren und nur die objecte in der view deaktivieren.
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Ich mach es immer so:

    GML-Quellcode

    1. instance_deactivate_all(true)
    2. // Hier werden z.B. noch wichtige Objekte aktiviert, falls sie auch außerhalb der View benutzt werden..
    3. instance_activate_region(view_xview-300,view_yview-300,1024+600,768+600,true)


    So müsste es richtig sein ;)

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

  • in deinem beispiel werden ja gar keine tiles verwendet. in deinem beispiel willst du 62500 objecte nur für den hintergrund verwenden. tiles gibt es deswegen, weil so viele objecte den game maker extrem langsam machen. das ist aber kein problem des game makers, sondern einfach ein rechnerisches problem. es gibt kaum eine engine/progsprache die so viele "iobjecte" abhandeln kann ohne preformance einzubüßen.
    ich würde in deinem beispiel einfach tiels verwenden und wenn benötigt, eine kollision mit der jeweiligen tile id abfragen. die tile id ist immer eine zahl ab 10000000. jedes tile im raum bekommt eine solche id mit aufsteigendem wert. dann kannst du mit dem befehl tile_layer_find(depth,x,y) das entsprechende tile auf dem entsprechenden layer abfragen. das sollte auch mit mehr als 62500 tiles funktionieren.

    hinweis nebenbei:
    weiterhin ist es etwas ungünstig einen hintergrund mit den maßen 100x100 pixel zu verwenden. zwar spielt das bei einem hintegrund nicht so die rolle, aber ein solcher hintergrund wird ungünstig in den grafikspeicher geladen. images, backgrounds etc. sollten maße besitzen, die ein vielfaches von 8 (o.ä.) sind. man kann sich den grafikspeicher wie ein großes bild vorstellen und die maße des bildes sind immer durch 8 teilbar. verwendet man nun nur 100x100 pixel große grafiken, werden diese immer nebeneinander in den speicher gepackt, bis dieser voll ist. bei 100x100 pixel grafiken bleibt rechts und unten ein rand, der nicht mehr verwendet werden kann.
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • danke win.. so ganz bekomm ichs mit den tilesets nicht hin.. wie sieht denn exakt der code aus wenn ich eine kollision mit den tilesets abfragen will ? :)


    und das mit dem hintergrund.. ich weiss schon ;) war nur kurz zum testen ganz fix gemacht.. die grafiken da sind alle nur platzhalter :) hab sie schnell ausgewechselt :D

    gibts eigentlich auch eine möglichkeit tilesets per code zu erstellen ? :)
    evtl. mit dem ?

    GML-Quellcode

    1. tile_add
  • den code für eine "kollision" (ist dann ja was anbderes als die eingendliche kollision) müsste ich auch erst basteln. kann mal sehen ob ich da morgen was zusammentipseln kann.

    mehr über tiles und die codes zu ihrer kontrolle erfährst du z.B.: hier
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • hab da mal ein beispiel zusammengebastelt. die tileerstellung ist etwas grottig, aber darauf kommt es ja auch nicht an.
    die tile ID wird oben links angezeigt. diese könnte man z.b. in ein array laden und dann vergleichen, auf was für einem tile der player steht.
    Dateien
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Sooooo nach einiger Pause, viel rumprobieren und ein paar Haaren weniger, hab ich eine Methode gefunden die funktioniert.. naja fast ;)

    also ich hab die surface methode benutzt.. unzwar zeichnet er das ganze in ein anderes objekt einfach rein..

    Quellcode

    1. //argument0: x-position of sprite, which is added to landscape
    2. //argument1: y-position ...
    3. //argument2: index of sprite
    4. var _width,_height;
    5. _width=sprite_get_width(global.landscape);
    6. _height=sprite_get_height(global.landscape);
    7. surface_create(4000,4000)
    8. surface_set_target(0)
    9. draw_rectangle_color(0,0,_width,_height,make_color_rgb(64,128,0),make_color_rgb(64,128,0),make_color_rgb(64,128,0),make_color_rgb(64,128,0),0);
    10. draw_sprite(global.landscape,-1,0,0);
    11. draw_sprite(argument2,0,argument0,argument1);
    12. sprite_delete(global.landscape);
    13. global.landscape=sprite_create_from_surface(0,0,0,4000,4000,true,true,false,false,0,0);
    14. obj_landscape.sprite_index=global.landscape;
    15. surface_reset_target()
    16. surface_free(0)
    Alles anzeigen


    das Script stammt von einem Tutorial hier ausm Forum..
    also.. meine Karte ist 4000 * 4000 groß.. genauso wie das objekt ;) jaja ich weiss riesig.. ich hätte das ganze gerne kleiner gemacht bzw. so gesplittet... aber haut nicht so hin... denn wenn er ein objekt reinsetzt braucht er logischweise ne ganze ecke bis der das richtig reingeladen hat :-/ und das wäre sehr ungünstig für einen leveleditor...

    hier nochmal ein bild wie ich es jetzt mach ;) vielleicht hilft das etwas...



    und der code.. sagt meist eh mehr als tausend worte ;)
    Beispielcode / Surface Landschaft
    ah hab ganz vergessen.. das müsst ihr auch laden und in den gleichen ordner packen :D
    BITTE AUCH LADEN !

    mit der taste enter könnt ihr ein tileset setzen und mit P könnt ihr scrollen.. ;) einfach probieren, dann wisst ihr schon was ich mein :D

    ps : danke win für die hilfe ;) hab das vergessen zu sagen :D .. sry

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

  • Wie wärs, wenn Du die Objekte erst und nur dann erstellst wenn sie gebraucht werden - bzw. sie wieder löschtst wenn nicht mehr? Klingt vielleicht erst kompliziert, ist aber eine Erleichterung, zumal Dein Level dann noch viel größer (als 4000x4000) sein kann, der Room aber nur einen Bildschirm groß sein muß.
  • mh.. @melancor ich kann dir nur so halb folgen.. :-/ kannst die datei modifizieren die ich hochgeladen habe ? bilder & code sagt mehr als tausend worte *g* .. wäre super :D

    edit: ok habs schon kapiert wie du das meintest ;) .. das würde aber bedeuten ich müsste immer wieder zeugs reinladen und löschen wenn sich der spieler bewegt aus der map datei .. seh ich das richtig ? muss doch auch einen eleganteren weg geben -.- irgendwie mit directdraw meinte mein bruder :-/ args.. muss doch noch einen geben der so ein problem hat :-/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von darulaz ()