Saltar al contenido
izy.gg
··

Documentación del SDK de izy.gg

Una sola etiqueta script le da a tu juego HTML5 o WebGL anuncios que te generan ingresos, guardado en la nube, el idioma del jugador y control del sonido. El SDK no tiene dependencias y también funciona fuera de izy.gg, así que puedes desarrollar en local.

Inicio rápido

Incluye el script en tu index.html y llama a IzySDK.init() una sola vez. Siempre se resuelve: en izy.gg se conecta al sitio y en cualquier otro lugar funciona de forma independiente, con anuncios de prueba y guardado local.

<script src="https://izy.gg/sdk/v1.js"></script>
<script>
  (async () => {
    const izy = await IzySDK.init();   // always resolves, also outside izy.gg

    // Language and sound from izy.gg
    game.setLanguage(izy.locale);      // "en", "ru", …
    game.mute(izy.muted);
    izy.on("audio", ({ muted }) => game.mute(muted));

    // Loading screen
    izy.loading(40);                   // 0..100
    await game.load();
    izy.ready();
  })();
</script>

Referencia de la API

Todo está en el objeto que devuelve IzySDK.init():

  • izy.locale: el idioma del jugador en izy.gg ("en", "ru", …).
  • izy.device: "desktop", "mobile" o "tablet".
  • izy.user: { name, avatar } del jugador con sesión iniciada, o null.
  • izy.muted: si el jugador silenció el sitio. izy.on("audio", ({ muted }) => …) te avisa cuando cambia.
  • izy.test: true fuera de izy.gg y en la vista previa del portal (los anuncios son de prueba y no se contabiliza nada).
  • izy.loading(progress) e izy.ready(): controlan la pantalla de carga de izy.gg.
  • izy.gameplayStart() e izy.gameplayStop(): le indican a izy.gg cuándo transcurre el juego real. Los anuncios nunca interrumpen la partida.
  • izy.ads.interstitial() e izy.ads.rewarded(): consulta Anuncios más abajo.
  • izy.save(data) e izy.load(): consulta Guardado en la nube más abajo.
  • izy.happyTime(): un momento de alegría, como un récord o un nivel superado.
  • izy.on("pause" | "resume", callback): antes y después de cada anuncio. Silencia y pausa tu juego al recibir "pause".

Anuncios

Los anuncios intersticiales se muestran entre niveles o después de un game over. izy.gg protege a los jugadores: ningún intersticial en los primeros 90 segundos y como máximo uno cada 2 minutos, lo pida tu juego con la frecuencia que sea. Llámalo en pausas naturales y continúa cuando la promesa se resuelva.

Los anuncios con recompensa siempre deben ser decisión del jugador (un botón con una recompensa clara) y la recompensa se entrega solo cuando la promesa se resuelve con true.

Un anuncio intersticial nunca interrumpe la partida: mientras tu juego indique que la partida está en curso (gameplayStart sin gameplayStop), la solicitud se resuelve con false. Llama primero a gameplayStop, como en el ejemplo.

// Between levels: izy.gg decides if an ad fits (at most one every 2 minutes)
izy.gameplayStop();
await izy.ads.interstitial();          // → true if an ad was shown
izy.gameplayStart();

// Only when the player taps "Watch an ad for +1 life"
if (await izy.ads.rewarded()) {        // → true only if watched to the end
  player.lives += 1;
}

// izy.gg pauses your game around every ad
izy.on("pause", () => game.pause());
izy.on("resume", () => game.resume());

Guardado en la nube

Los jugadores con sesión iniciada conservan su progreso en todos sus dispositivos; los invitados lo conservan en el navegador. Los datos guardados pertenecen al juego, no a una versión: se mantienen tras cada actualización. Usa siempre await con load() antes de iniciar el primer nivel.

// Any JSON up to 256 KB. Signed-in players get it on every device.
await izy.save({ level: 7, coins: 1200 });

const progress = await izy.load();     // → your object, or null
if (progress) game.restore(progress);

Unity, Godot, Construct, Phaser y otros motores

El SDK es JavaScript puro, así que cualquier motor con exportación HTML5 o WebGL puede usarlo. Unity lo llama mediante un plugin .jslib y un pequeño script en C#; la plantilla WebGL conecta la barra de carga de Unity con izy.gg. Godot 4 usa JavaScriptBridge, y Construct 3, un script del proyecto.

// Assets/Plugins/WebGL/izy.jslib
mergeInto(LibraryManager.library, {
  IzyInit: function () {
    IzySDK.init().then(function (izy) {
      window.izy = izy;
      izy.on("pause", function () { SendMessage("IzyBridge", "OnPause", ""); });
      izy.on("resume", function () { SendMessage("IzyBridge", "OnResume", ""); });
      izy.on("audio", function (a) { SendMessage("IzyBridge", "OnMuted", a.muted ? "1" : "0"); });
      SendMessage("IzyBridge", "OnInit", izy.locale + "|" + (izy.muted ? "1" : "0"));
    });
  },
  IzyGameplayStart: function () { if (window.izy) window.izy.gameplayStart(); },
  IzyGameplayStop: function () { if (window.izy) window.izy.gameplayStop(); },
  IzyInterstitial: function () {
    window.izy.ads.interstitial().then(function () { SendMessage("IzyBridge", "OnAdDone", ""); });
  },
  IzyRewarded: function () {
    window.izy.ads.rewarded().then(function (ok) { SendMessage("IzyBridge", "OnRewarded", ok ? "1" : "0"); });
  },
  IzySave: function (json) { window.izy.save(JSON.parse(UTF8ToString(json))); },
  IzyLoad: function () {
    window.izy.load().then(function (data) { SendMessage("IzyBridge", "OnLoaded", JSON.stringify(data)); });
  },
});

// Assets/Scripts/IzyBridge.cs: on a GameObject named "IzyBridge" in the first scene.
using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class IzyBridge : MonoBehaviour
{
    [DllImport("__Internal")] static extern void IzyInit();
    [DllImport("__Internal")] static extern void IzyGameplayStart();
    [DllImport("__Internal")] static extern void IzyGameplayStop();
    [DllImport("__Internal")] static extern void IzyInterstitial();
    [DllImport("__Internal")] static extern void IzyRewarded();
    [DllImport("__Internal")] static extern void IzySave(string json);
    [DllImport("__Internal")] static extern void IzyLoad();

    public static string Locale = "en";
    static Action<bool> onReward;
    static Action<string> onLoaded;

    void Awake()
    {
        DontDestroyOnLoad(gameObject);
#if UNITY_WEBGL && !UNITY_EDITOR
        IzyInit();
#endif
    }

    public static void GameplayStart() { IzyGameplayStart(); }
    public static void GameplayStop() { IzyGameplayStop(); }
    public static void Interstitial() { IzyInterstitial(); }
    public static void Rewarded(Action<bool> done) { onReward = done; IzyRewarded(); }
    public static void Save(object data) { IzySave(JsonUtility.ToJson(data)); }
    public static void Load(Action<string> done) { onLoaded = done; IzyLoad(); }

    // Called from JavaScript
    void OnInit(string s) { var p = s.Split('|'); Locale = p[0]; AudioListener.volume = p[1] == "1" ? 0 : 1; }
    void OnPause() { AudioListener.pause = true; Time.timeScale = 0; }
    void OnResume() { AudioListener.pause = false; Time.timeScale = 1; }
    void OnMuted(string m) { AudioListener.volume = m == "1" ? 0 : 1; }
    void OnAdDone(string _) { }
    void OnRewarded(string ok) { onReward?.Invoke(ok == "1"); }
    void OnLoaded(string json) { onLoaded?.Invoke(json); }
}

<!-- WebGL template index.html: the izy.gg loading bar follows Unity's -->
<script src="https://izy.gg/sdk/v1.js"></script>
<script>
  const izyReady = IzySDK.init();
  createUnityInstance(canvas, config, (p) => izyReady.then((izy) => izy.loading(p * 100)))
    .then(() => izyReady.then((izy) => izy.ready()));
</script>

# Godot 4, Web export. Export > HTML > Head Include:
#   <script src="https://izy.gg/sdk/v1.js"></script>
var izy = null
# Keep callbacks in variables, or Godot frees them.
var _on_init_cb = JavaScriptBridge.create_callback(_on_init)
var _on_reward_cb = JavaScriptBridge.create_callback(_on_reward)

func _ready():
    if OS.has_feature("web"):
        JavaScriptBridge.get_interface("IzySDK").init().then(_on_init_cb)

func _on_init(args):
    izy = args[0]
    TranslationServer.set_locale(izy.locale)
    izy.ready()

func show_interstitial():
    if izy: izy.ads.interstitial()

func show_rewarded():
    if izy: izy.ads.rewarded().then(_on_reward_cb)

func _on_reward(args):
    if args[0]:
        give_reward()

// Construct 3: after export add <script src="https://izy.gg/sdk/v1.js"></script> to index.html,
// then in a project script:
let izy;
runOnStartup(async (runtime) => {
  izy = await IzySDK.init();
  runtime.globalVars.Locale = izy.locale;   // a global variable "Locale" in your event sheet
});
// Events: "Execute JavaScript" -> izy.ads.interstitial()

// Phaser
this.sound.mute = izy.muted;
izy.on("audio", ({ muted }) => (this.sound.mute = muted));
izy.on("pause", () => this.game.pause());
izy.on("resume", () => this.game.resume());

// GameMaker, Defold, Cocos Creator, PlayCanvas: add the script tag to the HTML5 export's index.html
// and call the same functions from the engine's JavaScript bridge.

Requisitos de la versión

  • El script del SDK de izy.gg es obligatorio: una versión sin él no se puede enviar a revisión.
  • Un zip con index.html en la raíz (o dentro de una única carpeta). Hasta 100 MB comprimido, 300 MB descomprimido y 3000 archivos.
  • Solo rutas relativas; todo lo que necesita el juego está dentro del zip. No cargues nada por http sin cifrar.
  • Nada de ejecutables ni scripts del lado del servidor (se rechazan .exe, .php, .sh y similares).
  • Nada de analítica, rastreadores ni anuncios propios: izy.gg se encarga de los anuncios, y la privacidad de los jugadores está protegida por nuestras reglas de consentimiento.
  • Se adapta a cualquier tamaño de ventana y funciona con pantallas táctiles si lo marcas como apto para móviles. Tu juego se ejecuta en un marco aislado (sandbox) en izygames.formarrival.com.
  • Unity WebGL: la compresión Brotli o Gzip está bien (los archivos se envían con la codificación y el tipo correctos), no hace falta decompression fallback.

Pruebas

En local: abre tu index.html desde cualquier servidor local. El SDK funciona de forma independiente, muestra un anuncio de prueba superpuesto de 3 segundos y resuelve los anuncios con recompensa con true.

En el portal: después de subir una versión, haz clic en "Probar la versión". Se ejecuta exactamente como en izy.gg, con anuncios de prueba, antes de que la envíes a revisión.

Revisión

Una persona revisa cada juego nuevo y cada versión nueva, normalmente en un plazo de 2 días hábiles. Rechazamos los juegos que:

  • no cargan, se bloquean o no se pueden jugar en los dispositivos que dicen admitir;
  • contienen malware, mineros de criptomonedas, phishing o redirecciones ocultas;
  • muestran contenido para adultos, de odio o ilegal, o usan recursos sobre los que no tienes derechos;
  • muestran anuncios propios o enlaces a otros sitios de juegos, o piden datos personales;
  • abusan de los anuncios con recompensa u obligan a los jugadores a ver anuncios.

Análisis de seguridad automático

Cada versión subida se analiza antes de que la revise una persona. Una versión con un minero de criptomonedas en el navegador se rechaza al subirla. El código que redirige la página de izy.gg, abre ventanas emergentes, registra un service worker, usa eval empaquetado o carga SDK de anuncios y analítica de otras plataformas se marca para el revisor. También se listan los dominios externos desde los que carga el juego.

Los juegos se ejecutan en su propio origen (izygames.formarrival.com), en un marco aislado, sin acceso a las cuentas ni a las cookies de izy.gg.

Actualizaciones y orientación

Una vez publicado un juego, su título, descripción, categoría y etiquetas quedan fijos; el equipo de soporte puede cambiarlos si lo solicitas (direct@izy.gg). El texto Cómo jugar, la versión, la portada, el video de gameplay, la orientación y los idiomas se pueden seguir cambiando, y cada cambio pasa por revisión. Los jugadores siguen viendo la versión revisada hasta que se aprueba el cambio.

Revisión automática de nuevas versiones: cuando envías solo una versión nueva y no cambias nada más, se publica de inmediato si parece el mismo juego: sin alertas de seguridad, con el SDK incluido, sin dominios externos nuevos, con el mismo archivo de inicio, un tamaño y un número de archivos similares y la mayoría de los nombres de archivo sin cambios. Hasta 3 actualizaciones de este tipo al día; después de 5 seguidas, un moderador revisa la siguiente. Todo lo demás pasa a los moderadores como siempre, y pueden revertir una actualización automática.

La orientación se configura por separado para móviles y para escritorio. En móviles, se le pide al jugador que gire el dispositivo cuando hace falta. En escritorio, el juego recibe por defecto un escenario ancho de 16:9 y debe adaptarse a él (o dibujar sus propias barras laterales); elige "Solo vertical" únicamente si el juego no puede hacerlo.

Puedes retirar un juego del sitio y volver a publicarlo en cualquier momento, o eliminarlo. Un juego eliminado desaparece del sitio y del portal; lo que ganó se queda en tu saldo.

Ficha, idiomas y multimedia

izy.gg está disponible en inglés, ruso, turco y español. Escribe el título, la descripción y Cómo jugar en uno de ellos (el original). Para cada uno de los demás idiomas del sitio, elige: traducir automáticamente (la IA traduce el original al guardar, y de nuevo cuando cambia) o escribirlo tú. El título se mantiene como en el original, salvo que actives su traducción. El moderador revisa todos los idiomas.

Idiomas del juego: los idiomas en los que está el propio juego, se muestran en su página. Etiquetas: hasta 6, sitúan el juego en colecciones y en la búsqueda.

Portada: PNG, JPEG o WebP de hasta 2 MB, recortada a 16:10. Video de gameplay: MP4 o WebM de hasta 25 MB, de 10 a 30 segundos de juego real sin sonido; se reproduce al pasar el cursor en el catálogo y aparece en la búsqueda de videos.

Analítica

La página del juego en el portal muestra cifras reales de los últimos 30 días. Vistas en el catálogo: la tarjeta del juego estuvo al menos a la mitad en pantalla durante un segundo, una vez por vista de página. Clics y CTR: clics en la tarjeta divididos entre las vistas en el catálogo. Vistas de página y tasa de inicio: inicios divididos entre las visitas a la página del juego.

Tasa de juego: la proporción de inicios en los que el juego llamó a izy.gameplayStart(). Llámalo cuando empiece el juego real (después de la carga y los menús) para ver dónde abandonan los jugadores. Jugadores recurrentes: jugadores que jugaron al menos en dos días distintos. Los me gusta y no me gusta son votos reales de los jugadores.

Promoción

Los juegos publicados se pueden promocionar con el saldo de ganancias: un lugar en la fila "Juegos promocionados" de la página de inicio (se paga por cada 1000 impresiones contabilizadas) o el primer puesto de la categoría del juego (se paga por día, un juego por categoría). Los precios son fijos y públicos, no hay subastas.

Los lugares promocionados siempre están señalados para los jugadores. Las partidas que provienen de la promoción nunca cuentan para las valoraciones, los rankings ni las recomendaciones. Una impresión cuenta una vez al día por visitante y se excluyen los bots. Cada campaña se revisa primero, y lo que no se gasta vuelve al saldo.

Ganancias y pagos

Ganas tu parte de los ingresos (70% por defecto) de los anuncios mostrados dentro de tus juegos. Las ganancias aparecen a diario en el portal; los dos últimos días son estimaciones y se fijan en un plazo de 48 horas.

Solicita un pago desde la página Ganancias cuando tu saldo alcance el mínimo (50 USD por defecto). Pagamos en un plazo de 10 días hábiles por PayPal, Payoneer, Wise, USDT (TRC-20) o transferencia bancaria.

Ayuda

Preguntas sobre el SDK, la revisión o los pagos: direct@izy.gg.