频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

.Net Framework智能版开发移动游戏

来源:yesky 作者:WAYNE 郭磊 出处:巧巧读书 2005-12-30 进入讨论组
上一页 1 2 3 4 5 6 7 下一页 
变动区域计算

  让我们研究一个移动的子图形,计算变动区域的一个简单的方法就是取得新图片和老图片界线的并集。

RefreshScreen(Rectangle.Union(sprite.PreviousBounds, sprite.Bounds));

  这里的RefreshScreen()是一个刷新屏内指定矩形区域的方法。

.Net Framework智能版开发移动游戏(图七)
图6.变化区域为新老边界并集

.Net Framework智能版开发移动游戏(图八)
图7.大的变动量产生大的变化区域

  注意 如果新旧坐标之间的变化量很大,或者子图形的尺寸很大,那么这种技术可能会产生一个不必要的大的变化区域,参看图7。

  在这种情况下,用单位矩形组合起来表示变动区域,计算子图形的变动区域非常有效。

  首先让我们看看新旧边界是否重叠。 如果没有重叠的话,我们可以分别把新旧两个的边界当成是两个独立的矩形来计算。 所以,如7所示方案,把新边界和旧边界作为两个不同的变化区域分别处理。

if (Rectangle.Intersection(sprite.PreviousBounds,
sprite.Bounds).IsEmpty)
{
// Dirty rectangle representing old bounds
RefreshScreen(sprite.PreviousBounds);

// Dirty rectangle representing current bounds
RefreshScreen(sprite.Bounds);
}

  如下图8所示,上面的技术也可以用到不必在乎重画重叠区两次的情况下。

.Net Framework智能版开发移动游戏(图九)
图8变化区域被分为新旧两个边界

  现在,让我们看看如何把新旧边界的重叠部分分成单位矩形用来计算变动区域,这样就不会把变动区域重复两次了,意思是所有的单位矩形都是互不相交的。

  首先,把新的边界作为整体单位。注意,这包括新旧边界的重叠部分。


  变化单位区域1:描述当前边界的变化矩形

RefreshScreen(sprite.Bounds);


.Net Framework智能版开发移动游戏(图十)
图9.变动区域被分解为几个单位。

  现在,把旧的边界中的不重叠部分分解成为两个独立的单位,见下面的代码:

Rectangle rcIx, rcNew;
// Calculate the overlapping intersection
rcIx = Rectangle.Intersection(sprite.PreviousBounds, sprite.Bounds);
变动区域单位2
rcNew = new Rectangle();
if (sprite.PreviousBounds.X < rcIx.X)
{
rcNew.X = sprite.PreviousBounds.X;
rcNew.Width = rcIx.X - sprite.PreviousBounds.X;
rcNew.Y = rcIx.Y;
rcNew.Height = rcIx.Height;
}
else
{
// Means sprite.PreviousBounds.X should equal to rcIx.X
rcNew.X = rcIx.X + rcIx.Width;
rcNew.Width = (sprite.PreviousBounds.X +
sprite.PreviousBounds.Width) - (rcIx.X + rcIx.Width);
rcNew.Y = rcIx.Y;
rcNew.Height = rcIx.Height;
}

RefreshScreen(rcNew);

  变动区域单位3

rcNew = new Rectangle();

if (sprite.PreviousBounds.Y < rcIx.Y)
{
rcNew.Y = sprite.PreviousBounds.Y;
rcNew.Height = rcIx.Y - sprite.PreviousBounds.Y;
rcNew.X = sprite.PreviousBounds.X;
rcNew.Width = sprite.PreviousBounds.Width;
}
else
{
rcNew.Y = rcIx.Y + rcIx.Height;
rcNew.Height = (sprite.PreviousBounds.Y +
sprite.PreviousBounds.Height) - (rcIx.Y + rcIx.Height);
rcNew.X = sprite.PreviousBounds.X;
rcNew.Width = sprite.PreviousBounds.Width;
}

RefreshScreen(rcNew);

浏览URL http://www.qqread.com/dotnet/u292184000.html 更多文章 更多内容请看游戏开发网络游戏攻略.NET Framework新手入门专题,或进入讨论组讨论。
上一页 1 2 3 4 5 6 7 下一页 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章