2017-07-06 36 views
1

我有2個圖片框,一個英雄和一個敵人。英雄似乎加載罰款在我指定的PictureBox(0,0)的屬性中的位置。然而,敵人的圖片框我希望它被設置爲位置(90,90),我將它設置爲該位置,但是當我運行窗體窗體時 - 出於某種原因 - 它顯示圖片窗體位於( 60,58)。X和Y的圖片框位置與當前輸入的屬性不同

英雄PictureBox是綠色和敵人是橙色。

我想製作一個簡單的遊戲,並且想要將英雄的尺寸移動到他的瓦片上,這樣如果您將英雄移動到敵人的位置,他們應該平放在彼此之上。我的表單設置爲全尺寸(300,300),並且兩個圖片框的大小均爲(30,30)。因此,如果它們設置在(0,0)的起始位置,它們應該能夠「向左」和「向右」移動10個動作。我不確定是否我的移動方法讓我感到困惑,但我也沒有想到爲什麼當x和y的位置不同時,我試圖將它發佈到控制檯來調試這種情況 - 而不是90, 90,我把它放在形式和屬性上。理想情況下,我應該可以將3向左移動3向下移動並且位於敵人的頂部,但它不完全正確。

有什麼理由爲什麼這些不一樣?我會附上照片和我的源代碼。


出發位置

enter image description here

英雄動 - 他們不是直接在彼此的頂部,但應

enter image description here

敵人屬性 - 顯示大小和位置

enter image description here

英雄屬性 - 顯示大小和位置

enter image description here

CODE

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Mirage 
{ 
public partial class Form1 : Form 
{ 
Random rand = new Random(); 

public Form1() 
{ 
    InitializeComponent(); 
    Console.WriteLine("HERO STARTING LOCATION --- X = : {0} ---- Y = : {1}", pctrBxHero.Location.X, pctrBxHero.Location.Y); 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    using (Font myFont = new Font("Lucida", 10)) 
    { 
     e.Graphics.DrawString("@", myFont, Brushes.Green, new Point(0, 0)); 
    } 
} 

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 pictureBox2_Paint_1(object sender, PaintEventArgs e) 
{ 

    using (Font myFont = new Font("Lucida", 10)) 
    { 
     e.Graphics.DrawString("X", myFont, Brushes.Orange, new Point(0, 0)); 
    } 
} 
} 
} 

回答

0

大規模混亂我有固定我的問題的幾個小時後。事實證明這是一個縮放問題。

我把我的表格AutoScaleMode屬性設置爲"Font" - 這是默認設置。

這是縮放我的圖片框下來,縮放我的形式。我認爲這個問題非常重要,因爲我正在使用一臺筆記本電腦和一臺24英寸顯示器,我在我的二級顯示器(24「)上運行該程序,併產生扭曲的結果。

看起來,由於高Dpi屏幕,像素構建的東西看起來像是現在一天,效率更低或更具吸引力。

一旦我將表格AutoScaleMode轉換爲Dpi,結果確實產生了一個真實的300x300,我的圖片框恰好在他們應該在的位置。

這有點煩人,花了一段時間才意識到,但希望這會幫助別人。

我還不能完全確定爲爲什麼像素/幀不會爲300x300的就像我在屬性中指定,但它現在已經得到解決露面。我很想知道爲什麼如果有人知道。


enter image description here

enter image description here

0

順便說一句,對於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); 
    } 
+0

謝謝。我投了票,因爲我沒有意識到已經改變了。但它並沒有解決我的問題,但我很感激幫助! – KangarooRIOT

+0

它只會影響圖像,而不是pbox。 – TaW

+1

更新了答案......強制定位敵方圖片盒。我現在也很困惑,哈哈。 – hsoesanto

1

我無法在示例項目中重現您的問題。

這裏是我的輸出:

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 

與開始時的屏幕截圖和運動後:

enter image description here

enter image description here

我使用的代碼:

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_Paint_1」,這意味着你在連線後重新命名了PictureBox,並且你可能在一個點上有兩個Paint()事件(因爲它在末尾添加了「_1」)。您可能只需要重新開始使用新的PictureBox;刪除現有的,添加新的,重命名它們,然後設置它們的屬性。最後,選擇每一個,點擊「閃電箭」圖標查看它們的事件,並重新連接它們的Paint()事件。

********** **********編輯

這裏的另一種方法是可以得到解決的結垢問題。完全擺脫PictureBoxes和在你的Form的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(); 
    } 

} 
+0

謝謝。你是對的,但我認爲你是對的原因,我相信主要原因,這正在發生是一個縮放問題。看看你的圖片盒大小與上面的截圖相比。在弄了一個多小時後,我知道原因。 – KangarooRIOT

+0

檢查我的帖子的下半部分,在「編輯」行下方,尋找替代方法。 –

相關問題