【问题标题】:Scale x and y coordinates to Form/pictureBox location. C#将 x 和 y 坐标缩放到 Form/pictureBox 位置。 C#
【发布时间】:2014-03-11 23:31:11
【问题描述】:

我的 Form2 是游戏中实际“迷你地图”之外的外部“迷你地图”。

正如您在我的 Form2 上看到的那样,与游戏中的“迷你地图”(即黄点)相比,我绘制的红点对于我的玩家来说并没有相同的位置。

在 DebugView 中,可以看到我的字符 X 和 Y 位置(charX & charY)。

坐标在函数中作为 int x & int y 传递给我的 Form2 类文件。

我的 pictureBox1 中的图像(即上面当前示例图片中的图像)是从我的服务器中提取的 (url="http://randomspam.co/MAP/103000000.img/miniMap.canvas.png")。

以下是我目前的进度与 cmets 的以下代码。

请注意,pictureBox1 的位置设置为 0,0。

错误如下;

1) 我的外部小地图上的红点位置!= 我的角色在游戏内小地图中的位置。

2) 红点持续闪烁(出现和消失)

3) 显示在图片框上的工具提示在显示和取消显示方面确实滞后。

如果有人知道如何帮助解决我目前的情况(因为我迷路了),请不胜感激。

谢谢。

【问题讨论】:

  • X 和 Y 值在调用 CUpdate 时已经标准化?
  • 使用双缓冲并不是一件简单但真正能提高性能的事情。如果你在网上搜索,我想你会在 C# 中找到很多用于这类事情的示例代码。我相信控件也有一个双缓冲标志,这可能会有所帮助。希望这能给你一些方向!
  • @tweellt,标准化是什么意思?它只是将它传递给另一个 int。
  • @Andrew,我的意思是,它们是否已经“转换”为小地图的比例,例如 PointToClient?
  • @tweellt,不,我不知道如何进行缩放。这些是我在游戏中角色的原始 x&y 坐标(图片显示了我的意思)。

标签: c#


【解决方案1】:

好的,让我们将其拆分为主题:

1) 红点位置:

这里你必须将红点位置与新尺寸匹配,这个问题之前已经回答了好几次了,看这个 -> How can I transform XY coordinates and height/width on a scaled image to an original sized image?

2) 双缓冲停止闪烁:

public void DrawWhatever(Graphics graphics, int cx, int cy)
{
    Graphics g;
    Bitmap buffer = null;
    buffer = new Bitmap([image width], [image height], graphics);
    g = Graphics.FromImage(buffer);
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

    // Draw a circle.
    Pen p = new Pen(Color.Red,1)
    g.DrawEllipse(p,cx,cy,30,30); //example values

    graphics.DrawImage(buffer, 0, 0);
    g.Dispose();
}

3) 工具提示:

检查双缓冲算法并告诉我

【讨论】:

  • 您的结果将是带有红点的黑色图像。
  • 对于“图像宽度和高度”,您是什么意思?我使用的是什么位图?我假设图片框图像?另外,我怎么称呼它?
  • @Andrew,宽度和高度是图片框内图像的大小(例如 720 x 576),您可以在 pictureBox1_Paint 中调用此方法作为参数 e.Graphics 传递
  • @Andrew,也许这种方式会更好,因为您是在另一张图像上绘图
  • 什么是e。应该是?
【解决方案2】:

从小地图获取副本:

Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Bitmap bmpClone = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

Graphics objGraphics = Graphics.FromImage(bmpClone);
objGraphics.DrawImage(pictureBox1.Image, 0, 0);
objGraphics.Dispose();

bmp = (Bitmap)bmpClone.Clone();
pictureBox1.Image = bmp;

现在在任何失效之前做:

Graphics objGraphics = Graphics.FromImage(bmp);
objGraphics.SmoothingMode = SmoothingMode.HighQuality;
objGraphics.DrawImage(bmpClone, 0, 0);
objGraphics.FillEllipse(Brushes.Red, cx, cy, 5, 5)
objGraphics.Dispose();

pictureBox1.Invalidate();

pictureBox1_Paint里面不需要任何东西

变态

【讨论】:

  • 我唯一的问题是如何设置img? img 本质上是pictureBox1.Image,我无法将其转换为位图。或者什么是img?
  • @Andrew 创建第二个位图,例如 bmpClone 并将您的 png 图像加载到该位图中。还将格式更改为Format32bppArgb
  • 哦是 bmpclone = bmp?
  • 如果我做bmpClone = bmp(因为bmp是我的小地图图像,来自pictureBox1),工具提示不再滞后,但是,图片框中没有图片,红点不是绘制(它是一秒钟,然后消失)
  • @Andrew 首先,你是如何在图片框中设置 png 的?
猜你喜欢
  • 2021-09-04
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 2016-12-15
  • 2011-01-23
  • 2014-02-09
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多