[3]这下该有的都有了
到上次为止我已经能够帖帧动画并让它移动。这样的贴图系统已经可以满足大部分业余2D游戏的主要要求了。然而仅仅是这样肯定不够,还差了些东西。
差些什么呢?……阿尔法混合(半透明效果),缩放和旋转,实时绘图(画选取框之类的简单几何图形),字符显示,调色。
都是很重要的东西。那么就先从阿尔法开始。
这个太容易了。前面贴图不是用的sprite.Draw()么?用这个就可以了。如下:
sprite.Draw(texture[0], new Rectangle(i * 48, 34 * 48, 48, 48), Vector3.Empty, BugMove(), Color.FromArgb(255, Color.White));
看最后面的Color参数,上次仅仅是Color.White,现在这里是Color.FromArgb(255,Color.White)。很明显,255就是阿尔法值。从零——完全透明,到255——完全不透明。此外后面的Color.White就可以用来控制调色板。如果设置为Color.Red的话图像就会呈红色调。ok两个问题解决了。
就是这么简单。玩ManagedDirectX就像走迷宫。总是绕了大半天弯路以后突然发现“靠,出口就在那儿啊!!”
至于图形的变换(缩放和旋转),这里用矩阵来做。
private Matrix trans;
trans = Matrix.Scaling(3, 3, 0);
sprite.Transform = trans;
sprite.Draw(
)
就是如此。这里是把图像横纵方向拉伸3倍。矩阵变换同样还可以进行旋转,只要给出个向量就可以了。很方便。需要注意的是,如果不想让以后所有的贴图操作都应用现在的变换,那么进行完需要变换的操作以后必须把sprite的变换矩阵还原为恒等阵。
sprite.Transform = Matrix.Identity;
下一个,实时绘图。
现在没有GDI+和DDraw里面那些方便的DrawRectangle阿DrawLine阿之类的东西了。在Managed D3D里的实时绘图要用到Line类,要画其他几何图形都要用Line来组合(改天我去弄本计算机图学好了)。Line是和Sprite一个等级的东西,也有Begin和End。所以要在所有Sprite结束后,开始Line的操作。
也就是说这样:
device.BeginSence(
);
![](/Images/OutliningIndicators/None.gif)
sprite.Begin(
);
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
sprite.End();
![](/Images/OutliningIndicators/None.gif)
line.Begin();
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
line.End();
![](/Images/OutliningIndicators/None.gif)
device.EndSence();
device.Present();
先画sprite,再画line。否则sprite会把line遮住。
在场景中,绘制总是从上到下进行,上面的操作结果会被下面的操作结果遮住。在实际应用中要分层绘图,先把底层的画上,然后再画更高的图层。
最后,就是在场景中写字。
为了显示字符,我们需要一个Font对象。
private Microsoft.DirectX.Direct3D.Font font;
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
private void Init()
{
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
font = new Microsoft.DirectX.Direct3D.Font(device, this.Font);
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
}这里稍微偷一下懒,直接用窗体字体。当然如果不满意你也可以指定一个字体。
写字的操作放在sprite.Begin()和sprite.End()之间。
sprite.Begin(
);
font.DrawText(sprite, "%$#$#%^&", 50, 50, Color.Black);
sprite.End();
这里DrawText方法的第一个参数是sprite,第二个参数就是你想要显示的字符。第三第四是写字的位置,最后是字的颜色。如果想要调整字体大小,在实例化font对象的时候就要指定。
此外font还有其他很多有用的方法,比如预读取文字之类。不是重点。
同样,只要有允许argb表示的重载方法,就可以使用半透明。比如DrawText就有一个可以用int表示Color的重载,那这里的Color.Black完全可以改成Color.FromArgb(255,Color.Black)。
好了,该结束了。基本的用法已经差不多全部掌握了,接下来要怎么封装那才是真本事。封装的方法因人而异,我也不能随便误导他人。那么这个工作我们就各做各的吧。Over。
差些什么呢?……阿尔法混合(半透明效果),缩放和旋转,实时绘图(画选取框之类的简单几何图形),字符显示,调色。
都是很重要的东西。那么就先从阿尔法开始。
这个太容易了。前面贴图不是用的sprite.Draw()么?用这个就可以了。如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
就是这么简单。玩ManagedDirectX就像走迷宫。总是绕了大半天弯路以后突然发现“靠,出口就在那儿啊!!”
至于图形的变换(缩放和旋转),这里用矩阵来做。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
下一个,实时绘图。
现在没有GDI+和DDraw里面那些方便的DrawRectangle阿DrawLine阿之类的东西了。在Managed D3D里的实时绘图要用到Line类,要画其他几何图形都要用Line来组合(改天我去弄本计算机图学好了)。Line是和Sprite一个等级的东西,也有Begin和End。所以要在所有Sprite结束后,开始Line的操作。
也就是说这样:
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
先画sprite,再画line。否则sprite会把line遮住。
在场景中,绘制总是从上到下进行,上面的操作结果会被下面的操作结果遮住。在实际应用中要分层绘图,先把底层的画上,然后再画更高的图层。
最后,就是在场景中写字。
为了显示字符,我们需要一个Font对象。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
写字的操作放在sprite.Begin()和sprite.End()之间。
![](/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/dot.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
这里DrawText方法的第一个参数是sprite,第二个参数就是你想要显示的字符。第三第四是写字的位置,最后是字的颜色。如果想要调整字体大小,在实例化font对象的时候就要指定。
此外font还有其他很多有用的方法,比如预读取文字之类。不是重点。
同样,只要有允许argb表示的重载方法,就可以使用半透明。比如DrawText就有一个可以用int表示Color的重载,那这里的Color.Black完全可以改成Color.FromArgb(255,Color.Black)。
好了,该结束了。基本的用法已经差不多全部掌握了,接下来要怎么封装那才是真本事。封装的方法因人而异,我也不能随便误导他人。那么这个工作我们就各做各的吧。Over。