sprite_create_from_screen - wie kann man diese Sprites vergleichen?

  • GM 8

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

  • sprite_create_from_screen - wie kann man diese Sprites vergleichen?

    Guten Morgen und frohe Ostern!

    Muss mich doch noch mal an das Forum wenden, weil ich Probleme damit habe, 2 Sprites zu vergleichen.

    Mit "sprite_create_from_screen" haben sich sowohl das Programm als auch der Spieler ein Bildausschnitt ausgewählt. Jetzt sollen diese beiden Ausschnitte miteinander verglichen werden - aber ich weiß nicht, wie... Mit 'if sprite_ausschnitt1 = sprite_ausschnitt2' geht es jedenfalls nicht.

    Leider finde ich auch keine Anhaltspunkte, wie man 2 Sprites dieser Art noch miteinander vergleichen könnte. Kann da bitte jemand mal helfen?
    Danke schon mal im voraus und noch schönen Feiertag,
    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Ich hab dir schnell ein Skript geschrieben, welches die Ähnlichkeit zweier Sprites zurückgibt.
    Der minimale Rückgabewert "0" bedeutet das die zwei Sprites völlig identisch und der maximale Rückgabewert "1" das sie völlig verschieden sind.

    Um den Ausschnitt eines Sprites zu prüfen, einfach schnell ein Surface erstellen, mit draw_sprite_part den Ausschnitt des Sprites darauf zeichnen und mit sprite_create_from_surface den daraus resultierenden Sprite meinem Skript übergeben.

    sprites_get_similiarity
    Spoiler anzeigen

    GML-Quellcode

    1. // sprites_get_similiarity (
    2. // sprite1,
    3. // sprite2
    4. // );
    5. var sur_width, sur_height, n, m, s1_pixels, s2_pixels, xoff1, yoff1, xoff2, yoff2;
    6. sur_width = max(sprite_get_width(argument0), sprite_get_width(argument1));
    7. sur_height = max(sprite_get_height(argument0), sprite_get_height(argument1));
    8. xoff1 = sprite_get_xoffset(argument0);
    9. yoff1 = sprite_get_yoffset(argument0);
    10. xoff2 = sprite_get_xoffset(argument1);
    11. yoff2 = sprite_get_yoffset(argument1);
    12. sprite_set_offset(argument0, sprite_get_width(argument0) >> 1, sprite_get_width(argument0) >> 1);
    13. sprite_set_offset(argument1, sprite_get_width(argument1) >> 1, sprite_get_width(argument1) >> 1);
    14. n = surface_create(sur_width, sur_height);
    15. surface_set_target(n);
    16. draw_set_blend_mode(bm_normal);
    17. draw_sprite_ext(argument0, 0, sur_width >> 1, sur_height >> 1, 1, 1, 0, c_white, 1);
    18. for (x = 0; x < sur_width; x+=1)
    19. for (y = 0; y < sur_height; y+=1)
    20. s1_pixels[x,y] = surface_getpixel(n, x, y);
    21. draw_clear_alpha(c_black, 0);
    22. draw_sprite_ext(argument1, 0, sur_width >> 1, sur_height >> 1, 1, 1, 0, c_white, 1);
    23. for (x = 0; x < sur_width; x+=1)
    24. for (y = 0; y < sur_height; y+=1)
    25. s2_pixels[x,y] = surface_getpixel(n, x, y);
    26. surface_reset_target();
    27. surface_free(n);
    28. sprite_set_offset(argument0, xoff1, yoff1);
    29. sprite_set_offset(argument1, xoff2, yoff2);
    30. m = 0;
    31. for (x = 0; x < sur_width; x+=1)
    32. for (y = 0; y < sur_height; y+=1)
    33. {
    34. r1 = color_get_red(s1_pixels[x,y]);
    35. g1 = color_get_green(s1_pixels[x,y]);
    36. b1 = color_get_blue(s1_pixels[x,y]);
    37. r2 = color_get_red(s2_pixels[x,y]);
    38. g2 = color_get_green(s2_pixels[x,y]);
    39. b2 = color_get_blue(s2_pixels[x,y]);
    40. m += (max(r1, r2) - min(r1, r2));
    41. m += (max(g1, g2) - min(g1, g2));
    42. m += (max(b1, b2) - min(b1, b2));
    43. }
    44. return m / (sur_width * sur_height * 3 * 255);
    Alles anzeigen

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

  • @luky300: Das Skript benutzt getpixel und diese Funktion ist nach GM-Hilfe: "nicht sehr schnell, sei als vorsichtig." Bei meinem Test (100 Durchläufe, 32x32 Sprites) ergaben sich 0,5 Sekunden pro Durchlauf (Durchschnitt) und das Skript kann die Transparenz nicht verarbeiten.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%

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

  • Eine Idee wäre es noch, die zwei Bilder zu speichern und dann die Datein zu vergleichen (MD5-Hash, Größe, Raw-Daten).

    Input: 2 Sprites (32x32) die zu PNG-Datein gespeichert werden, 100 Durchläufe
    Test mit Größe: 3ms pro Durchlauf (current_time Zeitmessung)
    Test mit MD5 (39dll): 3ms pro Durchlauf (current_time Zeitmessung)
    Damit ist es nur möglich zu prüfen ob die zwei Bilder die selben sind oder nicht.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von henrik1235 ()

  • Ich hab dir schnell ein Skript geschrieben, welches die Ähnlichkeit zweier Sprites zurückgibt.
    Der minimale Rückgabewert "0" bedeutet das die zwei Sprites völlig identisch und der maximale Rückgabewert "1" das sie völlig verschieden sind.

    Oh, danke, werde mir das gleich mal reinziehen. Nur hab ich leider noch nie was mit Surfaces zu tun gehabt, deshalb ist für mich "einfach schnell ein Surface erstellen" leichter gesagt als getan... ;) Was versteht man denn unter einem "Surface"?


    Vielleicht verrät uns Archie, was er bezwecken will bzw. vorhat, vielleicht kann man das auch anders lösen.
    Bis jetzt hab ich die beiden Ausschnitte noch gar nicht gespeichert, weil das nicht nötig erschien. Wie ich schon schrieb: der Computer wählt einen Bildausschnitt und zeigt ihm den Spieler, der Spieler muß ihn suchen gehen. Damit die Genauigkeit der Übereinstimmung gegeben ist, hat der Spieler eine Art Raster, mit dem er das Spielfeld absucht. Hat er es gefunden, wird der nächste Ausschnitt angezeigt. Ein Speichern sollte wegen der Geschwindigkeit eigentlich vermieden werden. Dennoch müssen nur diese beiden Ausschnitte immer abgeglichen werden.

    Da ich noch keinen Abgleich machen konnte, hab ich mir jetzt erst mal damit beholfen, dass ich mir die Position des Ausschnittes, das immer ein Rechteck ist, gemerkt habe. Das kann aber so nciht bleiben, dass die Positionen abgeglichen werden, denn rein theoretisch kann es zufällig sein, dass der gleiche Ausschnitt auch an anderer Stelle auftaucht - und dann soll es auch gültig sein. Wäre es in meiner "Notlösung" aber nicht.
    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Oh, danke, werde mir das gleich mal reinziehen. Nur hab ich leider noch
    nie was mit Surfaces zu tun gehabt, deshalb ist für mich "einfach
    schnell ein Surface erstellen" leichter gesagt als getan... ;-) Was
    versteht man denn unter einem "Surface"?

    Ein Surface ist eine Art Bild, das man ingame bearbeiten kann.
    Man kann es als "Ziel" für eine Draw Aktion auswählen und dann
    zeichnet der GM darauf. Damit lassen sich auch sehr schöne Posteffekte erzeugen.