Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема перемещения компонентов по главной форме

38K
23 февраля 2009 года
maximen
14 / / 20.02.2009
Ув. знатоки Builder C++!
Пишу карточную игру дурак. Столкнулся с такой проблемой:
при анимации перемещении карт на "слабых" машинах не могу увеличить скорость перемещения карт.
Результатом увеличения скорости является появление за картой шлейфа компонента, который является картой, а скорость перемещения фактически не увеличивается.
При выполнении программы на мощных конфигурациях машин(CoreDuo 8600, ОЗУ 4 ГБ, видео GeForce 8700-512МБ) задача выполняется великолепно.

Подскажите как мне побороть данную проблему, буду очень благодарен.

Картами в программе являются формы, которые содержат в себе два Image соответственно лицо и рубашка карты.
Карты создаю так:
Код:
TFCard *Card[36];

void Init_Koloda(void)
{
  Graphics::TBitmap *Bitmap = new Graphics::TBitmap();  //-- этот битмап будет передавать jpeg файлы в карты

  int a=6; // номинал карты

      for(int i = 0; i < 36; i++)
      {
        Card = new TFCard(FMain);
         Card->Parent=FMain;           // создаем колоду из 36 карт
                Bitmap->Assign(JPeg);
                Card->Face->Picture->Assign(Bitmap);    // загружаем в каждую карту ее лицо
                Bitmap->Assign(JPeg[36]);                   // рубашку
                Card->Shirt->Picture->Assign(Bitmap);   //
        if (i<9) { Card->Krest=true; Card->Nominal=a;   a++; }     // устанавливаем масти и номиналы
            if (i>8 && i<18) { Card->Pika=true; Card->Nominal=a;  a++; }
                if (i>17 && i<27) { Card->Chirva=true; Card->Nominal=a;   a++; }
                    if (i>26 && i<36) { Card->Bubna=true; Card->Nominal=a;  a++; }
              if (a==15) { a=6; }
      }
      for (int i = 0; i < 37; i++) {    delete JPeg;  }  // удаляем изображения лиц карт
      for (int i = 0; i < 36; i++) {    Card->Visible=true; Card->Left=-100;
            Card->Top=120; }

Анимация движения карт реализуется в таймере с минимальным интервалом. Номер карты передается в массив который обслуживает анимацию.Скарость движения я изменяю с помощью цикла.
В массив mov_card_x, mov_card_y я передаю координаты карты где она должна оказаться
Код:
//------ Перемещение карт игроками на игре когда идет игра и они ходят ------------------------                 
           if(Moves_Card==true) {          
   
for (int i = 0; i < (10+FSetup->TrackBar1->Position); i++)
{                      
                      // перемещение по горизонтали
 if(mov_card_x[tt] < Card[mov_card[tt]]->Left) { Card[mov_card[tt]]->Left--; }
                     // перемещение по горизонтали
 if(mov_card_x[tt] > Card[mov_card[tt]]->Left) { Card[mov_card[tt]]->Left++; }
                     //  перемещение по вертикали
 if(mov_card_y[tt] < Card[mov_card[tt]]->Top) {Card[mov_card[tt]]->Top--;}

 if(mov_card_y[tt] > Card[mov_card[tt]]->Top) {Card[mov_card[tt]]->Top++;}

      // проверка достигла ли карта нужной точки - если да берем след ячейку массива
 if(mov_card_x[tt] == Card[mov_card[tt]]->Left && mov_card_y[tt] == Card[mov_card[tt]]->Top) {tt++; }

         if(tt == kk)
        {
        Moves_Card=false;
        tt=0;kk=0;
       
              }
          break;
         }
}
                               }
1.9K
23 февраля 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: maximen
...



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

P.S. вообще конечно сделать карты формами - это не очень хорошо... точнее даже очень нехорошо. Тогда уж логичнее было сделать их TImage'ми... Или точнее наследниками от этого класса, чтобы можно было гибко управлять ими.

38K
23 февраля 2009 года
maximen
14 / / 20.02.2009
Спасибо за отзыв....
Я думал над проблемой в аспекте Вашего мнения - и создал класс Image - однако не смог справиться с его мерцанием при перемещении...
Это выглядит очень неэстетично...
11
23 февраля 2009 года
oxotnik333
2.9K / / 03.08.2007
можно поместить TImage на TPanel сделать TImage::Enabled = false а на OnMouseDown панели прописать:
 
Код:
ReleaseCapture[COLOR=#0000ff]();[/COLOR]
Panel1[COLOR=#0000ff]->[/COLOR]Perform[COLOR=#0000ff]([/COLOR]WM_SYSCOMMAND[COLOR=#0000ff],0xF012,0)[/COLOR]
38K
23 февраля 2009 года
maximen
14 / / 20.02.2009
Я пробовал сделать это на панели - такое же мерцание - не могу убрать его....
1.9K
23 февраля 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: maximen
Я пробовал сделать это на панели - такое же мерцание - не могу убрать его....


Хорошая статья про устранения мерцания:
http://deadbeef.narod.ru/work/articles/flicker.htm

P.S. по-моему достойна включения в FAQ или в статьи. Если это возможно без нарушения автоских прав :)

11
24 февраля 2009 года
oxotnik333
2.9K / / 03.08.2007
 
Код:
TForm::DoubleBuffered = true;
тоже не помогает?
38K
24 февраля 2009 года
maximen
14 / / 20.02.2009
Приветсвую!
Тоже не помогает - уже пробовал
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог