GM Studio: Fog of War Tutorial / Surface Frage

  • GM 8

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

  • GM Studio: Fog of War Tutorial / Surface Frage

    Guten Tag liebe Community,

    ich bin zwar schon in AS3 und C# / c++ erfahren, jedoch relativ neu in GML (erst seit wenigen Monaten).

    Für mein aktuelles Spiel bin ich auf folgende Seite gestoßen: marineman215.awardspace.com/gm61examples.htm
    Dort habe ich mir das Example für "Best Fog of War" angeschaut und möchte nun gerne mein Spiel etwas weniger dunkel gestalten. Dafür ist es jedoch notwendig, ein Sprite hinzuzufügen oder die Farbe auf Grau zu ändern.
    Jeder Versuch, den ich unternehme, scheitert, da dieser eine Transparenzänderung zum Ergebnis bringt. Ich möchte, dass der Fog of War genau so dicht ist, wie im schwarzen Bereich, nur eben mit einer Textur oder zumindest grauer Farbe, statt schwarz.
    Ich dachte, ich hätte das mit den Surfaces raus, aber offenbar ist das ganze noch nicht 100%ig.

    Ich wäre euch riesig dankbar, wenn ihr mir hier weiter helfen könntet!

    Vielen Dank im Voraus!

    Mischaal
  • also möchtest du z.B. eine farbige oder schwarze nacht haben?
    ja?
    Spoiler anzeigen
    wenn ja dann mach ein sprite das viereckig ist und schreibe das ins draw event:
    ungetestet:

    GML-Quellcode

    1. draw_sprite_ext(sprite_index,false,x,y,view_width*2,view_height*2,false,c_black,0.7)

    c_black ist hier bei die farbe schwarz die du als (z.B.) nacht haben willst
    es gibt diese farben:
    c_aqua
    c_black
    c_blue
    c_dkgray
    c_fuchsia
    c_gray
    c_green
    c_lime
    c_ltgray
    c_maroon
    c_navy
    c_olive
    c_purple
    c_red
    c_silver
    c_teal
    c_white
    c_yellow

    ich hoffe die mühe hat sich gelohnt ^^
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Die Wolkendecke soll nichts weiter sein, als eine reine Textur. Praktisch der Fog of War, wie in dem Beispiel, nur mit einer Textur versehen.
    Dabei soll die Textur natürlich an der Stelle unsichtbar sein, wie beim fog of War. Dies würde sich ergeben, wenn ich eine Textur über das Surface legen würde. Mein Problem ist allerdings, dass, wenn ich das mache, das Surface transparent wird, was den Fog of War natürlich unsinnig machen würde.
  • Alle Teile sind rechteckig. Mockup ist in dieser Situation schwierig.
    Der Fog of War funktioniert, indem ein Surface aufgelöst wird an der Stelle, an der eine Einheit läuft. Außerdem gibt es eine zweite Fog of War schicht. Diese soll so bleiben wie sie ist.
    Man kann es sich so vorstellen:
    Die obere Fog of War Schicht sind Gebiete, die nicht erkundet wurden, die Schicht darunter ist die Schicht, die gerade nicht im Sichtradius des Spielers ist. Die unterste Ebene ist die Spielwelt, an dieser Stelle wird kein Fog of War gezeichnet.

    Hierfür gibt es folgende Scripts:

    FOW_CREATE (Also einmalig):

    GML-Quellcode

    1. //FOW_create()
    2. //argument0=ambient colour
    3. //argument1=intensity after its been walked through
    4. //argument2=quality (1 is the hightest quality..2.3.4.5.6.infinity)
    5. global.FOW_alpha = argument1;
    6. global.FOW_quality = argument2;
    7. global.FOW_surface = surface_create(ceil(room_width/argument2),ceil(room_height/argument2));
    8. global.FOW_surface2 = surface_create(view_wview,view_hview);
    9. surface_set_target(global.FOW_surface);
    10. draw_set_blend_mode_ext(bm_src_alpha,bm_zero);
    11. //draw_clear(argument0);
    12. //draw_clear_alpha(c_white, 1);
    13. surface_reset_target();
    Alles anzeigen


    FOW_UPDATE:

    GML-Quellcode

    1. //FOW_update()
    2. //argument0=light casters (units)
    3. //static 'walked through' surface
    4. surface_set_target(global.FOW_surface);
    5. draw_set_blend_mode_ext(bm_src_alpha,bm_inv_src_color);
    6. with(argument0)
    7. {
    8. draw_sprite_ext(FOW_sprite,FOW_image,x/global.FOW_quality,y/global.FOW_quality,FOW_xscale/global.FOW_quality,FOW_yscale/global.FOW_quality,FOW_angle,FOW_colour,global.FOW_alpha);
    9. }
    10. //dynamic lighting surface
    11. surface_set_target(global.FOW_surface2);
    12. draw_set_blend_mode(bm_normal);
    13. draw_surface_ext(global.FOW_surface,-view_xview,-view_yview,global.FOW_quality,global.FOW_quality,0,c_white,1);
    14. draw_set_blend_mode(bm_add);
    15. with(argument0)
    16. {
    17. draw_sprite_ext(FOW_sprite,FOW_image,x-view_xview,y-view_yview,FOW_xscale,FOW_yscale,FOW_angle,FOW_colour,1);
    18. }
    19. draw_set_blend_mode(bm_normal);
    20. surface_reset_target();
    Alles anzeigen


    FOW_DRAW:

    GML-Quellcode

    1. //FOW_draw()
    2. draw_set_blend_mode_ext(bm_dest_color,bm_zero);
    3. draw_surface_ext(global.FOW_surface, 0, 0,global.FOW_quality,global.FOW_quality,0,c_white,1);
    4. draw_surface(global.FOW_surface2, view_xview, view_yview);
    5. draw_set_blend_mode(bm_normal);


    Mein Problem hier ist, dass ich einfach eine Textur mit Wolken einfügen will (sagen wir einfach mal, sie ist so groß wie der Bildschirm), die auf dem Surface gezeichnet wird und sich so wie der FOW verhält. Und wenn ich die Textur einfüge (Grau bis weiß) wird das Surface transparent.
  • FOW_DRAW:

    GML-Quellcode

    1. //FOW_draw()
    2. draw_set_blend_mode_ext(bm_dest_color,bm_zero);
    3. draw_surface_ext(global.FOW_surface, 0, 0,global.FOW_quality,global.FOW_quality,0,c_white,1);
    4. draw_set_blend_mode(bm_normal);
    5. draw_surface(global.FOW_surface2, view_xview, view_yview);

    Ich gehe einfach mal davon aus, dass die FOW_surface2 die obere Wolkenschicht ist.
  • Dafür musst du nun zunächst die Surface korrekt vorbereiten. Das geht leider nur mit Hackerei und ich weiß nicht, ob und wie das genau im Moment funktioniert. Die Idee ist auf jeden Fall, dass du die Surface mit einer komplett durchsichtigen Farbe einmal vorher füllst. Probier mal draw_set_alpha(0) und dann draw_fill(c_black) mal draw_set_alpha(1) bevor du die Wolken draufzeichnest.
  • Ich stecke hier wirklich fest und versuche mein Bestes, aber ich blicke hier noch nicht so 100%ig durch.
    Wenn es möglich ist, würde ich gerne mit jemandem eine Skype Bildschirmübertragungssession oder ein Team Viewer Meeting machen, um das Problem zu lösen. Für Erfahrene mit Surfaces ist das ganze vielleicht sogar nur wenig Zeitintensiv. Das wäre wirklich extrem hilfreich!

    Mit diesem Code habe ich es übrigens geschafft, wenigstens die Textur anzuzeigen und wieder aufzulösen. Nur der Untergrund ist stark zu hell jetzt.

    GML-Quellcode

    1. draw_set_blend_mode_ext(bm_dest_color,bm_zero);
    2. draw_surface_ext(global.FOW_surface, 0, 0,global.FOW_quality,global.FOW_quality,0,c_white,1);
    3. draw_set_blend_mode(bm_normal);
    4. draw_surface(global.FOW_surface2, view_xview, view_yview);
    5. surface_set_target(global.FOW_surface2);
    6. draw_clear_alpha(c_white, 0);
    7. draw_sprite(spr_fow, -1,0,0);
    8. surface_reset_target();


    Danke für die bisherige Hilfe!

    Skypename: kraftausdruck

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