C# X和Y的Picturebox位置与在属性中输入的位置不同
我有两个画框,一个英雄和一个敌人。英雄似乎在我在PictureBox(0,0)的属性中指定的位置加载良好。但是,我希望将敌人图片框设置为位置(90,90),我确实将其设置为该位置,但是当我运行windows窗体时(出于某种原因),它显示图片窗体位于位置(60,58) 英雄图片盒是绿色的,敌人是橙色的 我想做一个简单的游戏,并希望移动英雄的确切大小作为瓷砖,他是这样,如果你移动到敌人的地方,他们应该堆叠在对方的单位。我将表格设置为全尺寸(300300),两个图片框的大小均为(30,30)。因此,如果将它们设置在(0,0)的起始位置,它们应该能够向左和向右“移动”10次。我不确定是不是我的移动方法把我搞砸了,但我也不知道为什么当我试图将x和y的位置发布到控制台以调试这种情况时,x和y的位置是不同的——而不是我将其放置在窗体和属性中的90,90。理想情况下,我应该能够向左移动3次,向下移动3次,然后在敌人的上方移动,但这一点都不正确 有什么原因使它们不一样吗?我会附上照片和我的源代码C# X和Y的Picturebox位置与在属性中输入的位置不同,c#,C#,我有两个画框,一个英雄和一个敌人。英雄似乎在我在PictureBox(0,0)的属性中指定的位置加载良好。但是,我希望将敌人图片框设置为位置(90,90),我确实将其设置为该位置,但是当我运行windows窗体时(出于某种原因),它显示图片窗体位于位置(60,58) 英雄图片盒是绿色的,敌人是橙色的 我想做一个简单的游戏,并希望移动英雄的确切大小作为瓷砖,他是这样,如果你移动到敌人的地方,他们应该堆叠在对方的单位。我将表格设置为全尺寸(300300),两个图片框的大小均为(30,30)。因此,如
起始位置 英雄移动-他们不是直接在对方之上,而是应该在对方之上 敌人属性-显示大小和位置 英雄属性-显示大小和位置 代码
顺便说一句,行为部分下的pctrBxEnemy的属性显示了CenterImage。当CenterImage尝试将图像定位到客户区域的中心时,它可能会重新定位图片框 我试图加载你的项目。奇怪的是,敌人的位置是60,58。尽管如此,您可以在初始化时在代码中重写它(如下所示)。现在,当我按下3和3的权利-框完全重叠
public Form1()
{
InitializeComponent();
Console.WriteLine("HERO STARTING LOCATION --- X = : {0} ---- Y = : {1}", pctrBxHero.Location.X, pctrBxHero.Location.Y);
pctrBxEnemy.Location = new Point(90, 90);
}
我无法在我的示例项目中重现您的问题 以下是我的输出:
HERO --- X = : 30 ---- Y = : 0
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 60 ---- Y = : 0
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 0
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 30
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 60
ENEMY --- X = : 90 ---- Y = : 90
HERO --- X = : 90 ---- Y = : 90
ENEMY --- X = : 90 ---- Y = : 90
在开始和移动后使用屏幕截图:
我使用的代码是:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Font fnt = new Font("Lucida", 10);
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int x = pctrBxHero.Location.X;
int y = pctrBxHero.Location.Y;
if (e.KeyCode == Keys.Right) x += 30;
else if (e.KeyCode == Keys.Left) x -= 30;
else if (e.KeyCode == Keys.Up) y -= 30;
else if (e.KeyCode == Keys.Down) y += 30;
pctrBxHero.Location = new Point(x, y);
Console.WriteLine("HERO --- X = : {0} ---- Y = : {1}", x, y);
Console.WriteLine("ENEMY --- X = : {0} ---- Y = : {1}", pctrBxEnemy.Location.X, pctrBxEnemy.Location.Y);
}
private void pctrBxHero_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("@", fnt, Brushes.Green, new Point(0, 0));
}
private void pctrBxEnemy_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("X", fnt, Brushes.Orange, new Point(0, 0));
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
fnt.Dispose();
}
}
我注意到您有“pictureBox2\u Paint\u 1”,这意味着您在连接PictureBox之后重命名了它,并且您可能在一个点上有两个Paint()事件(因为它在末尾添加了“\u 1”)。有可能你只需要从新的图片盒开始;删除现有的、添加新的、重命名它们,然后重新设置它们的属性。最后,选择每一个,单击“闪电”图标查看它们的事件,然后重新连接它们的Paint()事件
**********编辑**********
这里有一种替代方法可以解决缩放问题。完全摆脱画框,在你的形体的绘画()事件中画出你的英雄和敌人。这可能看起来像:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
sf.Alignment = StringAlignment.Center; // vertical center
sf.LineAlignment = StringAlignment.Center; // horizontal center
}
private int boxSize = 30;
private bool EnemyKilled = false;
private Point pntHero = new Point(0, 0);
private Point pntEnemy = new Point(3, 3);
private Font fnt = new Font("Lucida", 10);
private StringFormat sf = new StringFormat();
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Right) pntHero.Offset(1,0);
else if (e.KeyCode == Keys.Left) pntHero.Offset(-1, 0);
else if (e.KeyCode == Keys.Up) pntHero.Offset(0, -1);
else if (e.KeyCode == Keys.Down) pntHero.Offset(0, 1);
if (pntHero.Equals(pntEnemy))
{
EnemyKilled = true;
}
this.Invalidate();
Console.WriteLine("HERO: " + pntHero.ToString());
Console.WriteLine("ENEMY: " + pntEnemy.ToString());
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Rectangle rc;
rc = new Rectangle(new Point(pntEnemy.X * boxSize, pntEnemy.Y * boxSize), new Size(boxSize, boxSize));
e.Graphics.DrawRectangle(Pens.White, rc);
e.Graphics.DrawString(EnemyKilled ? "X" : "O", fnt, Brushes.Orange, (RectangleF)rc, sf);
rc = new Rectangle(new Point(pntHero.X * boxSize, pntHero.Y * boxSize), new Size(boxSize, boxSize));
e.Graphics.DrawRectangle(Pens.White, rc);
e.Graphics.DrawString("@", fnt, Brushes.Green, (RectangleF)rc, sf);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
fnt.Dispose();
}
}
经过几个小时的混乱,我已经解决了我的问题。原来这是一个缩放问题 我已将表单
AutoScaleMode
属性设置为“Font”
——这是默认设置
那就是缩小我的图片框和缩小我的表格。我认为问题之所以如此严重是因为我使用的是笔记本电脑和24英寸显示器。我在我的辅助显示器(24英寸)上运行该程序,它产生了扭曲的结果
由于高Dpi屏幕,现在每天按像素构建的东西似乎没有那么有效/吸引人
一旦我将表单AutoScaleMode
切换到Dpi
时,结果实际上产生了一个真正的300x300,我的图片框正是它们应该出现的位置
这有点烦人,我花了一段时间才意识到,但希望这能帮助其他人
我仍然不能确切地确定为什么像素/帧不会像我在属性中指定的那样显示为300x300,但现在已经解决了。如果有人知道,我很想知道为什么
谢谢。我投了更高的票,因为我没有意识到它被改变了。不过,它并没有解决我的问题,但我感谢您的帮助!它只会影响图像,不会影响pbox。更新了答案。。。强制敌人图片框的定位。我现在也很困惑,哈哈。谢谢你。你是对的,但我认为你是对的,我相信主要原因是,这是一个规模问题。与上面我的截图相比,看看你的图片框大小。经过一个多小时的纠结,我知道了原因。查看我文章的下半部分,在“编辑”行下面,寻找替代方法。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
sf.Alignment = StringAlignment.Center; // vertical center
sf.LineAlignment = StringAlignment.Center; // horizontal center
}
private int boxSize = 30;
private bool EnemyKilled = false;
private Point pntHero = new Point(0, 0);
private Point pntEnemy = new Point(3, 3);
private Font fnt = new Font("Lucida", 10);
private StringFormat sf = new StringFormat();
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Right) pntHero.Offset(1,0);
else if (e.KeyCode == Keys.Left) pntHero.Offset(-1, 0);
else if (e.KeyCode == Keys.Up) pntHero.Offset(0, -1);
else if (e.KeyCode == Keys.Down) pntHero.Offset(0, 1);
if (pntHero.Equals(pntEnemy))
{
EnemyKilled = true;
}
this.Invalidate();
Console.WriteLine("HERO: " + pntHero.ToString());
Console.WriteLine("ENEMY: " + pntEnemy.ToString());
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Rectangle rc;
rc = new Rectangle(new Point(pntEnemy.X * boxSize, pntEnemy.Y * boxSize), new Size(boxSize, boxSize));
e.Graphics.DrawRectangle(Pens.White, rc);
e.Graphics.DrawString(EnemyKilled ? "X" : "O", fnt, Brushes.Orange, (RectangleF)rc, sf);
rc = new Rectangle(new Point(pntHero.X * boxSize, pntHero.Y * boxSize), new Size(boxSize, boxSize));
e.Graphics.DrawRectangle(Pens.White, rc);
e.Graphics.DrawString("@", fnt, Brushes.Green, (RectangleF)rc, sf);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
fnt.Dispose();
}
}