C# winforms中的基本平铺映射

C# winforms中的基本平铺映射,c#,winforms,grid,tile,sprite-sheet,C#,Winforms,Grid,Tile,Sprite Sheet,我正在制作一个程序,在这个程序中,你可以在windows窗体中从一个平铺切换到另一个平铺。 所以为了做到这一点,我想使用面板,每个面板都有一个标签。检测碰撞 所以我有我的地图的图像。我把它分成了多块瓷砖。但是现在我不得不将900块瓷砖拖到面板上 这在两方面不是很有效。首先加载900个纹理并不是一个明智的想法。而且要花很长时间。所以我想用一张精灵纸或瓷砖贴图。但在winforms中我将如何做到这一点。我相信我见过一些人使用网格视图或其他什么。然而,我不知道如何做我想做的事 最好的解决方案是什么 提

我正在制作一个程序,在这个程序中,你可以在windows窗体中从一个平铺切换到另一个平铺。 所以为了做到这一点,我想使用面板,每个面板都有一个标签。检测碰撞

所以我有我的地图的图像。我把它分成了多块瓷砖。但是现在我不得不将900块瓷砖拖到面板上

这在两方面不是很有效。首先加载900个纹理并不是一个明智的想法。而且要花很长时间。所以我想用一张精灵纸或瓷砖贴图。但在winforms中我将如何做到这一点。我相信我见过一些人使用网格视图或其他什么。然而,我不知道如何做我想做的事

最好的解决方案是什么


提前谢谢

对于任何严肃的游戏项目
WinForms
都不是最好的平台。无论是
WPF
还是
XNA
还是
Unity
都能够提供DirectX的高性能使用

但是,由于您希望在Winforms中执行此操作,这里有一种方法。 它创建了数量惊人的900个
图片框
,并用源图像的一小部分加载每个图片框:

private void Form1_Load(object sender, EventArgs e)
{
    int tileWidth = 30;
    int tileHeight = 30;
    int tileRows = 30;
    int tileCols = 30;

    using (Bitmap sourceBmp = new Bitmap("D:\\900x900.jpg"))
    {
        Size s = new Size(tileWidth, tileHeight);
        Rectangle destRect = new Rectangle(Point.Empty, s);
        for (int row = 0; row < tileRows; row++)
            for (int col = 0; col < tileCols; col++)
            {
                PictureBox p = new PictureBox();
                p.Size = s;
                Point loc = new Point(tileWidth * col, tileHeight * row);
                Rectangle srcRect = new Rectangle(loc, s);
                Bitmap tile = new Bitmap(tileWidth, tileHeight);
                Graphics G = Graphics.FromImage(tile);
                G.DrawImage(sourceBmp, destRect, srcRect, GraphicsUnit.Pixel);
                p.Image = tile;
                p.Location = loc;
                p.Tag = loc;
                p.Name = String.Format("Col={0:00}-Row={1:00}", col, row);
                // p.MouseDown += p_MouseDown;
                // p.MouseUp += p_MouseUp;
                // p.MouseMove += p_MouseMove;
                this.Controls.Add(p);
            }
    }

}
但也许你想使用其他事件来播放,比如拖放或键盘事件

有两种方法可以引用这些瓷砖。也许您想尝试和/或同时使用它们:您可以使用

    foreach (Control ctl in this.Controls)
    { if (ctl is PictureBox ) this.Text = ((PictureBox)ctl).Name ; }
它测试正确的类型,然后强制转换到PictureBox。例如,它在窗口标题中显示平铺的名称

或者,您可以使用变量并在MouseDown事件中进行设置:

PictureBox currentTile;
void p_MouseDown(object sender, MouseEventArgs e)
{
    currentTile = (PictureBox ) sender;
}

@好吧,答案可以用代码来解决。Winforms确实不合适。虽然这并不意味着它不能做到。我不是在尝试创建最好的应用程序。我只是在以一种我喜欢的方式学习OOP。Winforms很不错。谢谢你在这里帮助我,你帮了我很多工作。我现在也明白它是如何工作的,我以前也想过。然而,我现在面临一个大问题。如何检测用户是否可以输入互动程序。我在考虑给它添加标签,但这里的问题是winforms不允许我只查找标签,我需要指定哪个控件保存标签。你知道这样做的方法吗?试试:this.Controls.Find(String.Format(“Col={0:00}-Row={1:00}”,Col,Row),true);找到控件
PictureBox currentTile;
void p_MouseDown(object sender, MouseEventArgs e)
{
    currentTile = (PictureBox ) sender;
}