亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

關(guān)于在WP7的XNA開發(fā)模式中引入廣告(Ad)

系統(tǒng) 1653 0
昨天小弟發(fā)現(xiàn)自己犯了個(gè)很嚴(yán)重的錯(cuò)誤,那就是LGame的C#版啟動(dòng)類,在默認(rèn)情況下沒有調(diào)用父類Game的base.Update和base.Draw(base相當(dāng)于Java版的super),導(dǎo)致XNA本身的渲染機(jī)制無(wú)法生效(LGame本身的渲染是正常的,缺了此兩項(xiàng),只是意味著引入XNA組件時(shí),相關(guān)的XNA組件不會(huì)被渲染,操作也不會(huì)被執(zhí)行罷了……),連累著插入XNA的廣告組件也無(wú)法顯示(話說(shuō)改下源碼,在相關(guān)函數(shù)重載部分調(diào)用上述兩項(xiàng)就會(huì)正常了)~

為了彌補(bǔ)前失,所以小弟今天特意下載了一些支持XNA的廣告SDK,并且改進(jìn)了XNA與LGame的交互機(jī)制,做成了程序示例放入C#版中(只顯示廣告條和FPS的空項(xiàng)目,方便套用),下面是微軟提供的Advertising廣告,以及第三方XNA廣告組件wp7adrotator和LGame的混用示例。

Advertising

    using Loon;
using Loon.Utils.Debug;
using Loon.Core.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Advertising.Mobile.Xna;
using System.Diagnostics;
using System.Device.Location;
using System;

namespace LGameAd
{
    /// <summary>
    /// 構(gòu)建XNA監(jiān)聽,用以展示廣告
    /// </summary>
    public class ADListener : XNAListener
    {
        //Advertising測(cè)試用標(biāo)記(微軟硬性規(guī)定,只有傳這個(gè)才能啟動(dòng)Advertising測(cè)試)
        private static readonly string ApplicationId = "test_client";

        //廣告單元ID(測(cè)試時(shí)只支持4種顯示模式,就是Image480_80、Image480_80、Image300_50、TextAd,正式ID后才能自定義。)
        private static readonly string AdUnitId = "Image480_80";

        private DrawableAd bannerAd;

        //廣告驅(qū)動(dòng)定位器(用來(lái)通過(guò)GPS/AGPS找到你手機(jī)的物理位置)
        private GeoCoordinateWatcher gcw = null;

        /// <summary>
        /// LGame監(jiān)聽接口,用來(lái)監(jiān)聽標(biāo)準(zhǔn)XNA中Game類的構(gòu)建
        /// </summary>
        /// <param name="game"></param>
        public void Create(Game game)
        {

        }

        /// <summary>
        /// LGame監(jiān)聽接口,用來(lái)監(jiān)聽標(biāo)準(zhǔn)XNA中Initialize的啟動(dòng)
        /// </summary>
        public void Initialize(Game game)
        {
            //初始化AdGameComponent組件,并將其添加到游戲中
            AdGameComponent.Initialize(game, ApplicationId);
            game.Components.Add(AdGameComponent.Current);
            //創(chuàng)建一個(gè)新的廣告
            CreateAd(game);
        }

        /// <summary>
        /// LGame監(jiān)聽接口,用來(lái)監(jiān)聽標(biāo)準(zhǔn)XNA中LoadContent的啟動(dòng)
        /// </summary>
        public void LoadContent(Game game)
        {

        }

        /// <summary>
        /// LGame監(jiān)聽接口,用來(lái)監(jiān)聽標(biāo)準(zhǔn)XNA中UnloadContent的啟動(dòng)
        /// </summary>
        public void UnloadContent(Game game)
        {

        }

        /// <summary>
        /// LGame監(jiān)聽接口,用來(lái)監(jiān)聽標(biāo)準(zhǔn)XNA中Updatet的調(diào)用(每幀循環(huán)時(shí)都會(huì)調(diào)用)
        /// </summary>
        public void Update(Game game, GameTime gameTime)
        {

        }

        /// <summary>
        /// LGame監(jiān)聽接口,用來(lái)監(jiān)聽標(biāo)準(zhǔn)XNA中Draw的調(diào)用(每幀循環(huán)時(shí)都會(huì)調(diào)用)
        /// </summary>
        public void Draw(Game game, GameTime gameTime)
        {

        }

        /// <summary>
        /// 創(chuàng)建廣告
        /// </summary>
        private void CreateAd(Game game)
        {
            // 創(chuàng)建指定大小的廣告組件
            int width = 480;
            int height = 80;
            // 定位到屏幕中央上方
            int x = (game.GraphicsDevice.Viewport.Bounds.Width - width) / 2;
            int y = 5;

            bannerAd = AdGameComponent.Current.CreateAd(AdUnitId, new Rectangle(x, y, width, height), true);

            // 添加廣告事件監(jiān)聽
            bannerAd.ErrorOccurred += new EventHandler<Microsoft.Advertising.AdErrorEventArgs>(bannerAd_ErrorOccurred);
            bannerAd.AdRefreshed += new EventHandler(bannerAd_AdRefreshed);

            // 并不是立即激活廣告(在GPS定位成功后才激活)
            AdGameComponent.Current.Enabled = false;

            // 構(gòu)建定位器
            this.gcw = new GeoCoordinateWatcher();
            // 監(jiān)聽定位器活動(dòng)
            this.gcw.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(gcw_PositionChanged);
            this.gcw.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(gcw_StatusChanged);
            this.gcw.Start();
        }

        private void bannerAd_AdRefreshed(object sender, EventArgs e)
        {
            Log.DebugWrite("Ad received successfully");
        }

        private void bannerAd_ErrorOccurred(object sender, Microsoft.Advertising.AdErrorEventArgs e)
        {
            Log.DebugWrite("Ad error: " + e.Error.Message);
        }

        private void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
        {

            this.gcw.Stop();

            bannerAd.LocationLatitude = e.Position.Location.Latitude;
            bannerAd.LocationLongitude = e.Position.Location.Longitude;

            AdGameComponent.Current.Enabled = true;

            Log.DebugWrite("Device lat/long: " + e.Position.Location.Latitude + ", " + e.Position.Location.Longitude);
        }

        private void gcw_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
        {
            if (e.Status == GeoPositionStatus.Disabled || e.Status == GeoPositionStatus.NoData)
            {
                AdGameComponent.Current.Enabled = true;
                Log.DebugWrite("GeoCoordinateWatcher Status :" + e.Status);
            }
        }

        /// <summary>
        /// LGame監(jiān)聽接口,用來(lái)監(jiān)聽標(biāo)準(zhǔn)XNA中Dispose的調(diào)用(游戲結(jié)束時(shí)才會(huì)調(diào)用到)
        /// </summary>
        public void Dispose(Game game, bool disposing)
        {
            if (disposing)
            {
                if (this.gcw != null)
                {
                    this.gcw.Dispose();
                    this.gcw = null;
                }
            }
        }
    }

    public class Game1 : LFXPlus
    {
        public override void OnMain()
        {

            //加載LGame默認(rèn)資源(不進(jìn)行此操作,LGame內(nèi)置的模擬按鈕之類功能無(wú)法使用)
            XNAConfig.Load("assets/loon.def");
            //加載字體文件(此處是預(yù)編譯好的xnb文件,也可以加載Content下的)
            XNAFont = new LFont("assets", "black", 0, 20);

            //注冊(cè)AD監(jiān)聽(標(biāo)準(zhǔn)XNA事件監(jiān)聽)
            SetXNAListener(new ADListener());

            //設(shè)定啟動(dòng)參數(shù)
            LSetting setting = new LSetting();
            setting.fps = 60;
            setting.width = 480;
            setting.height = 320;
            setting.showFPS = true;
            setting.landscape = true;
            //注冊(cè)初始Screen
            Register(setting, typeof(ScreenTest));

        }

        public override void OnGameResumed()
        {

        }

        public override void OnGamePaused()
        {

        }
    }
}

  

然后,是利用wp7adrotator這個(gè)開源的第三方廣告組件,加載AdDuplex廣告(此物也支持Admob)。

關(guān)于在WP7的XNA開發(fā)模式中引入廣告(Ad)

    using System;
using System.Windows;
using AdRotatorXNA;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Loon;
using Loon.Core.Graphics;

namespace AdRotatorExampleXNA
{
    /// <summary>
    /// 創(chuàng)建XNA監(jiān)聽器(稍微解釋一下LGame中所謂的XNA監(jiān)聽器。本質(zhì)上說(shuō),LGame-XNA版其實(shí)就是一個(gè)XNA的封裝馬甲。所以此監(jiān)聽器的實(shí)際作用,就是
    /// 在LGame處理完畢后,把XNA應(yīng)有的操作權(quán)限在監(jiān)聽中顯示出來(lái)罷了~)
    /// </summary>
    public class ADListener : XNAListener 
    {

        public void Create(Game gamne)
        {

        }

        public void Initialize(Game game)
        {
            // 初始化廣告組件
            AdRotatorXNAComponent.Initialize(game);
            
            //硬編碼的話就填下面這些

            //AdRotatorXNAComponent.Current.PubCenterAppId = "test_client";
            //AdRotatorXNAComponent.Current.PubCenterAdUnitId = "Image480_80";

            //AdRotatorXNAComponent.Current.AdDuplexAppId = "0";

            //AdRotatorXNAComponent.Current.InneractiveAppId = "DavideCleopadre_ClockAlarmNightLight_WP7";

            //AdRotatorXNAComponent.Current.MobFoxAppId = "474b65a3575dcbc261090efb2b996301";
            //AdRotatorXNAComponent.Current.MobFoxIsTest = true;

            //讀取配置文件的話就填下面這些(本例為讀取AdDuplex的測(cè)試廣告,AdRotator也支持Admob廣告)

            //定位廣告位置
            AdRotatorXNAComponent.Current.AdPosition = new Vector2(0,720);

            //設(shè)定默認(rèn)的廣告圖片
            AdRotatorXNAComponent.Current.DefaultHouseAdImage = game.Content.Load<Texture2D>(@"Content/AdRotatorDefaultAdImage");

            //當(dāng)點(diǎn)擊默認(rèn)廣告時(shí),指向此操作。
            AdRotatorXNAComponent.Current.DefaultHouseAdClick += new AdRotatorXNAComponent.DefaultHouseAdClickEventHandler(Current_DefaultHouseAdClick);

            //用以選擇廣告幻燈效果的彈出方向
            AdRotatorXNAComponent.Current.SlidingAdDirection = SlideDirection.None;

            //選擇本地的廣告配置文件地址(針對(duì)不同的廣告商,此處配置效果不同,以具體廣告商提供的配置方式為準(zhǔn))
            AdRotatorXNAComponent.Current.DefaultSettingsFileUri = "defaultAdSettings.xml";

            //設(shè)定遠(yuǎn)程配置文件(可選項(xiàng),非必填)
            AdRotatorXNAComponent.Current.SettingsUrl = "http://xna-uk.net/adrotator/XNAdefaultAdSettingsV2.xml";

            //添加廣告組件到XNA畫面當(dāng)中
            game.Components.Add(AdRotatorXNAComponent.Current);

        }

        void Current_DefaultHouseAdClick()
        {
            try
            {
                MessageBox.Show("非常感謝您點(diǎn)了小弟的廣告^_^");
            }
            catch { }
        }

        public void LoadContent(Game game)
        {

        }

        public void UnloadContent(Game game)
        {

        }

        public void Update(Game game,GameTime gameTime)
        {
 
        }

        public void Draw(Game game, GameTime gameTime)
        {

        }

        public void Dispose(Game game, bool close)
        {

        }

    }

    public class Game1 : LFXPlus
    {
        public override void OnMain()
        {

            //加載LGame默認(rèn)資源(不進(jìn)行此操作,LGame內(nèi)置的模擬按鈕之類功能無(wú)法使用)
            XNAConfig.Load("content/loon.def");
            //加載字體文件(此處是預(yù)編譯好的xnb文件 PS:當(dāng)自定義資源文件夾命名為Content時(shí),
            //打包后會(huì)自動(dòng)和標(biāo)準(zhǔn)的Content文件夾合并,這里做個(gè)演示。另,Windows系統(tǒng)不區(qū)分文件
            //名大小寫)
            XNAFont = new LFont("content", "black", 0, 20);

            //注冊(cè)AD監(jiān)聽(標(biāo)準(zhǔn)XNA事件監(jiān)聽)
            SetXNAListener(new ADListener());

            //設(shè)定啟動(dòng)參數(shù)
            LSetting setting = new LSetting();
            setting.fps = 60;
            setting.width = 480;
            setting.height = 320;
            setting.showFPS = true;
            setting.landscape = false;
            //注冊(cè)初始Screen
            Register(setting, typeof(ScreenTest));

        }

        public override void OnGameResumed()
        {

        }

        public override void OnGamePaused()
        {

        }
    }
}

  

關(guān)于在WP7的XNA開發(fā)模式中引入廣告(Ad)
雖然目前很多Ad廠商只提供了Silverlight的廣告SDK支持,但若考慮到國(guó)外第三方開發(fā)者的貢獻(xiàn),其實(shí)幾乎所有常見WP7 Ad SDK(國(guó)外),都有辦法通過(guò)XNA進(jìn)行部署,并不一定非要Silverlight支持。

——但是,國(guó)內(nèi)的廣告商們似乎就沒這么好運(yùn)了。

今天(周二)試驗(yàn)了一下Silverlight+XNA混用,如預(yù)想中很好實(shí)現(xiàn),目前已經(jīng)添加了一個(gè)名為L(zhǎng)Silverlight-0.3.3.dll的新編譯文件與相關(guān)源碼到WP7部分,等周五上傳后就能支持Silverlight了(不立即傳,是因?yàn)樾〉苣壳鞍姹径嚅_(Java、C#、C/C++、HTML5(JS)),只能攢夠修正一起來(lái)-_-|||),具體寫法如下所示:

    namespace LGameTest
{
    using System.Windows;
    using System.Windows.Navigation;
    using Loon;
    using Loon.Core.Graphics;
    using Loon.Core.Input;
    using Loon.Core.Timer;
    using Loon.Core.Graphics.OpenGL;
    using Microsoft.Phone.Controls;

    public class ScreenTest : Screen
    {

        public override LTransition OnTransition()
        {
            return LTransition.NewEmpty();
        }

        public override void OnLoad()
        {

        }

        public override void Alter(LTimerContext c)
        {

        }

        public override void Draw(GLEx g)
        {
         
        }

        public override void TouchDown(LTouch touch)
        {

        }

        public override void TouchDrag(LTouch e)
        {

        }

        public override void TouchMove(LTouch e)
        {

        }

        public override void TouchUp(LTouch touch)
        {

        }

    }

    //微軟硬性規(guī)定此處的PhoneApplicationPage必須是原始類,所以LGame在使用Silverlight時(shí)就只能采取如下加載方式了……
    public partial class GamePage : PhoneApplicationPage
    {

        LSilverlightPlus plus;

        public GamePage()
        {
            InitializeComponent();
            //加載Silverlight數(shù)據(jù)到LGame
            plus = LSilverlightPlus.Load(this, (Application.Current as App).Content, OnMain);
        }

        /// <summary>
        /// 初始化事件
        /// </summary>
        /// <param name="plus"></param>
        public void OnMain(LSilverlightPlus plus)
        {

            //加載LGame默認(rèn)資源(不進(jìn)行此操作,LGame內(nèi)置的模擬按鈕之類功能無(wú)法使用)
            XNAConfig.Load("assets/loon.def");
            //加載字體文件(此處是預(yù)編譯好的xnb文件,也可以加載Content下的)
            plus.XNAFont = new LFont("assets", "black", 0, 20);

            //設(shè)定啟動(dòng)參數(shù)
            LSetting setting = new LSetting();
            setting.fps = 60;
            setting.width = 480;
            setting.height = 320;
            setting.showFPS = true;
            setting.landscape = false;
            //注冊(cè)初始Screen
            plus.Register(setting, typeof(ScreenTest));

        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (plus != null)
            {
                plus.OnNavigatedTo(e);
                base.OnNavigatedTo(e);
            }
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            if (plus != null)
            {
                plus.OnNavigatedFrom(e);
                base.OnNavigatedFrom(e);
            }
        }

    }
}
  



為了能兼顧國(guó)內(nèi)的第三方廣告商,所以小弟周五將添加Silverlight+XNA的混用類庫(kù)(其實(shí)代碼修改量很小,主要集中于渲染和輸入輸出接口部分,但小弟不做也不會(huì)憑空出現(xiàn)吧……望天……),到時(shí)會(huì)將上述修正一并上傳到SVN。

——————————————

下面順手發(fā)個(gè)微軟與蘋果平板發(fā)布時(shí)的對(duì)比視頻,話說(shuō)55秒開始神作了。

蘋果iPad和微軟Surface發(fā)布會(huì)對(duì)比視頻


關(guān)于在WP7的XNA開發(fā)模式中引入廣告(Ad)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 四虎影视永久在线精品免费 | 国内自拍一二三四2021 | 香蕉视频毛片 | 综合色亚洲 | 一级毛片在线观看视频 | 四虎院影永久在线观看 | 伊人丁香狠狠色综合久久 | 四虎精品成人免费永久 | 四虎国产精品成人永久免费影视 | 精品国产一区二区三区四区色 | 天堂va亚洲va欧美va国产 | 免费观看日本a毛片 | 寡妇野外啪啪一区二区 | 99国产超薄丝袜足j在线观看 | 97视频免费播放观看在线视频 | 欧美不卡一区 | 中文字幕一二三区乱码老 | 亚洲男人的天堂在线视频 | 日韩一及片| 99久久成人 | 成人网中文字幕色 | 中文字幕日韩欧美一区二区三区 | 亚洲精品国产一区二区图片欧美 | 国内精品不卡一区二区三区 | 五月激情综合网 | 欧美日韩不卡中文字幕在线 | 亚洲国产综合精品 | 极品福利在线 | 国语性猛交xxxx乱大交 | 国产成人精品.一二区 | 26uuu欧美| 久久好看视频 | 91亚洲精品国产第一区 | 精品国产国产综合精品 | 亚洲欧美日韩高清中文在线 | 九九热在线视频观看这里只有精品 | 非洲黑人xxxxxbbbbbb | 婷婷色中文字幕 | 国内精品久久久久激情影院 | 成年女人视频在线观看免费 | 免费观看一区二区 |