[3]这下该有的都有了

到上次为止我已经能够帖帧动画并让它移动。这样的贴图系统已经可以满足大部分业余2D游戏的主要要求了。然而仅仅是这样肯定不够,还差了些东西。

差些什么呢?……阿尔法混合(半透明效果),缩放和旋转,实时绘图(画选取框之类的简单几何图形),字符显示,调色。

都是很重要的东西。那么就先从阿尔法开始。

这个太容易了。前面贴图不是用的sprite.Draw()么?用这个就可以了。如下:
            sprite.Draw(texture[0], new Rectangle(i * 4834 * 484848), 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(330);
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();

sprite.Begin();

sprite.End();

line.Begin();

line.End();

device.EndSence();
device.Present();


先画sprite,再画line。否则sprite会把line遮住。

在场景中,绘制总是从上到下进行,上面的操作结果会被下面的操作结果遮住。在实际应用中要分层绘图,先把底层的画上,然后再画更高的图层。



最后,就是在场景中写字。

为了显示字符,我们需要一个Font对象。

private Microsoft.DirectX.Direct3D.Font font;


private void Init()
{

font 
= new Microsoft.DirectX.Direct3D.Font(device, this.Font);

}
这里稍微偷一下懒,直接用窗体字体。当然如果不满意你也可以指定一个字体。

写字的操作放在sprite.Begin()和sprite.End()之间。

sprite.Begin();
font.DrawText(sprite, 
"%$#$#%^&"5050, Color.Black);
sprite.End();


这里DrawText方法的第一个参数是sprite,第二个参数就是你想要显示的字符。第三第四是写字的位置,最后是字的颜色。如果想要调整字体大小,在实例化font对象的时候就要指定。

此外font还有其他很多有用的方法,比如预读取文字之类。不是重点。

同样,只要有允许argb表示的重载方法,就可以使用半透明。比如DrawText就有一个可以用int表示Color的重载,那这里的Color.Black完全可以改成Color.FromArgb(255,Color.Black)。



好了,该结束了。基本的用法已经差不多全部掌握了,接下来要怎么封装那才是真本事。封装的方法因人而异,我也不能随便误导他人。那么这个工作我们就各做各的吧。Over。
posted @ 2005-11-29 23:25  Cloudage  阅读(1442)  评论(9编辑  收藏  举报