Windows Phone XNA创建简单局域网游戏

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

     XNA是微软推出的一个基于DirectX的.net平台游戏开发框架,用来开发XBOX和Windows桌面的游戏,后被移植到了silverlight和windows phone上。内部是一个game loop,不同于事件驱动模式,但也不难掌握,性能方面还是不错的。下面就用XNA创建一个简单的局域网游戏。

网络连接无外乎就是那么几个阶段,连接-发送、接收数据-断开。

用到的几个主要的类是:

复制代码
        using Microsoft.Xna.Framework.Net;
        //网络连接会话类
        NetworkSession networkSession;
        //发送packet的类
        PacketWriter packetWriter = new PacketWriter();
        //读取packet的类
        PacketReader packetReader = new PacketReader();
复制代码

游戏开始需要有一个人来创建一个session,然后有人来加入到你创建的游戏当中来。

创建游戏session:

复制代码
            // 创建一个session,最大人数2
            networkSession = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 2);
            networkSession.AllowHostMigration = true;
            networkSession.AllowJoinInProgress = false;
            //绑定join和left时间
            networkSession.GamerJoined += GamerJoined;
            networkSession.GamerLeft += GamerLeft;

        void GamerJoined(object sender, GamerJoinedEventArgs e)
        {
                //tag是一个object类型的容器,用来保存用户自定义的信息。
                e.Gamer.Tag = new entity;
        }

        void GamerLeft(object sender, GamerLeftEventArgs e)
        {
            networkSession.Dispose();
            networkSession = null;
        }
复制代码

加入游戏:

复制代码
            // 查找是否存在游戏session
            AvailableNetworkSessionCollection sessions =
                NetworkSession.Find(NetworkSessionType.SystemLink, 1, null);
            if (sessions.Count > 0)
            {
                //如果session存在,就加入到这个session中
                networkSession = NetworkSession.Join(sessions[0]);
                //绑定join和left事件,同上
                networkSession.GamerJoined += GamerJoined;
                networkSession.GamerLeft += GamerLeft;
            }
复制代码

加入到游戏session之后就开是玩家之间进行数据的传输和接收了。

复制代码
        protected void UpdateLocalPlayer(GameTime gameTime)
        {
            // 获取本地玩家
            LocalNetworkGamer localGamer = networkSession.LocalGamers[0];

            // 获取上面绑定到tag中的entity
            entity sprite = (entity )localGamer.Tag;

            // 写入数据到packetWriter中
            packetWriter.Write((int)1);
            packetWriter.Write(Vector.Zero);

            // 发送数据
            localGamer.SendData(packetWriter, SendDataOptions.InOrder);

        }
复制代码
复制代码
        protected void ProcessIncomingData(GameTime gameTime)
        {
            // 获取玩家
            LocalNetworkGamer localGamer = networkSession.LocalGamers[0];

            //是否有数据可读取
            while (localGamer.IsDataAvailable)
            {
                //接收数据
                NetworkGamer sender;
                localGamer.ReceiveData(packetReader, out sender);

                //忽略到自己发送的数据
                if (!sender.IsLocal)
                {
                    //读取数据到packetReader中
                    MessageType messageType = (int)packetReader.ReadInt32();
                }
            foreach (NetworkGamer gamer in networkSession.AllGamers)
            {
                if (!gamer.IsLocal)
                {
             //获取绑定到tag中的实体
            entity _e= ((entity)gamer.Tag);

            //读取packetReader中的数据
            Vector2 Pos = packetReader.ReadVector2();
                }

            //add some game logic here
            }
            }
        }
复制代码

在接收到数据之后就可以在Update方法中写游戏逻辑,最后Draw方法也很简单。

复制代码
            // 循环所有游戏玩家
            foreach (NetworkGamer gamer in networkSession.AllGamers)
            {
                //调用entity中的draw方法
                entity sprite = ((entity)gamer.Tag);
                sprite.Draw(gameTime, spriteBatch);
            }
复制代码

代码都很简单,一看就懂,感兴趣的朋友可以自己去找些资料来看。





 


作者: dgwutao
出处: http://www.cnblogs.com/ghostwutao/

关于作者:
从事微软平台解决方案的设计与实现。主要专注于Windows Phone应用开发。
新浪微博: @A-xel
E-mail:dgwutao#gmail.com

本文版权归作者所有,欢迎转载,且在文章页面明显位置给出原文连接。

 


dgwutao 2014-07-10 10:57:42

[新一篇] 宇宙射線毀滅外星生命?地球磁場保護生物安全

[舊一篇] Windows Phone中In-App Purchase應用內購買
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表