Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > getpixel не работает так, как надо


Автор: Мозгвыиграл 1.5.2009, 16:17
Пишу в Borland C++ 3.1

Рисую на экране поле для игры в морской бой с помощью функции. Получаются 2 квадрата цвета 1, разлинованные линиями цвета 3 на клетки 10х10. 

Далее пытаюсь получить цвет с помощью getpixel, где х,у - координаты курсора мыши, которые я запросил ранее. Проблема в том, что col постоянно принимает значение 0
Код

  col=getpixel(х,у);
 


если сделать так: 
Код
  col=getpixel(у,х);
, то иногда получается значение 1

при таком действии:
Код

 putpixel(x,y,4);
 col=getpixel(x,y);

цвет считывается именно такой,какой задан в putpixel

Автор: mes 1.5.2009, 16:26
ну так для начала убедитесь, какие координаты у Вас на руках, т.е сравните получаемые координаты мыши, с диапазоном координат сетки.

Добавлено через 4 минуты и 21 секунду
Ну а вобще такой подход  (узнавать цвет с помощью getpixel) не очень красивый.
Размер Вашего поля  Вам известен, начальные его координаты тоже (иначе как бы смогли нарисовать smile),
 так что на какую клетку поля указывает мышь, можно легко расчитать и будет намного удобнее, чем зависить от возможностей системы вывода smile

Автор: Мозгвыиграл 1.5.2009, 16:42
координаты я сравнивал - они верные.

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

Автор: Мозгвыиграл 1.5.2009, 17:52
значение getpixel не зависит от того, каким образом закрашена область экрана?

Автор: mes 1.5.2009, 17:57
Цитата(Мозгвыиграл @  1.5.2009,  16:52 Найти цитируемый пост)
значение getpixel не зависит от того, каким образом закрашена область экрана? 

Попробуйте в других графических режимах.
Из любопытства, а на каком режиме (его разрешение на кол-во цветов) экспериментируете ?

Автор: bsa 1.5.2009, 18:19
Мозгвыиграл, скорее всего, проблема не getpixel, а в координатах, как сказал mes. Поставь перед getpixel функцию putpixel и увидишь, где на самом деле находится курсор.

Автор: math64 1.5.2009, 18:28
Если во время вызова getpixel() курсор мыши находится на экране, Вы получаете цвет чёрного кончика указателя мыши.

Автор: mes 1.5.2009, 18:32
Цитата(math64 @  1.5.2009,  17:28 Найти цитируемый пост)
Если во время вызова getpixel() курсор мыши находится на экране, Вы получаете цвет чёрного кончика указателя мыши. 

"А слона-то и не заметили" © чья то
т.е про мышь то и не подумал !! smile

Добавлено через 3 минуты и 21 секунду
если причина именно в этом, то вот еще один небезосновательный повод сделать по человечески, расчитывать, основываясь на коордиатах, а не на цвете. smile

Автор: Мозгвыиграл 1.5.2009, 20:16
Цитата

Из любопытства, а на каком режиме (его разрешение на кол-во цветов) экспериментируете ?

640*480*16 цветов

Цитата

Если во время вызова getpixel() курсор мыши находится на экране, Вы получаете цвет чёрного кончика указателя мыши. 

вот блин... спасибо, попробую! 

Цитата

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

вообще, думаю, что куда человечнее было бы делать не в boland c 3.1 smile но таковы уж требования к проге)

Автор: math64 1.5.2009, 20:34
Цитата(Мозгвыиграл @  1.5.2009,  20:16 Найти цитируемый пост)
вообще, думаю, что куда человечнее было бы делать не в boland c 3.1  но таковы уж требования к проге)

Borland C++ 3.1 здесь не помеха:
Код

enum Cell {
  SEA, SHIP, FIRE
};
class Player {
int x, y, cw, ch;
Cell desk[10][10];
void MousePressed(int x, int y);
void DrawDesk();
void DrawSea(int x, int y);
void DrawShip(int x, int y);
void DrawFire(int x, int y);
void HideMouse();
void ShowMouse();
};
void Player::MousePressed(int mx, int my) {
  for(int i = 0; i < 10; i++)
    for(int j = 0; j < 10; j++) {
      if (x + i*cw <= mx && mx < x + (i+1)*cw &&
         y + j*cw <= my && my < y + (i+1)*ch) {
         if (desk[i][j] == SHIP) {
           desk[i][j] = FIRE;
           DrawDesk();
         }
      }
  }
}
void Player::DrawDesk() {
  HideMouse();
  for(int i = 0; i < 10; i++)
    for(int j = 0; j < 10; j++)
      swicth(desk[i]) {
         case SEA:
            DrawSea(x+i*cw,y+j*ch); break;
         case SHIP:
            DrawShip(x+i*cw,y+j*ch); break;
         case FIRE:
            DrawFire(x+i*cw,y+j*ch); break;
      }
  ShowMouse();
}


Автор: Мозгвыиграл 1.5.2009, 21:04
в принципе да, но тем не менее)

Цитата

enum Cell {
  SEA, SHIP, FIRE
};
class Player {
int x, y, cw, ch;
Cell desk[10][10];

а вот такого нам нельзя делать, ибо не проходили, а если не проходили, значит нельзя использовать. но за код спасибо, интересно)

Автор: math64 1.5.2009, 22:14
Вместо enum можно использовать константы, вместо класса - структуру.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)