Шукати в цьому блозі

Внутрішньоігрові продажі "плагін iab"


----------------

if not tv then
 pcall(function() require "iab" end)
end
if IAB then
 if android then
  if kindle then
   iab=IAB.new("amazon")
   iab:setProducts({credit50="credit_50",credit100="credit_100",credit500="credit_500",credit1000="credit_1000"})
  else
   iab=IAB.new("google")
   iab:setUp(googleLicence)
   iab:setProducts({credit50="credit50",credit100="credit100",credit500="credit500",credit1000="credit1000"})
  end
 elseif ios then
  iab=IAB.new("ios")
  iab:setProducts({credit50="credit50",credit100="credit100",credit500="credit500",credit1000="credit1000"})
 end
 
 if iab then
  iab:setConsumables({"credit50","credit100","credit500","credit1000"})
  iab:addEventListener(Event.AVAILABLE,function(e)
   print("iab is available")
   iabCheck=false
   iab:requestProducts()
  end)
 
  -- зазвичай тут ми б встановили прапор, що можна робити покупки
                -- в основному ви можете дозволити робити всі файли iap після того, як ця подія викликана
 
  --[[ ЗАПРОС ТОВАРІВ]]--
  --Якщо ця подія викликається, ми отримали перелік продуктів та інформацію про них
  iab:addEventListener(Event.PRODUCTS_COMPLETE,function(e)
   print("Product list completed")
   for i = 1, #e.products do
    local p=e.products[i]
    --id, title, description and price
    print(p.productId,p.title,p.description,p.price)
    if p.productId=="fullgame" then
     iabCheck=true
     iabFullGame=false
    end
    for loop=1,#creditText do
     local c=creditText[loop]
     if p.productId==c[1] then
      c[2]=p.price
      c[3]=true
     end
    end
   end
   iab:restore()
  end)
 
  --Інакше ми не змогли отримати інформацію про товари зараз
  iab:addEventListener(Event.PRODUCTS_ERROR,function(e)
   print(e:getType(),e.error)
  end)
 
  iab:addEventListener(Event.PURCHASE_COMPLETE,function(e)
   -- покупки успішно виконані
--тут вам потрібно перевірити, чи не було раніше збережено квитанцію IDI
-- в тому випадку, якщо покупка ще не була здійснена
-- тоді ви можете розблокувати елемент тут
-- і зберігати квитанцію, імовірно, щоб знати
-- що ви вже надали цей елемент користувачеві
   print("Покупка завершена")
   if remainingCredits<0 then remainingCredits=0 end
   if e.productId=="credit50" then
    remainingCredits+=50
    saveSettings()
   elseif e.productId=="credit100" then
    remainingCredits+=100
    saveSettings()
   elseif e.productId=="credit500" then
    remainingCredits+=500
    saveSettings()
   elseif e.productId=="credit1000" then
    remainingCredits+=1000
    saveSettings()
   elseif e.productId=="fullgame" then
    iabCheck=true
    iabFullGame=true
   end
   print(e:getType(),e.productId,e.receiptId)
  end)
 
  iab:addEventListener(Event.PURCHASE_ERROR,function(e)
    -- не вдалося завершити покупку,
                         --інформувати користувача
   --if e.error=="Unable to buy item (response: 7:Item Already Owned)" then
    iab:isAvailable()
   --end
 --  print(e:getType(),e.error)
  end)
 
  iab:addEventListener(Event.RESTORE_COMPLETE,function(e)
   
--тут вам потрібно перевірити, чи не було раніше збережено квитанцію IDI
-- в тому випадку, якщо покупка ще не була здійснена
-- тоді ви можете розблокувати елемент тут
-- і зберігати квитанцію, імовірно, щоб знати
-- що ви вже надали цей елемент користувачеві
   if iabCheck then
    fullgame=iabFullGame
    saveSettings()
   end
   print("Відновлення завершено")
   --iab:purchase("credit500")
  end)
 
  iab:addEventListener(Event.RESTORE_ERROR,function(e)
   -- відновлення не вдалося завершити,
                        --інформувати користувача
  -- print(e:getType(),e.error)
 
  end)
  iab:isAvailable() 
 --  iab:purchase("credit100")
 else 
  print("Iab постачальник не доступний")
 end
else
 print("Iab недоступний")
end


--------------
зробити покупку так:

if iab then iab:purchase("credit50")



Normal map шейдер для кількох джерел світла


було

стало


ps.glsl
-------------------------------------------------------------------------------------------
uniform lowp sampler2D g_Texture;
uniform lowp vec4 g_Color;
// вказати кількість джерел
#define NUM_LIGHTS 2
uniform mediump vec4 lightPos[NUM_LIGHTS];

varying highp vec2 texCoord;
varying mediump vec2 position;




void main()
{

// Візьміть основний піксельний колір із класичної текстури
lowp vec3 color0 = texture2D(g_Texture, texCoord).rgb;

//Встановіть specular (тобто 'блиск') 30% сірий
lowp vec3 color1 = vec3(0.3, 0.3, 0.3);

//-Convert RGB (range 0->1) to XYZ (range -1 -> 1)
// Візьміть звичайний вектор з правої частини текстури:
// - Відставити на 0.5 праворуч у нормалізованих координатах (1 = повна ширина текстури)
// - Перетворити RGB (діапазон 0-> 1) у XYZ (діапазон -1 -> 1)
mediump vec3 normal = texture2D(g_Texture, texCoord + vec2(0.5, 0.0)).rgb * 2.0 - 1;

lowp vec3 lightContributions=vec3(0,0,0);
int index;
for (index = 0; index < NUM_LIGHTS; index++) // вказати кількість джерел світла
{
//Обчисліть напрямок світла, припускаючи відстань світла 150 одиниць
mediump vec3 lightDir = normalize(vec3(lightPos[index].xy, 150) - vec3(position.xy, 0));


/// Обчисліть напрямок світла так, ніби світло було в два рази далі (for specular)
mediump vec3 halfdir = normalize(normalize(lightDir) + vec3(0, 0, 1));

//Обчисліть дифузний коефіцієнт: normal і lightDir colinear -> 1, perpendicular -> 0
lowp float diff = max(0.0, dot(normal, lightDir));

//Оцініть specular фактор так само, але з експоненціальною шкалою
mediump float nh = max(0.0, dot(normal, halfdir));
mediump float spec = pow(nh, 10.0);


lightContributions=lightContributions+ (color0 * diff + color1 * spec);
}
gl_FragColor = g_Color * vec4(lightContributions.rgb, 1);

}

//-=========================================================
--Lua код


local effect = Shader.new("vs","ps",0,
{
{name="g_MVPMatrix",type=Shader.CMATRIX,sys=Shader.SYS_WVP, vertex=true},
{name="g_Color",type=Shader.CFLOAT4,mult=1,sys=Shader.SYS_COLOR},
{name="lightPos",type=Shader.CFLOAT4,mult=2,vertex=false}, --Two lights
{name="g_Texture",type=Shader.CTEXTURE,mult=1,vertex=false}
},
{
{name="POSITION0",type=Shader.DFLOAT,mult=3,slot=0,offset=0},
{name="vColor",type=Shader.DUBYTE,mult=0,slot=1,offset=0},
{name="TEXCOORD0",type=Shader.DFLOAT,mult=2,slot=2,offset=0}
})

effect:setConstant("lightPos", Shader.CFLOAT4, 2, x, y,0,0,y, x,0,0) --// 2 джерела і їх координати


обрізка спрайту по масці Gideros Lua

local maska = Bitmap.new(Texture.new("img/ticket.png"))
local sprite = Bitmap.new(Texture.new("img/flag.png"))
 
stage:addChild(maska)
stage:addChild(sprite) 
sprite:setPosition(0,80)
--ticket:setVisible(false)
-- 1) Clear stencil and set it to '1' for every pixel drawn on 'ticket'
maska:setStencilOperation{
 --stencilClear = true, 
 --stenciMask = 1, 
 stencilWriteMask = 1, 
 stencilRef = 1,
 stencilFunc = Sprite.STENCIL_ALWAYS, 
 depthPass = Sprite.STENCIL_REPLACE
}
--2) Only draw fx1/fx2 if stencil isn't 0
sprite:setStencilOperation{
 stencilClear = false, 
 stencilMask = 1, 
 stencilRef = 0,
 stencilFunc = Sprite.STENCIL_NOTEQUAL
}

тестові ключі для ADMOB-ГУГЛ

  Важливо включити тестові ключі реклами під час розробки, щоб ви могли натискати на рекламу, не псуючи статистику для рекламодавців Google. Якщо ви натиснете рекламу, не в тестовому режимі , ви ризикуєте що гугл забанить ваш акаунт.

*** перевірте актуальність кодів на https://developers.google.com/admob/android/test-ads

smart_banner,
Banner 
ca-app-pub-3940256099942544/6300978111
Interstitial-міжсторінкова ca-app-pub-3940256099942544/1033173712
Interstitial Videoca-app-pub-3940256099942544/8691691433
Rewarded Videoca-app-pub-3940256099942544/5224354917
Native Advancedca-app-pub-3940256099942544/2247696110
Native Advanced Videoca-app-pub-3940256099942544/1044960115

 


--require plugin
require "ads"

--initialize admob
admob = Ads.new("admob")
admob:setKey("admob-key")
admob:enableTesting() --тестовий режим
--show admob
admob:showAd("smart_banner","ca-app-pub-3940256099942544/6300978111")  --тестовий банер
 
 
admob:addEventListener(Event.AD_FAILED, function(e)
 print("admob AD_FAILED", e.error)
end)