Admob help for complete newbie

Hi,

I obtained a 2 or 3 year source code and implementing admob was supposed to be as easy as changing some ids. However, I have not for the life of me been able to work out why it doesn’t work. I’ve read other forum posts but still I don’t know where to put stuff in and what to get rid of.

Is someone able to look over my code and help please?

Can you post sample code?

Hi, Thanks for replying. Which file should I post code from?

You should post a “sample” code that would show us how you initialize and call Admob ads or you can directly take a look at the docs.

https://docs.coronalabs.com/plugin/ads-admob-v2/

Hi,

I know this isn’t exactly what you asked for but as mentioned, I obtained this source code a while back and I have no idea where the ads are being called. I’m hoping by showing you the files that I know where to start looking for the sample code you need.

Thanks

Sorry, there is nothing I can do about that. You need to check the docs and search for the corresponding function calls and post the sample code here.

ok. How about this approach. I’m trying out the balloon tutorial and here is the code I have for main.lua:

local ads = require( “ads” )

local bannerAppID = “ca-app-pub-nnnnnnnnnnn/nnnnnnnnn”  --for your iOS banner

local interstitialAppID = “ca-app-pub-nnnnnnnnnnn/nnnnnnnn”  --for your iOS interstitial

if ( system.getInfo( “platformName” ) == “Android” ) then

    bannerAppID = “ca-app-pub-7850831907211777/6394665048”  --for your Android banner

    interstitialAppID = “ca-app-pub-7850831907211777/8713846246”  --for your Android interstitial

end

local adProvider = “admob”

local function adListener( event )

end

ads.init( admob, 286480765967, adListener )

ads.show( “banner”, { x=0, y=100000 } )

Here’s the code for build.settings:

– For more information on build.settings see the Corona SDK Build Guide at:

https://docs.coronalabs.com/guide/distribution/buildSettings

settings =

{

    plugins =

    {

        [“plugin.google.play.services”] =

        {

            publisherId = “com.coronalabs”

        },

    },

}

orientation =

{

– Supported values for orientation:

– portrait, portraitUpsideDown, landscapeLeft, landscapeRight

default = “portrait”,

supported = { “portrait”, },

},

excludeFiles =

{

– Include only the necessary icon files on each platform

iphone = { “Icon-*dpi.png”, },

android = { “Icon.png”, “Icon-Small-*.png”, “Icon*@2x.png”, },

},

– iOS Section

iphone =

{

plist =

{

UIStatusBarHidden = false,

UIPrerenderedIcon = true, – set to false for “shine” overlay

–UIApplicationExitsOnSuspend = true, – uncomment to quit app on suspend

CFBundleIconFiles =

{

“Icon.png”,

“Icon@2x.png”,

“Icon-167.png”,

“Icon-60.png”,

“Icon-60@2x.png”,

“Icon-60@3x.png”,

“Icon-72.png”,

“Icon-72@2x.png”,

“Icon-76.png”,

“Icon-76@2x.png”,

“Icon-Small.png”,

“Icon-Small@2x.png”,

“Icon-Small@3x.png”,

“Icon-Small-40.png”,

“Icon-Small-40@2x.png”,

“Icon-Small-50.png”,

“Icon-Small-50@2x.png”,

},

},

},

– Android Section

android =

{

usesPermissions =

{

“android.permission.INTERNET”,

},

},

}

ads.init( admob, 286480765967, adListener )

The second parameter should be a string and is typically your banner app id for the platform you’re on.

Rob

Hi,

So I managed to run the ads in the balloon tap. Thanks. However trying to apply similar to my app isn’t working. No matter where I call the ad, it creates an error:

09:14:31.317  E:\Projects\Apps Games\Corona Projects\Blow Stuff Up\gameScene.lua:14: attempt to index global ‘ads’ (a nil value)

09:14:31.317  stack traceback:

09:14:31.317   [C]: in function ‘error’

09:14:31.317   ?: in function ‘gotoScene’

09:14:31.317   E:\Projects\Apps Games\Corona Projects\Blow Stuff Up\menuScene.lua:82: in function ‘touchEnded’

09:14:31.317   E:\Projects\Apps Games\Corona Projects\Blow Stuff Up\ragdogLib.lua:221: in function <E:\Projects\Apps Games\Corona Projects\Blow Stuff Up\ragdogLib.lua:195>

09:14:31.317   ?: in function <?:169>

Here’s my gameScene.lua code where I’m trying to call the banner ad:


local composer = require( “composer” )

local scene = composer.newScene()

local ragdogLib = require “ragdogLib”;

local networksLib = require “networksLib”;

–local adsLib = require “adsLib”;


– All code outside of the listener functions will only be executed ONCE unless “composer.removeScene()” is called.


– local forward references should go here

ads.show( “banner”, { appId= “ca-app-pub-7850831907211777/6394665048”, x=0, y=100000 } )

–let’s localize these values for faster reading

local totalWidth = _G.totalWidth;

local totalHeight = _G.totalHeight;

local leftSide = _G.leftSide;

local rightSide = _G.rightSide;

local topSide = _G.topSide;

local bottomSide = _G.bottomSide;

local centerX = display.contentCenterX;

local centerY = display.contentCenterY;

local buttonSFX = _G.buttonSFX;


– FOR REFERENCE:

– local poofSheetData = {width = 165, height = 180, numFrames = 5, sheetContentWidth = 825, sheetContentHeight = 180}

– local poofSheet = graphics.newImageSheet(“images/characters/poof.png”, poofSheetData)

– local poofSequenceData = {

– {name = “poof”, start = 1, count = 5, time = 250, loopCount = 1}

– }

local explosionSheetData = {width = 100, height = 100, numFrames = 8, sheetContentWidth = 800, sheetContentHeight = 100}

local explosionSheet = graphics.newImageSheet(“IMG/explosion.png”, explosionSheetData)

local explosionSequenceData = {

{name = “explosion”, start = 1, count = 8, time = 200, loopCount = 1}

}

local explosion

local circleScale = .8;

local arrowSpeed = 10;

local circleInitialSpeed = 1;

local speedIncreaseAtEveryPoint = .5;

local maxCircleSpeed = 20;

local circleSpeed;

local currentScore;

local minAngleToMakePoint = 330;

local maxAngleToMakePoint = 32;

local minRedAngleToMakePoint = 355;

local maxRedAngleToMakePoint = 4;

local pointsForHittingRed = 2;

local gameOverSFX, scorePointSFX, hittingRedSFX, shootSFX;

– “scene:create()”

function scene:create( event )

  --adsLib.showAd(“main_menu”);

  local sceneGroup = self.view;

  circleSpeed = 0;

  currentScore = 0;

  gameOverSFX = audio.loadSound(“SFX/gameOverSFX.mp3”);

  scorePointSFX = audio.loadSound(“SFX/scorePointSFX.mp3”);

  hittingRedSFX = audio.loadSound(“SFX/blast.wav”);

  shootSFX = audio.loadSound(“SFX/shootSFX.mp3”);

  local group = self.view;

  local bg = display.newImageRect(group, “IMG/bg.png”, totalWidth, totalHeight);

  bg.x, bg.y = centerX, centerY;

  local circle = display.newImageRect(group, “IMG/circle.png”, 164*circleScale, 164*circleScale);

  circle.x, circle.y = centerX, centerY-140;

  function circle:enterFrame()

    self.rotation = self.rotation+circleSpeed;

    if self.rotation > 360 then

      self.rotation = self.rotation-360;

    end

  end

  Runtime:addEventListener(“enterFrame”, circle);

  local shadow = display.newImageRect(group, “IMG/shadow.png”, 301*circleScale, 358*circleScale);

  shadow.x, shadow.y = circle.x-circle.contentWidth*.5+shadow.contentWidth*.5+10, circle.y-circle.contentHeight*.5+shadow.contentHeight*.5+10;

  circle:toFront();

  local line = display.newImageRect(group, “IMG/line.png”, 441, 3);

  line.x, line.y = centerX, centerY+180;

  local arrow = display.newImageRect(group, “IMG/triangle.png”, 18, 31);

  arrow.x, arrow.y = centerX, line.y-line.contentHeight*.5-arrow.contentHeight*.5-5;

  arrow.xStart, arrow.yStart = arrow.x, arrow.y;

  arrow.state = 0;

  function arrow:enterFrame()

    if self.state == 1 then

      if self.y-self.contentHeight*.5 <= circle.y+circle.height*.5 then

        if circle.rotation >= minAngleToMakePoint or circle.rotation <= maxAngleToMakePoint then

          if circleSpeed == 0 then

            circleSpeed = circleInitialSpeed;

          else

            circleSpeed = circleSpeed+speedIncreaseAtEveryPoint;

            if circleSpeed > maxCircleSpeed then

              circleSpeed = maxCircleSpeed;

            end

          end

          currentScore = currentScore+1;

          if circle.rotation >= minRedAngleToMakePoint or circle.rotation <= maxRedAngleToMakePoint then

            currentScore = currentScore+pointsForHittingRed;

            audio.play(hittingRedSFX, {channel = audio.findFreeChannel()});

explode(self.x, self.y)

          else

            audio.play(scorePointSFX, {channel = audio.findFreeChannel()});

          end

          transition.to(circle, {time = 100, xScale = 1.1, yScale = 1.1});

          transition.to(circle, {delay = 100, time = 50, xScale = 1, yScale = 1});

          self.state = 0;

          self.x, self.y = arrow.xStart, arrow.yStart;

        else

          self.isVisible = false;

          self.state = 2;

          self.time = 0;

          audio.play(gameOverSFX, {channel = audio.findFreeChannel()});

          for i = 1, 20 do

            local particle = display.newRect(group, 0, 0, 5, 5);

            particle.xSpeed = math.random(-30, 30)*.1;

            particle.ySpeed = math.random(20, 40)*.1;

            particle.x, particle.y = self.x, self.y-self.contentHeight*.5;

            function particle:enterFrame()

              self.x, self.y = self.x+self.xSpeed, self.y+self.ySpeed;

              self.alpha = self.alpha-0.01;

              if self.alpha <= 0 then

                Runtime:removeEventListener(“enterFrame”, self);

                self:removeSelf();

              end

            end

            Runtime:addEventListener(“enterFrame”, particle);

            circleSpeed = 0;

          end

        end

      end

      self.y = self.y-arrowSpeed;

    elseif self.state == 2 then

      self.time = self.time+1;

      if self.time >= 90 then

        Runtime:removeEventListener(“enterFrame”, self);

        _G.currentScore = currentScore;

        composer.gotoScene(“gameOverScene”, “fade”);

      end

    end

  end

  Runtime:addEventListener(“enterFrame”, arrow);

  local tapToStart = display.newText(group, “Tap to Start”, 0, 0, native.systemFont, 25);

  tapToStart.x, tapToStart.y = centerX, centerY;

  function bg:touch(event)

    if event.phase == “began” then

      if arrow.state == 0 then

        arrow.state = 1;

        audio.play(shootSFX, {channel = audio.findFreeChannel()});

        if tapToStart then

          transition.to(tapToStart, {time = 200, alpha = 0, onComplete = tapToStart.removeSelf});

          tapToStart = nil;

        end

      end

    end

  end

  bg:addEventListener(“touch”, bg);

  local scoreText = display.newText(group, currentScore, 0, 0, native.systemFont, 30);

  scoreText.x, scoreText.y = rightSide-10-scoreText.contentWidth*.5, topSide+10+scoreText.contentHeight*.5;

  function scoreText:enterFrame()

    self.text = currentScore;

    self.x, self.y = rightSide-10-self.contentWidth*.5, topSide+10+self.contentHeight*.5;

  end

  Runtime:addEventListener(“enterFrame”, scoreText);

  function explode(x, y)

– FOR REFERENCE:

– poof = display.newSprite(poofSheet, poofSequenceData)

– poof.x = x

– poof.y = y

– sceneGroup:insert(poof)

– poof:setSequence(“hurt”)

– poof:play()

– local function removePoof()

– if(poof ~= nil) then

– display.remove(poof)

– end

– end

– timer.performWithDelay(255, removePoof, 1)

explosion = display.newSprite(explosionSheet, explosionSequenceData)

explosion.x = x

explosion.y = y

sceneGroup:insert(explosion)

explosion:setSequence(“explosion”)

explosion:play()

local function removeExplosion()

if(explosion ~= nil) then

display.remove(explosion)

end

end

timer.performWithDelay(255, removeExplosion, 1)

  end

end

– “scene:show()”

function scene:show( event )

    local sceneGroup = self.view

    local phase = event.phase

    if ( phase == “will” ) then

        – Called when the scene is still off screen (but is about to come on screen).

    elseif ( phase == “did” ) then

        – Called when the scene is now on screen.

        – Insert code here to make the scene come alive.

        – Example: start timers, begin animation, play audio, etc.

    end

end

– “scene:hide()”

function scene:hide( event )

    local sceneGroup = self.view

    local phase = event.phase

    if ( phase == “will” ) then

      audio.dispose(gameOverSFX);

      gameOverSFX = nil;

      audio.dispose(scorePointSFX);

      scorePointSFX = nil;

      audio.dispose(hittingRedSFX);

      hittingRedSFX = nil;

      audio.dispose(shootSFX);

      shootSFX = nil;

      local removeAll;

      removeAll = function(group)

        if group.enterFrame then

          Runtime:removeEventListener(“enterFrame”, group);

        end

        if group.touch then

          group:removeEventListener(“touch”, group);

          Runtime:removeEventListener(“touch”, group);

        end

        for i = group.numChildren, 1, -1 do

          if group[i].numChildren then

            removeAll(group[i]);

          else

            if group[i].enterFrame then

              Runtime:removeEventListener(“enterFrame”, group[i]);

            end

            if group[i].touch then

              group[i]:removeEventListener(“touch”, group[i]);

              Runtime:removeEventListener(“touch”, group[i]);

            end

          end

        end

      end

      removeAll(self.view);

        – Called when the scene is on screen (but is about to go off screen).

        – Insert code here to “pause” the scene.

        – Example: stop timers, stop animation, stop audio, etc.

    elseif ( phase == “did” ) then

        – Called immediately after scene goes off screen.

    end

end

– “scene:destroy()”

function scene:destroy( event )

    local sceneGroup = self.view

    – Called prior to the removal of scene’s view (“sceneGroup”).

    – Insert code here to clean up the scene.

    – Example: remove display objects, save state, etc.

end


– Listener setup

scene:addEventListener( “create”, scene )

scene:addEventListener( “show”, scene )

scene:addEventListener( “hide”, scene )

scene:addEventListener( “destroy”, scene )


return scene

Try changing

local ads = require( "ads" )

to

ads = require( "ads" )

in main.lua.

You need to require ads in your scene. Near the top do:

local ads = require( “ads” )

@bgmadclown’s suggestion will also work, but it’s creating a global variable. In this case creating a global for ads isn’t a bad thing, but if you don’t have a firm grasp on scope, you will start leaning on globals to work around scope and that will lead to problems, so avoiding them is a healthy habit and the cost of a little more typing.

Rob

It works!! Thanks!

The other thing I’m trying to get working is the leaderboard. It’s supposed to automatically sign me in but it doesn’t. Hence when I click on the leaderboard button, nothing happens.

What can I do?

You are trying to make us do all the work for you. Sorry, I’m out.

Hey @admin2949, this thread is about AdMob. Asking about Leaderboards is called “hijacking the thread” and leads to confusion among people looking for solutions. When you need to change subjects please start a new thread or search for a similar thread for your question. It’s like been previously answered.

Rob

Can you post sample code?

Hi, Thanks for replying. Which file should I post code from?

You should post a “sample” code that would show us how you initialize and call Admob ads or you can directly take a look at the docs.

https://docs.coronalabs.com/plugin/ads-admob-v2/

Hi,

I know this isn’t exactly what you asked for but as mentioned, I obtained this source code a while back and I have no idea where the ads are being called. I’m hoping by showing you the files that I know where to start looking for the sample code you need.

Thanks

Sorry, there is nothing I can do about that. You need to check the docs and search for the corresponding function calls and post the sample code here.

ok. How about this approach. I’m trying out the balloon tutorial and here is the code I have for main.lua:

local ads = require( “ads” )

local bannerAppID = “ca-app-pub-nnnnnnnnnnn/nnnnnnnnn”  --for your iOS banner

local interstitialAppID = “ca-app-pub-nnnnnnnnnnn/nnnnnnnn”  --for your iOS interstitial

if ( system.getInfo( “platformName” ) == “Android” ) then

    bannerAppID = “ca-app-pub-7850831907211777/6394665048”  --for your Android banner

    interstitialAppID = “ca-app-pub-7850831907211777/8713846246”  --for your Android interstitial

end

local adProvider = “admob”

local function adListener( event )

end

ads.init( admob, 286480765967, adListener )

ads.show( “banner”, { x=0, y=100000 } )

Here’s the code for build.settings:

– For more information on build.settings see the Corona SDK Build Guide at:

https://docs.coronalabs.com/guide/distribution/buildSettings

settings =

{

    plugins =

    {

        [“plugin.google.play.services”] =

        {

            publisherId = “com.coronalabs”

        },

    },

}

orientation =

{

– Supported values for orientation:

– portrait, portraitUpsideDown, landscapeLeft, landscapeRight

default = “portrait”,

supported = { “portrait”, },

},

excludeFiles =

{

– Include only the necessary icon files on each platform

iphone = { “Icon-*dpi.png”, },

android = { “Icon.png”, “Icon-Small-*.png”, “Icon*@2x.png”, },

},

– iOS Section

iphone =

{

plist =

{

UIStatusBarHidden = false,

UIPrerenderedIcon = true, – set to false for “shine” overlay

–UIApplicationExitsOnSuspend = true, – uncomment to quit app on suspend

CFBundleIconFiles =

{

“Icon.png”,

“Icon@2x.png”,

“Icon-167.png”,

“Icon-60.png”,

“Icon-60@2x.png”,

“Icon-60@3x.png”,

“Icon-72.png”,

“Icon-72@2x.png”,

“Icon-76.png”,

“Icon-76@2x.png”,

“Icon-Small.png”,

“Icon-Small@2x.png”,

“Icon-Small@3x.png”,

“Icon-Small-40.png”,

“Icon-Small-40@2x.png”,

“Icon-Small-50.png”,

“Icon-Small-50@2x.png”,

},

},

},

– Android Section

android =

{

usesPermissions =

{

“android.permission.INTERNET”,

},

},

}