XNA: 如何通过HTTP加载Texture2D 精灵

15 篇文章 0 订阅
4 篇文章 0 订阅
介绍

今天的范例将展示如何从Internet上下载图片然后在 XNA 游戏中展现出来。演示的图片如下图


在开始前请先注意以下几个重点:
- 此功能仅仅在Windows Games上保证运行正常,在Windows Phone 7上也许也没问题,但是我还没做过相关测试。毕竟对Windows Phone 7不感兴趣。

- 此功能不能在 XBOX Games 上启用。因为它需要使用命名空间 System.Net。你们去看看这个命名空间在XBOX所用的.NET Framework是没法使用的。

- 注意 XNA Game Studio 4.0 Refresh 已经对 Visual Basic 提供了支持。

- 本项目所以也是使用 Visual Basic 演示的。

为什么有这个想法
当我们在开发 XNA 的2D游戏时,我有一个想法就是能否从网络上通过HTTP下载一张图片作为Texture2D精灵。

因为一旦这个想法能够实现,就意味着我们的游戏关卡,图像资源,动态精灵都可以在网络上临时获取,这样游戏的可玩性潜能就被无限放大了。比如游戏中所用的地图从网络获取就能让玩家每次都有耳目一新的感觉。

工作原理
有一个已经包含了我们需要的方法且不可被继承的类。它维持着所有的临时文件(网络下载),以及当游戏介绍时所需要释放的数据流对象。
代码如下:
1' This uses System.Net.WebRequest to fetch a stream from the internet.
2Private Shared Function n_RemoteStream(URL As String) As IO.Stream


下面这个方法处理的更多但是需要来解释一下:
1Public Shared Function n_Remote_Texture2D(Graphics As GraphicsDevice, URL As String) As Texture2D


最后
1Public Shared Sub n_CleanupTempData()


n_Remote_Texture2D( ) 使用 n_RemoteStream( )通过 System.Net.WebRequest来获取流对象

其实一开始我打算用上面的 Stream 直接创建 Texture2D 的,但是发现Texture2D对象需要初始流的属性为IO.Stream.CanSeek=True

然而从Request.GetResponse().GetResponseStream()返回的 Stream 是没有 seek 能力的。这也导致了当将原始stream写入到其它stream时无法使用 Stream.ReadStream.Write 方法。

最后的解决办法是:
1,通过HTTP与WebRequest获取数据流
2,将stream用字节流方式写入到临时文件
3,从上面的临时文件读取流数据来创建Texture2D
4,维持这些临时文件直到游戏或者某个关卡结束

奇迹发生了,这是有效的,因为来自Web的stream是不可seek的,所以我们只能将它转换成 file stream 存储为临时文件。这些可以seek的file stream就能转换成需要的Texture2D了。虽然整个做法有点绕。

实际代码
1,需要一个Http资源作为Texture2D
2,测试结果
3,检测结果是否符合预期
4,当游戏或者某关卡结束时,清空临时文件

1:首先我向网络直接需求一个GIF文件,Texture2D支持PNG,JPEG以及GIF。这里使用LoadContent( )方法。
1' Request a texture2D from a location on the internet.
2        MyRemoteTexture2D = n_StreamHelper.n_Remote_Texture2D _
3                (
4                    GraphicsDevice,
5                    "http://s.codeproject.com/App_Themes/Std/Img/logo225x90.gif"
6                )


2:接着测试。如果网络异常或者本来就没有连接到网络,将无法显示任何东西。这里需要使用到LoadContent( )方法。
1' Test the result:
2       If MyRemoteTexture2D Is Nothing Then
3           MsgBox("Failed to download resource from the internet")
4           Me.Exit()
5       End If


3:显示结果。使用 SpriteBatch 在Draw( )方法中显示Texture2D。
01With spriteBatch
02            .Begin()
03   
04            ' Draw our texture2D at point 100, 100
05            .Draw(MyRemoteTexture2D, New Vector2(100, 100), Color.White)
06   
07            ' draw it again:
08            .Draw(MyRemoteTexture2D, New Vector2(100, 200), Color.White)
09   
10            ' and again:
11            .Draw(MyRemoteTexture2D, New Vector2(100, 300), Color.White)
12   
13            .End()
14        End With


4:当游戏结束或者关卡结束后需要将对应的临时文件删除,所以在UnloadContent( )方法中执行它是最适合的。
01''' <summary>
02 ''' UnloadContent will be called once per game and is the place to unload
03 ''' all content.
04 ''' </summary>
05 Protected Overrides Sub UnloadContent()
06     ' TODO: Unload any non ContentManager content here
07 
08     '  unload texture2D:
09     MyRemoteTexture2D.Dispose()
10 
11     ' clean up temp data. ALL Texture2D created from URI should be Disposed first:
12     ' --> otherwise some temp files won't be removed
13     n_StreamHelper.n_CleanupTempData()
14 
15 End Sub


如果一切顺利,你就能看到像下面这样的结果。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值