Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2012, 15:27   #1
alonix
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 14
По умолчанию Обработка столкновений с блоками

Здравствуйте, я пишу курсовую темой которой является, разработка игры Арканоид на C++. У меня появилась проблема в обработки столкновений с блоками.
Для создания блоков я создал массив объектов, объекты описаны классом.
Код:
class bloksClass
{
   public:
    int x;
    int y;
    int w;
    int h;
    void draw();
    bool vis;
};
void bloksClass::draw()
{
if(vis){
    Form1->Canvas->Brush->Color=clBlue;
    Form1->Canvas->Rectangle(x-w,y,x+w,y-h);}
}
В игре происходит отрисовка по таймеру.
для движения шарика использую функцию
Код:
void getnewxy()
{
  bal.x+=bal.vx;
bal.y+=bal.vy;
if(bal.y+bal.r*2>Form1->Height)
        bal.vy=-bal.vy;
if(bal.y-bal.r<0)
        bal.vy=-bal.vy;
if(bal.x+bal.r>Form1->Width)
        bal.vx=-bal.vx;
if(bal.x-bal.r<0)
        bal.vx=-bal.vx;
if(bal.x>pad.x-50 && bal.x<pad.x+50 && bal.y>pad.y-20 && bal.y<pad.y+bal.r)
{

 bal.vy=-bal.vy;
}

}
Собственно мне нужно, что бы при столкновении с элементом из массива объектов, bal[строка][столбец].vis стал равен false.
как это осуществить?

Последний раз редактировалось alonix; 15.04.2012 в 15:55.
alonix вне форума Ответить с цитированием
Старый 15.04.2012, 15:36   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код не разбирал, но идея такова: "пробегать" циклом по всем блокам, и если расстояние от центра шарика до центра блока (можно подумать и по другому параметру), у которого vis true, меньше какой-то константы, то присвоить false и изменить направление шарика.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.04.2012 в 15:39.
BDA вне форума Ответить с цитированием
Старый 15.04.2012, 15:45   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
до центра блока
Не до центра. Блоки в Арканойде свою позицию по У не меняют. Соответственно просто нужно проверять
Код:
if(bal.y+bal.r)<координаты передней стенки блока {мяч не коснулся блока}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2012, 15:51   #4
alonix
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 14
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код не разбирал, но идея такова: "пробегать" циклом по всем блокам, и если расстояние от центра шарика до центра блока (можно подумать и по другому параметру), у которого vis true, меньше какой-то константы, то присвоить false и изменить направление шарика.
Цикл про который вы говорите лучше написать в событие таймера? Или же в функции в которой описаны движения шарика?
alonix вне форума Ответить с цитированием
Старый 15.04.2012, 16:03   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Мне кажется, не принципиально.
Логичнее в движении шарика, имхо.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.04.2012, 16:08   #6
alonix
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 14
По умолчанию

Еще попутный вопрос, я прорисовываю канвы на форме, и изображение моргает. Можно ли как нибудь избавится от марания?
alonix вне форума Ответить с цитированием
Старый 15.04.2012, 16:15   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Нужна так называемая двойная буферизация.
Не помню, есть ли у формы свойство DoubleBuffered.
Если нет, то рисуйте на bitmap, который создадите, а потом копируйте изображение на канву (команда BitBlt).

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не до центра.
Код:
if(bal.y+bal.r)<координаты передней стенки блока {мяч не коснулся блока}
А вариант, что шарик "ударит" в боковую строну блока или в верхнюю? Тогда нужно проверять на пересечение, т.е. делать сравнения со всеми стенками блока.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.04.2012 в 16:18.
BDA вне форума Ответить с цитированием
Старый 15.04.2012, 16:21   #8
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Можно. Для этого нужно использовать фон, размером с шарик, и накладывать фон на отрисованный шарик методом copyrect или bitblt. А потом отрисовывать блоки.

Так же можно рисовать на PaintBox, а не на форме. Тогда можно будет использовать более быстрый scanline. Но подлость состоит в том, что тогда все придётся рисовать в ручную с помощью циклов.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 15.04.2012, 16:40   #9
alonix
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 14
По умолчанию

И опять в мою голову пришел вопрос, извините если надоел, в первом посте, я описал функцию которая меняет координаты шарика, эта функция не относится к классу шарика, как мне ее правильно описать что бы она относилась к классу шарика и в качестве аргументов использовала координаты доски, которые описаны в классе доски.
alonix вне форума Ответить с цитированием
Старый 15.04.2012, 16:56   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А вариант, что шарик "ударит" в боковую строну блока или в верхнюю?
В боковую? Как? Да и потом по правилам игры это уже поражение должно быть - чего на него условие писать.
Цитата:
И опять в мою голову пришел вопрос
Код:
class bloksClass
{
   public:
    int x;
    int y;
    int w;
    int h;
    void draw();
    void getnewxy()
    bool vis;
};

void bloksClass::getnewxy()
{
  x+=vx;
  y+=vy;
...
 и так далее везде bal. убирай
}
void bloksClass::draw()
{
if(vis){
    Form1->Canvas->Brush->Color=clBlue;
    Form1->Canvas->Rectangle(x-w,y,x+w,y-h);}
}
Кстати: bal.x+=bal.vx; это что шутка?
I'm learning to live...

Последний раз редактировалось Stilet; 15.04.2012 в 16:59.
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арканоид. Проблема с блоками. xeoni Помощь студентам 1 11.05.2011 01:50
Проблема с блоками Vendetta-V HTML и CSS 1 22.09.2010 20:44
сортировка текста блоками Andruha_An Microsoft Office Word 5 19.04.2010 20:28
Обработка столкновений окружностей. Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 18 08.03.2010 13:43
Код проверки столкновений не работает. Манжосов Денис :) Общие вопросы Delphi 8 02.02.2009 10:31