Хочу показывать рекламу AdMob в моей игре после завершения игры

#android #admob #cocos2d-android

#Android #admob #cocos2d-android

Вопрос:

Здравствуйте, я хочу показывать рекламу (промежуточную) после каждой игры, но я сталкиваюсь с некоторыми проблемами. Может кто-нибудь, пожалуйста, помочь мне реализовать AdMob interstitial? Во всем исходном коде есть только один класс, который расширяет активность. Я знаю, как реализовать AdMob interstitial в приложении, но я раньше не использовал его в игре. Куда я должен добавить код и что это за код? Спасибо.

Это мой игровой код на экране.

     public class GameOverScene extends CCLayer {
        //fields
        private SoundManager _soundMananger;
        private CCSprite _background;

        private CCMenu _menu;
        private CCMenu _restart;

        private CCLabel _yourScore; 
        private CCLabel _bestScore;
        //methods
        public static CCScene scene() {
            CCScene scene = CCScene.node();
            GameOverScene layer = new GameOverScene();      
            scene.addChild(layer);
            return scene;
        }

        public GameOverScene() {
            super();
            BeetleshotMainActivity.app.setHideAdView(false);
            _soundMananger = SoundManager.sharedSoundResourceManager();
            CGSize size = CCDirector.sharedDirector().winSize();
            float scaleX = size.width / 768.0f;
            float scaleY = size.height / 1024.0f;

            if (BeetleshotMainActivity.app._soundplay == true) {
                _soundMananger.bStopMenuSound();
                _soundMananger.bPlayMenuSound();
            }

            _background = CCSprite.sprite("Image/Gameover and Clear/Over_Bg.png");
            _background.setScaleX(scaleX);
            _background.setScaleY(scaleY);
            _background.setPosition(CGPoint.ccp(size.width/2, size.height/2));
            this.addChild(_background);

            CCMenuItemImage menuItem = CCMenuItemImage.item("Image/Gameover and Clear/MaiinNenu_n.png", "Image/Gameover and Clear/MaiinNenu_d.png", this, "menuAction");
            menuItem.setScaleX(scaleX);
            menuItem.setScaleY(scaleY);
            _menu = CCMenu.menu(menuItem);
            _menu.setPosition(CGPoint.ccp(size.width*1.0f/2.0f, size.height*3.0f/10.0f));
            this.addChild(_menu);

            menuItem.setPosition(CGPoint.ccp(menuItem.getPosition().x-50.0f, menuItem.getPosition().y));
            CCMoveBy dropTitle = CCMoveBy.action(1.5f, CGPoint.ccp(50.0f, 0.0f));
            CCEaseBounceOut easeDrop = CCEaseBounceOut.action(dropTitle);
            menuItem.runAction(easeDrop);

            CCMenuItemImage restartItem = CCMenuItemImage.item("Image/Gameover and Clear/Restart_n.png", "Image/Gameover and Clear/Restart_d.png", this, "restartAction");
            restartItem.setScaleX(scaleX);
            restartItem.setScaleY(scaleY);
            _restart = CCMenu.menu(restartItem);
            _restart.setPosition(CGPoint.ccp(size.width/2.0f, (float) (size.height*4.2f/10.0f)));
            this.addChild(_restart);

            restartItem.setPosition(CGPoint.ccp(restartItem.getPosition().x 50.0f, restartItem.getPosition().y));
            dropTitle = CCMoveBy.action(1.5f, CGPoint.ccp(-50.0f, 0.0f));
            easeDrop = CCEaseBounceOut.action(dropTitle);
            restartItem.runAction(easeDrop);


    //      CCMenuItemImage shareI = CCMenuItemImage.item("Image/MainMenu/share.png", "Image/MainMenu/Share.png", this, "Share");
            fb.setScaleX(scaleX);
            fb.setScaleY(scaleY);
            _restart = CCMenu.menu(shareI);
            _restart.setPosition(CGPoint.ccp(size.width/2.0f, (float) (size.height*1.5f/10.0f)));
            this.addChild(_restart);

            shareI.setPosition(CGPoint.ccp(restartItem.getPosition().x 50.0f, restartItem.getPosition().y));
            dropTitle = CCMoveBy.action(1.5f, CGPoint.ccp(-160.0f, 0.0f));
            easeDrop = CCEaseBounceOut.action(dropTitle);
            shareI.runAction(easeDrop);

I wan to handle the click.. How do i Do that? I want to show createChooser dialog when user press on the share icon.

            Intent iShare = new Intent(Intent.ACTION_SEND);
        iShare.setType("text/plain");
        iShare.putExtra(Intent.EXTRA_SUBJECT, "Download The Game");
        iShare.putExtra(Intent.EXTRA_TEXT, "Get The Game" " " "https://play.google.com/store/apps/details?id=com.jdtfans.jdtfootballkickers");
        startActivity(Intent.createChooser(iShare,"Share Via"));


Above code i want to use when user press share icon. How do i do that?


            float scaleFactor = CCDirector.sharedDirector().winSize().height/1024 * 2.3f;

            _yourScore = CCLabel.makeLabel(String.format("%d", BeetleshotMainActivity.app._score), CGSize.make(120.0f*scaleFactor, 60.0f*scaleFactor), TextAlignment.CENTER, "Font/Imagica.ttf", 24.0f*scaleFactor);_yourScore.setPosition(CGPoint.ccp(size.width*1.32f/2.0f, (float) (size.height*1.12/2.0f)));

            this.addChild(_yourScore);
            _yourScore.setColor(ccColor3B.ccBLUE);

            // add this 
            _bestScore = CCLabel.makeLabel(String.format("%d", GameScene._hScoreValue), CGSize.make(120.0f*scaleFactor, 60.0f*scaleFactor), TextAlignment.CENTER, "Font/Imagica.ttf", 24.0f*scaleFactor);_bestScore.setPosition(CGPoint.ccp(size.width*1.32f/2.0f, (float) (size.height*1/2.0f)));

            this.addChild(_bestScore);
            _bestScore.setColor(ccColor3B.ccBLUE);
            //
            switch(BeetleshotMainActivity.app._locationLevel) {
                case 1:
                    BeetleshotMainActivity.app._level = 1;
                    break;
                case 2:
                    BeetleshotMainActivity.app._level = 2;
                    break;
                case 3:
                    BeetleshotMainActivity.app._level = 3;
                    break;
                default:
                    break;
            }

            int currentScore = BeetleshotMainActivity.app._score;   
            BeetleshotMainActivity.app._score = 0;      

            if (BeetleshotMainActivity.app._location == 1) {
                switch(BeetleshotMainActivity.app._locationLevel) {
                    case 1:
                        BeetleshotMainActivity.app.loadScore("score1");
                        break;
                    case 2:
                        BeetleshotMainActivity.app.loadScore("score2");
                        break;
                    case 3:
                        BeetleshotMainActivity.app.loadScore("score3");
                        break;
                    default:
                        break;
                }
            }

            if (currentScore > BeetleshotMainActivity.app._score) {
                BeetleshotMainActivity.app._score = currentScore;

                if (BeetleshotMainActivity.app._location == 1) {
                    switch(BeetleshotMainActivity.app._locationLevel) {
                        case 1:
                            BeetleshotMainActivity.app.saveScore("score1");
                            break;
                        case 2:
                            BeetleshotMainActivity.app.saveScore("score2");
                            break;
                        case 3:
                            BeetleshotMainActivity.app.saveScore("score3");
                            break;
                        default:
                            break;
                    }
                }
            }
        }

        public void menuAction(Object sender) {
            if (BeetleshotMainActivity.app._soundplay == true)
                _soundMananger.ePlayButtonClickSound();     
            CCDirector.sharedDirector().replaceScene(CCFadeTransition.transition(0.7f, MenuScene.scene()));
        }

        public void restartAction(Object sender) {
            if (BeetleshotMainActivity.app._soundplay == true)
                _soundMananger.ePlayButtonClickSound();     
            CCDirector.sharedDirector().replaceScene(CCFadeTransition.transition(0.7f, GameScene.scene()));
        }

    }




This is my only activity class that i have in my project.


        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            app = this;
            mContext = this;
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            ccMacros.CCLOG("BeetleShot Game", "OnCreate");

            RelativeLayout layout = new RelativeLayout(this);
            layout.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

            mGLSurfaceView = new CCGLSurfaceView(this);

            // Create the adView
            adView = new AdView(this, AdSize.BANNER, ADMOB_PUBLISH_ID);

            // Initiate a generic request to load it with an ad
            adView.loadAd(new AdRequest());
            adView.setAdListener(this);
            // Add the adView to it
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
            params.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
            adView.setLayoutParams(params);

            layout.addView(mGLSurfaceView);
            layout.addView(adView);
            ////


            // create the interstitial
            interstitial = new InterstitialAd(this, "**********");

            // load interstitialAd
            Ads.loadInterstitialAd(interstitial);

            // set Ad Listener to use the callbacks below
            interstitial.setAdListener(this);
            setContentView(layout);

            CCDirector.sharedDirector().attachInView(mGLSurfaceView);
            CCDirector.sharedDirector().setDisplayFPS(false);
            CCDirector.sharedDirector().setAnimationInterval(1.0f / 30);

            CCTexture2D.setDefaultAlphaPixelFormat(Config.ARGB_8888);

            _soundplay = true;
            _playerSound = true;
            _controlShow = false;
            _playerPos = 1;
            _level = 1;
            _firstBonus = 0;
            _secondBonus = 0;
            _thirdBonus = 0;
            _locationLevel = 1;

            CCDirector.sharedDirector().runWithScene(LogoScene.scene());
        }

        @Override
        protected void onStart() {
            super.onStart();
        }

        @Override
        protected void onResume() {
            super.onResume();       
            CCDirector.sharedDirector().onResume();
        }

        @Override
        protected void onPause() {
            super.onPause(); 
            SoundManager.sharedSoundResourceManager()._soundEngine.pauseSound();
            CCDirector.sharedDirector().onPause();
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();      
            CCDirector.sharedDirector().end();
        SoundManager.releaseSoundResourceManager();
        }

        public void loadScore (String filename) {
            try {
                ccMacros.CCLOG("file reading", "reading scores from "   filename);
                FileInputStream fIn = openFileInput(filename);
                InputStreamReader isr = new InputStreamReader(fIn);
                char[] buf = new char[6];
                isr.read(buf);
                _score = Integer.parseInt(new String(buf).trim());
                isr.close();
                fIn.close();
                ccMacros.CCLOG("file reading result", ""   _score);
            } catch (Exception e) {
            }
        }

        public void saveScore (String filename) {
            try {
                ccMacros.CCLOG("file writing", "writing scores to "   filename);
                FileOutputStream fOut = openFileOutput(filename, MODE_WORLD_READABLE);
                OutputStreamWriter osw = new OutputStreamWriter(fOut); 
                osw.write(""   _score);
                osw.flush();
                osw.close();
                fOut.close();
            } catch (Exception e) {
            }
        }

        public CGPoint getBufPlayerPos() {
            return _m_playerPos;
        }

        public void setBufPlayerPos (CGPoint rpos) {
            _m_playerPos = rpos;
        }

        // Admob Setting


        public void onDismissScreen(Ad arg0) {
            // TODO Auto-generated method stub

        }

        public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
            // TODO Auto-generated method stub

        }

        public void onLeaveApplication(Ad arg0) {
            // TODO Auto-generated method stub

        }

        public void onPresentScreen(Ad arg0) {
            // TODO Auto-generated method stub

        }

        public void onReceiveAd(Ad arg0) {
            // TODO Auto-generated method stub
            //Log.d(TAG, "              New admob has received!               ");
        }


        Handler handler = new Handler() {
            public void handleMessage(Message msg) {
                if(msg.what == 0) {
                    adView.setVisibility(View.INVISIBLE);
                }
                else {
                    adView.setVisibility(View.VISIBLE);         
                }
            }
        };

        public void setHideAdView(boolean bHide) {
            if(bHide) {
                handler.sendEmptyMessage(0);
            }
            else {
                handler.sendEmptyMessage(1);            
            }
        }

    }
  

Комментарии:

1. Является ли родительский класс «CCLayer» активностью?

2. Нет … это не активность

3. Вы можете определить интерфейс, используя его объект listener для вызова рекламы. Опубликуйте базовое действие, чтобы я мог хорошо ответить на ваш вопрос. Спасибо

4. привет, я обновил коды. Пожалуйста, проверьте и помогите мне. Спасибо.

5. Могу ли я узнать класс, который расширяет активность? CCLayer?

Ответ №1:

Обычно для этого используется шаблон оформления фасада, но поскольку у вас уже есть доступ к контексту действия в вашем классе сцены через BeetleshotMainActivity.app, вы можете использовать его следующим образом:

В основном классе Activity определите метод для показа промежуточной рекламы. Вы можете использовать обработчик, как вы делали с помощью метода setAdView(), но использовать runOnUiThread намного проще:

 public void showInterstitialAd() {  
 runOnUiThread(new Runnable(){
        @Override
        public void run() {
            if (interstitial != null amp;amp; interstitial.isReady())
            interstitial.show();
        }        
     });
  

}

Затем в вашем конструкторе game over просто покажите промежуточную рекламу следующим образом:

  public GameOverScene() {
        super();
        BeetleshotMainActivity.app.setHideAdView(false);
         BeetleshotMainActivity.app.showInterstitialAd();
           -----
           ------
}
  

Метод обратного вызова onDismissScreen вызывается, когда пользователь возвращается к активности после нажатия на объявление. Таким образом, вы можете «перезагрузить» промежуточную рекламу, когда она вызывается, чтобы реклама показывалась в последующих игровых кадрах:

  public void onDismissScreen(Ad arg0) {
        // TODO Auto-generated method stub

 // create the interstitial
        interstitial = new InterstitialAd(this, "***********");

        // load interstitialAd
        Ads.loadInterstitialAd(interstitial);

        // set Ad Listener to use the callbacks below
        interstitial.setAdListener(this);
   }
  

Комментарии:

1. Метод run() типа new Runnable(){} должен переопределять метод суперкласса… Я получаю эту ошибку..

2. Рад, что смог помочь 🙂

3. Ты мне очень помог.. Большое вам спасибо.. Надеюсь получить от вас помощь в будущем.. Спасибо.! Ты молодец.

4. Я столкнулся с одной проблемой, которая заключается в том, что реклама показывается только один раз после завершения игры… не могли бы вы мне с этим помочь?

5. Не понимаю тебя! Я считаю, что показывать один раз — это правильный путь. Или вы имеете в виду, что в последующих играх реклама не показывается.