2013-05-27 6 views
1

Это первый раз, когда я спрашиваю здесь, так что медведь со мной :) Ну в основном у меня проблема с моим кодом, и я не могу понять, что это такое. Это генератор города для игры, которую я разрабатываю. Он создает 20 x 20bitmap с землей в коричневом цвете и рекой в ​​синем. Теперь мне нужно, чтобы генерировать блок 3x3 в розовом, а затем он должен проверить, есть ли какое-либо совпадение, если да, genereate новую случайную позицию и перейти к проверке, есть ли синий цвет. Моя проблема заключается в том, что она генерирует реку и розовый 3x3 блок, независимо от того, перекрывает ли он синюю часть.Сложность с простой манипуляцией с растровым изображением

Согласно кодексу, это не должно быть возможно .. А функция, которая генерирует городской блок вызывается после того, как реки:

private void CreateCityBlock(string name, Color col) { 

     //This variable stops the loop 
     bool canGenerate = false; 

     //Create a loop that checks if it can generate the 3x3 block 
     while (!canGenerate) 
     { 
      //Create a random and generate two positions for "x" and "y" 
      Random rnd = new Random(); 
      int x = rnd.Next(1, 19); 
      int y = rnd.Next(1, 19); 



      //Check if it overlaps with the river 
      if (!city.GetPixel(x, y).Equals(Color.Blue)|| 
       !city.GetPixel(x - 1, y + 1).Equals(Color.Blue) || 
       !city.GetPixel(x, y + 1).Equals(Color.Blue) || 
       !city.GetPixel(x + 1, y + 1).Equals(Color.Blue) || 
       !city.GetPixel(x - 1, y).Equals(Color.Blue) || 
       !city.GetPixel(x + 1, y).Equals(Color.Blue) || 
       !city.GetPixel(x - 1, y - 1).Equals(Color.Blue) || 
       !city.GetPixel(x, y - 1).Equals(Color.Blue) || 
       !city.GetPixel(x + 1, y - 1).Equals(Color.Blue)) 
      { 
       //set the color to pink 
       city.SetPixel(x - 1, y + 1, col); 
       city.SetPixel(x, y + 1, col); 
       city.SetPixel(x + 1, y + 1, col); 
       city.SetPixel(x - 1, y, col); 
       city.SetPixel(x, y, col); 
       city.SetPixel(x + 1, y, col); 
       city.SetPixel(x - 1, y - 1, col); 
       city.SetPixel(x, y - 1, col); 
       city.SetPixel(x + 1, y - 1, col); 
       canGenerate = true; 

      } 





     } 
    } 
+1

Я думаю, вы должны использовать && вместо ||. Или вы берете, как реку, если один пиксель синий ... или если все они –

+0

Ну в основном я попробовал это сначала, это тоже не сработало. Если это должен быть оператор AND (&&), тогда он должен будет проверить все пиксели, но если я просто использую оператор OR (||), тогда он должен вернуть true или false, как только любое из условий вернет true, поэтому что независимо от того, сколько пикселей будет синим, оно должно возвращать true или false, как только будет только один пиксель, который является синим. – Tordur

ответ

1

Проблема заключается в том, что || (условный-ИЛИ) оператор не вычисляет выражения, если первое выражение равно True.

Итак, если первый пиксель не синий, тогда остальное не оценивается, так как! False равно True.

В этом случае, я хотел бы написать отдельный «проверку» метод оценки всех пикселов и возвращает результат соответственно, например .:

// Returns true if the area overlaps a river pixel, false otherwise 
private bool Overlaps(Bitmap city, int x, int y) 
{ 
    for (int cx = x - 1; cx < x + 2; cx++) 
    { 
     for (int cy = y - 1; cy < y + 2; cy++) 
     { 
      if (city.GetPixel(cx, cy).Equals(Color.Blue)) 
       return true; 
     } 
    } 

    return false; 
} 
Смежные вопросы