#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. Не понимаю тебя! Я считаю, что показывать один раз — это правильный путь. Или вы имеете в виду, что в последующих играх реклама не показывается.