Четверг, 14 Ноября 2024, 21:43

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Разные действия при нажатий левого клика!
tourniquetДата: Вторник, 26 Февраля 2013, 20:41 | Сообщение # 1
частый гость
Сейчас нет на сайте
Вечер добрый уважаемые программисты ) Есть такой кусочек кода для игры "Крестики - нолики", думал сделать "ход конём", что бы при первом нажатии появился спрайт для Х, а при втором нажатии на тот же левый клик, появился спрайт для 0. Но не работает, и не могу понять почему, так как сдлелал чтото на подобие этого отдельно, и работает, а в данном случае - нет. В чём может быть причина?

Код
bool whatCase = false;

    if(!whatCase) {
     if(event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
      if(event.mouse.x > 150 && event.mouse.x < 300 && event.mouse.y > 150 && event.mouse.y < 300) {
       al_draw_bitmap(xImage, 150, 150, 0);
       whatCase = !whatCase;
      } else if(event.mouse.x > 300 && event.mouse.x < 450 && event.mouse.y > 150 && event.mouse.y < 300) {
       al_draw_bitmap(xImage, 300, 150, 0);
       whatCase = !whatCase;
      } else if { ...
      }
     }
    }    

    if(whatCase) {
     if(event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
      if(event.mouse.x > 150 && event.mouse.x < 300 && event.mouse.y > 150 && event.mouse.y < 300) {
       al_draw_bitmap(oImage, 150, 150, 0);
       whatCase = !whatCase;
      } else if(event.mouse.x > 300 && event.mouse.x < 450 && event.mouse.y > 150 && event.mouse.y < 300) {
       al_draw_bitmap(oImage, 300, 150, 0);
       whatCase = !whatCase;
      } else if { ...
     }
    }


Вот что делал отдельно:

Код
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main() {

   bool test = false;
   int a = 1;
   int b = 2;

   if(!test) {
    if(a == 1) {
     if(b == 2) {
      printf("Hello false!\n");
      test = !test;
     }
    }
   }

   if(test) {
    if(a == 1) {
     if(b == 2) {
      printf("Hello true!\n");
      test = !test;
     }
    }
   }

   if(!test) {
    printf("False!\n");
    test = !test;
   }

   if(test) {
    printf("True!\n");
    test = !test;
   }

   return 0;
}


А да, забыл, интересно, что при клике, рисуется спрайт для 0, а вроде (мне так кажется) что должен появится спрайт для Х.


Сообщение отредактировал tourniquet - Вторник, 26 Февраля 2013, 20:51
nonameДата: Четверг, 14 Марта 2013, 18:28 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Цитата (tourniquet)
сть такой кусочек кода для игры "Крестики - нолики", думал сделать "ход конём", что бы при первом нажатии появился спрайт для Х, а при втором нажатии на тот же левый клик, появился спрайт для 0

кхм.. если это учебное задание, то дай точную формулировку задачи.

если же ты просто делаешь крестики-нолики, то по нажатию левого клика надо определить, попал ли клик на игровую доску и если да, то на какое поле доски и посмотреть соответствующую ячейку в массиве, чтобы узнать, свободно ли это поле. и только если это поле свободно, то только тогда заносить в соответствующую ячейку массива нужное обозначение(крестик или нолик), отрисовывать нужный значок(смотря что занесли в массив) и изменять значение переменной, в которой хранится чей сейчас ход(именно из этой переменной мы узнаём, что заносить в массив).

Цитата (tourniquet)
whatCase = !whatCase;
} else if(event.mouse.x > 300 && event.mouse.x < 450 && event.mouse.y > 150 && event.mouse.y < 300) {

вместо всех этих страшных вложенных проверок можно вычислить по координате x курсора координату x игрового поля. то есть, число 150..299 должно давать 0, число 300..449 должно давать 1, число 450..599 должно давать 2. других вариантов не должно быть, потому что мы уже проверили, что координаты точно попадают на игровую доску. и так переводим обе координаты. после этого заглядываем в массив, и.. смотри выше.

ещё небольшой момент: если ты хочешь, чтобы щелчки между клетками не засчитывались, то тогда можно, после вычисления координат щелчка на игровом поле, перевести эти координаты в координаты квадрата, куда должен попасть щелчок, чтобы быть засчитанным. например, мы хотим сделать отступ по 10 пикселей, тогда координаты x=1 y=1 должны дать xr1= 160, xr2= 289, yr1= 160, yr2= 289. щелчок попадает в рамку в том случае, если ((x>=xr1)&&(x<=xr2)&&(y>=yr1)&&(y<=yr2)). в этом случае, после щелчка, сначала проверяем, попал ли щелчок по игровой доске, и если да, то вычисляем координаты поля доски, по которому попал щелчок, после этого вычисляем координаты рамки куда должен вписаться щелчок. и только если щелчок вписался в координаты рамки, заглядываем в массив, и.. ну, ты понял.

Добавлено (14.03.2013, 17:58)
---------------------------------------------

Цитата (noname)
вместо всех этих страшных вложенных проверок можно вычислить по координате x курсора координату x игрового поля. то есть

без проверок. одной формулой. которую ты сам придумаешь.

Добавлено (14.03.2013, 18:28)
---------------------------------------------
tourniquet, чтобы понять как работает твой первый код, хорошо бы знать, в каких случаях он вообще выполняется. и как обрабатываются события в используемой тобой среде.

вот, например, в Borland C++ код обработки левого клика мыши можно повесить на щелчок левой кнопкой мыши по форме. то есть, кликнул гамер где-то в пределах рабочей области окошка игры(не в меню или пр.) и запускается наша функция, которая анализирует, куда он щёлкнул, и что теперь делать.

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

так как у тебя написано, получается следующее(то есть я не знаю, как там получается, но попробую предположить): если случился щелчок на игровом поле, то ты в первой проверке

Цитата (tourniquet)
if(!whatCase)
отрисовываешь туда спрайт крестика и поднимаешь флаг whatCase, а во второй проверке
Цитата (tourniquet)
if(whatCase)
тут же отрисовываешь туда же спрайт нолика и опускаешь флаг whatCase. итого: по щелчку мыши гамер видит отрисовывание нолика(это если я тебя понял правильно и если дальше в коде не случается ничего неожиданного).


все правила форумной игры Дуэль Программистов
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг