Hola gente necesito ayuda con algo y es muy importante, quería saber si alguien sabe algo sobre como aderir compras integradas en un juego, estamos casi en la fase final de un juego y nos gustaría incorporar compras integradas en el juego, alguien sabe algo de el tema? es muy complicado?
hola matiasmunyo, te comento en si no es complicado, al principio pensaba que si pero hoy lo uso en varios de mis juegos, de hechos ahora mi mayor complicación es el ONLINE, bueno en fin te comento una vez generado el producto de la aplicacion que vas a utilizar desde la consola de desarrollo de Google Play, el cual te genera un ID, tenes que habilitar desde la pestaña Global Game Settings del Game Maker Studio los in app purchases, hecho esto estamo en condiciones de comenzar a programar:
EMPEZANDO A PROGRAMAR
Para implementar el sistema de compras dentro de la aplicación basta con crear un objeto principal que vamos a utilizar para controlar todo el sistema de compras durante toda la ejecución de la aplicación, ante lo cual es muy recomendable que dicho objeto sea el primero en crearse ni bien se ejecuta el juego y asimismo debe ser PERSISTENTE para que se mantenga durante todo el proceso Activo.-
debemos colocarle un nombre lo mas descriptivo posible, por ejemplo:
- Obj_InAppControl.
- Obj_CtlInApp.
- Obj_Ctl_InApp.
una vez creado colocaremos el siguiente código:
Evento Create:
//Creamos un archivo para almacenar los datos de los ítems disponibles para las //compras, y los guardamos en archivos porque puede que no siempre tengamos acceso //a los servidores de compras, ante lo cual de esta forma podremos de igual forma //mostrar los datos al usuario del ítem seleccionado y luego informales que el mismo no //esta disponible pero de otra forma les mostraría un error y quizás hasta se cerraría //nuestra App
//otra cosa importante de esto es que Game Maker no es persistente en la adquisición de //los productos integrados, por eso de esta forma sus compras estarán seguras
if file_exists("data.bin") //si existe el archivo
{
//cargamos los datos
global.purchaseMap = ds_map_secure_load("data.bin");
if ds_exists(global.purchaseMap, ds_type_map)
{
//verificamos si la variable esta en cero (variable definida anteriormente)
if global.ads=0
{
//función para habilitar la publicidad (Por ejemplo Admob)
ads_enable(0,0,0); //habilitamos la publicidad
}
//función para deshabilitar la publicidad
else{ads_disable(0);} //sino la deshabilitamos
}
}
//si el archivo .bin no existe
else
{
//creamos una variable para almacenar datos en archivo
global.purchaseMap = ds_map_create();
{
//creamos una variable para almacenar el id de un producto
var product1 = "ads"; //ID de Google Play para quitar la publicidad
var product2 = "monedas_extra"; //1000 monedas
}
//guardamos los datos en un archivo .bin
ds_map_add(global.purchaseMap, product1, 0); //agregamos el producto add
ds_map_add(global.purchaseMap, product2, 0); //producto monedas
ds_map_secure_save(global.purchaseMap, "data.bin");
}
//Definimos todos los datos del producto para quitar la publicidad (durable)
var pNoAds = ds_map_create();
productList = ds_list_create();
ds_map_add(pNoAds, "id", "ads");
ds_map_add(pNoAds, "title", "Juego - No Ads");
ds_map_add(pNoAds, "type", "Durable");
//definimos todos los datos para el producto que nos dará las monedas (consumible)
piap1 = ds_map_create();
ds_map_add(piap1, "id", "Juego_monedas");
ds_map_add(piap1, "title", "Juego - Buy Coins");
ds_map_add(piap1, "type", "Consumable");
//agregamos los productos a la lista
ds_list_add(productList, pNoAds);
//Activamos el InApp de la publicidad para que este disponible
iap_activate(productList);
//eliminamos todos los datos de la memoria (quedan almacenados en el archivo .bin)
ds_map_destroy(pNoAds);
ds_map_destroy(piap1);
ds_list_destroy(productList);
Evento IAP:
en este evento del objeto de control de los In App Purchases se verifican todos los estados principales del sistema de control y de hecho toda la funcionalidad esta controlada por este evento.-
en el mismo colocaremos un código como el siguiente:
// buscamos los items por tipo
var val = ds_map_find_value(iap_data, "type");
switch (val)
{
//verificamos la compra
case iap_ev_purchase:
var map = ds_map_create();
var purchaseIndex = ds_map_find_value(iap_data, "index");
//Mostramos los detalles del producto a adquirir
iap_purchase_details(purchaseIndex, map);
show_debug_message("IAP EVENT: PURCHASE");
show_debug_message("Purchase index=" + string(purchaseIndex));
show_debug_message("Product ID=" +string(ds_map_find_value(map, "product")));
show_debug_message("Order ID=" + string(ds_map_find_value(map, "order")));
show_debug_message("Token=" + string(ds_map_find_value(map, "token")));
show_debug_message("Payload=" + string(ds_map_find_value(map, "payload")));
show_debug_message("Receipt data=" +string(ds_map_find_value(map, "receipt")));
show_debug_message("Time=" + string(ds_map_find_value(map, "time")));
show_debug_message("Status=" + string(ds_map_find_value(map, "status")));
show_debug_message("Response code=" +string(ds_map_find_value(map, "response")));
if (ds_map_find_value(map, "status") == iap_purchased) //si ya ha comprado el producto
{
//averiguamos que tipo de producto ha comprado
var product = ds_map_find_value(map, "product");
switch(product)
{
//si adquiere el producto de monedas
case "Juego_monedas":
ds_map_replace(global.purchaseMap, "Juego_monedas", true);
ds_map_secure_save(global.purchaseMap, "data.bin");
iap_consume(product);
global.Monedas+=1000; //asignamos las Monedas
break;
case "ads": //id del producto (publicidad)
ds_map_replace(global.purchaseMap, "ads", true); //cambiamos el valor a verdadero, dado que compro el producto
//tambien lo guardamos en el archivo
ds_map_secure_save(global.purchaseMap, "data.bin");
//y como compro deshabilitamos la publicidad
ads_disable(0)
global.ads=1;
break;
}
}
ds_map_destroy(map); //borramos los datos de la memoria
break;
//Control de los consumibles (Monedas, vidas, etc)
case iap_ev_consume:
var product = string(ds_map_find_value(iap_data, "product"));
if (product == "Juego_monedas") //si eligió comprar monedas
{
global.Monedas+=1000; //damos las monedas
ds_map_secure_save(global.purchaseMap, "data.bin");
show_message_async("1000 Coins Delivered!");
}
//en esta área con comentarios podemos apreciar como seria si quisiéramos incorporar //mas ítems de compras y como setearlos
/*else if (product == "iap2")
{
global.iap2+=1000
ds_map_secure_save(global.purchaseMap, "data.bin");
show_message_async("IAP2 Delivered!");
}
else if (product == "iap3")
{
global.iap3+=1000000
ds_map_secure_save(global.purchaseMap, "data.bin");
show_message_async("IAP3 Delivered!");
}*/
break;
}
BOTON DE COMPRA DE UN PRODUCTO
Una vez definido el objeto que controla las compras integradas dentro de la aplicación ya podemos crear por ejemplo un objeto que sea un botón, el cual al pulsarlo adquiera el producto que quita la publicidad o en su defecto nos da las monedas, por ejemplo se podrían llamar:
Publicidad
- Obj_Comprar.
- Obj_BtnNoads.
- Obj_NoPubli
Monedas
- Obj_BuyCoins
- Obj_ComprarMonedas
_ Obj_BuyMoney
dicho objeto por ejemplo lo podríamos colocar en el menú principal del juego o en un menú de tienda (tener en cuenta que este objeto debería crearse después de que se crea el objeto principal de control de los InApp, el cual deberia crearse siempre primero que cualquier objeto y en el primer room existende), esto es para que no pase que quiera verificar eventos del InApp cuando aun no fue inicializado el sistema.-
Bien ahora dentro del evento "Step", colocamos el siguiente código:
//si todavía no compro el ítem, esto lo podríamos verificar a través de esta variable (global.ads), dado que esta se establece ni bien inicia el juego
if global.ads=0{
//si se pulso el boton derecho del mouse o hizo touch (Android)
if mouse_check_button_pressed(mb_left) {
//si el producto esta disponible
if iap_status() == iap_status_available {
{
iap_acquire("ads", ""); //lo adquiere
//establece el valor a 1 para deshabilitar la publicidad
global.ads=1;
//para la compra de moneda seria lo mismo que las dos líneas anteriores
//basta con reemplazarlas por:
//iap_acquire("pesca_extrema_monedas", "");
//podemos aclarar que no hace falta especificar como se hizo en la linea anterior de //establecer la variable (global.ads=1), establecer las monedas asignadas dado que como //se vio anteriormente dicha asignación se puede hacer desde el evento principal de //control de los In App Purchases
}
}
else //si el ítem no esta disponible
{
//se lo indicamos al usuario
show_message_async("Este item no se encuentra disponible por el momento");
}}
hecho esto solo nos queda generar el apk, dado que de otra forma no funcionara.-
mmmm creo que l voy a dejar para mas adelante eso, se me complico mucho gracias por la respuesta voy a intentar mas adelante, gracias de verdad
ejeje. bueno en si igual te digo no es tan complicado al principio asi lo parece pero no lo es. un saludo.
Noo si seguro que cuando lo intento no se me haga tan complicado, pero primero voy a terminar algunas cosas y después si voy a intentarlo, muchas gracias :) :)
Tengo una duda...
Si por ejemplo quieres que esas 1000 monedas de juego cuesten 0.80 centimos de euro. ¿donde se indica el precio que quieres cobrar por ellas a parte de mostrarlo en el juego? Es decir, donde se indica la cantidad real a pagar? En la consola de desarrollador de google play?
Llevo horas leyendo y leyendo y la verdad que esta dificil, no hay algun ejemplo hecho para poder entenderlo mejor? el que hizo este tuto es un genio