2013-11-18 3 views
0

Хорошо, поэтому у меня есть изображение, которое содержит мой набор плитки. Затем у меня есть свой PictureBox, который используется как «игровой экран». Весь код делает это фрагмент моего набора плиток (плитка) и помещает его на экран игры.Не получать точный результат с помощью функции DrawImage

Вот мой код.

private void picMap_Click(object sender, EventArgs e) 
     { 

      //screenMain = picMap.CreateGraphics(); 

      // Create image. 
      //gfxTiles = Image.FromFile(@Program.resourceMapFilePath + "poatiles.png"); 

      // Create coordinates for upper-left corner of image. 
      int x = 0; 
      int y = 0; 

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

      // Draw image to screen. 
      screenMain.DrawImage(gfxTiles, x, y, srcRect, units); 
      screenMain.DrawImage(gfxTiles, 16, 0, srcRect, units); 
      screenMain.DrawImage(gfxTiles, 32, 0, srcRect, units); 
      screenMain.DrawImage(gfxTiles, 16, 16, srcRect, units); 
     } 

А вот мой выход: http://tm14.net/pokestory/mapeditor_test.png

Любой причина, почему это пространство между каждой «плиткой» есть (это пробел 2 пикселя)? Я мог бы гетто установить код, но я планирую использовать алгебру, чтобы программно определить, где плитки нужно идти, и т. Д., Поэтому установка гетто будет работать, но делать это на протяжении всей игры было бы хлопотно и, по крайней мере, , неряшливый.

+0

Ty для форматирования. :) Я постараюсь быть в этом лучше в будущем. – Silver

ответ

0

Я думаю, что призыв к DrawImage в порядке. На изображении, которое вы разместили, он выглядит как 16x16 плитки рядом друг с другом. Я бы проверил poatiles.png. Я не уверен, что в Rectangle (16, 16, 16, 16). Возможно, это не так, как вы думаете.

EDIT: Я не знаю, что сказать. Я сделал png почти размером с poatiles и положил квадрат 16x16 в него 16,16, и он рисовался точно так, как вы ожидали.

Код выглядит прекрасно, так как он работает на небольших изображениях, единственное, что я могу придумать, это проблема с poatiles.

Там в следующий комментарий в MSDN о методе Graphics.DrawImage (Image, Int32, Int32, прямоугольник, GraphicsUnit)

Этот метод рисует часть изображения, используя его физический размер, поэтому участком изображения будет иметь правильный размер в дюймах независимо от разрешения (точек на дюйм) устройства отображения. Например, предположим, что часть изображения имеет ширину пикселя 216 и горизонтальное разрешение 72 точки на дюйм. Если вызвать этот метод, чтобы сделать эту часть изображений на устройстве, которое имеет разрешение 96 точек на дюйм, ширины пикселя оказанной части изображения будет (216/72) * 96 = 288.

Поскольку вы указываете пиксели в качестве единицы, я ожидаю, что она проигнорирует это. Но при отсутствии лучших идей вы можете сравнить dpi от poatiles и меньших изображений. (Image.HorizontalResolution & Image.VerticalResolution)

+0

Я мог бы разместить плиточный лист. Но все это 16 x 16 плиток в листе.Там нет черных вокруг этой плитки. Он просто решил, что хочет показать черное пространство вокруг него. Это плитка в полном объеме, добавляется дополнительное пространство, и я понятия не имею, почему. – Silver

+0

Мне жаль, что я не могу редактировать свой другой комментарий, но я не могу ... Но исходный лист плитки 256x9616 ... Я сделал два образца изображений, которые будут меньше, 16 x 16 (только эта плитка) и лист 64 x 32. Каждый из меньших листов отображает плиту по назначению, без пробелов или чего-то еще. Но самый большой лист плитки, похоже, имеет проблему ... Я думал, что это странное поведение. – Silver

+0

После добавления кода, чтобы напечатать информацию вы сказали собрать, я получил выход: 119,9896, 119.9896 и 95,9866, 95,9866 кулак один является вертикальной и горизонтальной плитки я пытаюсь использовать. Второй - это меньшее изображение. Означает ли это, что я должен воссоздать первый файл и посмотреть, не могу ли я заставить его себя вести? Он был создан в XP для использования в проекте VB6, поэтому на самом деле это произошло с помощью элемента управления ящиком VB6, который я скопировал и вложил в Paint. – Silver

0

Я не уверен, что вся информация там для начала, но вот некоторые предложения, которые я имею, глядя на то, что вы сделали до сих пор.

1) Проверьте poatiles.png, чтобы убедиться, что это изображение размером 16x16 пикселей без черных пикселей вокруг него.

2) Кажется странным, что ваш Rectangle имеет четыре int's в своем конструкторе. Прямоугольник обычно должен иметь ширину и высоту (если стороны имеют разную длину, то это не истинный прямоугольник!)

3) Возможно, вы захотите определить свои позиции на экране путем умножения на ширину и высоту прямоугольника что вы пытаетесь рисовать и добавляете это значение в начало (0,0).

+0

Первые два аргумента этого конструктора Rectangle представляют собой местоположения x и y. Прямоугольник представляет собой прямоугольную область изображения для рисования. Этот вызов DrawImage не отображает все изображение. Я предполагаю, что poatiles.png содержит несколько фрагментов. – Spike