2012-12-04 58 views
1

我试图使用自定义的.PNG文件从字母表中的字母给我的游戏一些漂亮的文本图形。然而,由于我的WinForms游戏的核心功能使用最少的图形工作(我有一个定时器设置为启动一个小动画程序,当用户输入一个他们已经尝试过的单词时淡出“猜测”一词 - 这是完成的使用DrawString())。现在我试图让DrawImage(Image, dstRect, srcRect, Unit)工作,我已经设置为在表单加载上运行。DrawImage()'精灵'没有出现

private void DrawLetters() 
    { 

     // Create image. 
     Graphics letters = this.CreateGraphics(); 
     Image newImage = Image.FromFile(strPath + "Letter_Map.png"); 

     // Create rectangle for displaying image. 
     Rectangle destRect = new Rectangle(25, 25, 80, 80); 

     // Create rectangle for source image. 
     Rectangle srcRect = new Rectangle(0, 0, 833, 833); 
     GraphicsUnit units = GraphicsUnit.Pixel; 

     // Draw image to screen. 
     letters.DrawImage(newImage, destRect, srcRect, units); 
    } 

这实际上是逐字从MSDN网站。我的表单现在用一组标签填充以向用户显示游戏所需的字母网格。它们是否被覆盖了自定义矩形?我想最终用图像替换它们。我知道srcRect是(x,y,宽度,高度),所以我给了它全尺寸的'spritesheet'。对于dstRect,我只希望它在25x,25y左右的表格上放置一个80x80px的块。

对于它的问题,我创建了一个空白表单,并在该表单加载事件(我将该函数复制到该表单的代码)期间调用了我的DrawLetters()函数。但是我什么也没看到,所以我开始有点困惑。我可能需要一些关于如何将绘图与屏幕上绘制的表单和控件结合使用的教育。

编辑https://stackoverflow.com/questions/837423/render-a-section-of-an-image-to-a-bitmap-c-sharp-winforms是让我去最初的东西,但这个用户有XNA的工作知识,似乎是试图结合了与WinForms的。我相信,XNA对于我想要'漂亮'的简单文本游戏来说是过度杀伤力。

+1

我编辑了自己的冠军。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

谢谢,约翰。我会记住下次。 – armadadrive

回答

2

您需要重写窗体OnPaintMethod才能访问窗体Graphics对象,然后可以使用该窗体在窗体上显示图像。

如果你要显示的图像的一部分,你需要使用一个different overload of DrawImage,如下所示:

public partial class DrawImageDemo : Form 
{ 
    public DrawImageDemo() 
    { 
     InitializeComponent(); 
    } 

    private Image _sprites; 
    public Image Sprites 
    { 
     get 
     { 
      if (_sprites == null) 
      { 
       _sprites = Image.FromFile("test.jpg"); 
      } 
      return _sprites; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     // The forms graphics object 
     Graphics g = e.Graphics; 

     // Portion of original image to display 
     Rectangle region = new Rectangle(0, 0, 80, 80); 

     g.DrawImage(Sprites, 25, 25, region, GraphicsUnit.Pixel); 

     base.OnPaint(e); 
    } 

} 
+0

你的意思是'Paint',我看到的事件处理程序是否切换到事件?或者是“OnPaint”,那里不一定是可见的东西? – armadadrive

+0

@armadadrive如果您可以绘制可以绘制的类(具有此方法)的子类,或者可以为类外部的Paint事件添加事件处理程序,则可以重写OnPaint方法。 –

+0

哈!这像一个魅力。所以我可以设置一些Dictionary 来保存每个字母的X,Y坐标。感谢您的帮助@ sga101。有没有进一步的阅读我可以做**不是** MSDN? – armadadrive