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; }
Проблема перемещения компонентов по главной форме
Пишу карточную игру дурак. Столкнулся с такой проблемой:
при анимации перемещении карт на "слабых" машинах не могу увеличить скорость перемещения карт.
Результатом увеличения скорости является появление за картой шлейфа компонента, который является картой, а скорость перемещения фактически не увеличивается.
При выполнении программы на мощных конфигурациях машин(CoreDuo 8600, ОЗУ 4 ГБ, видео GeForce 8700-512МБ) задача выполняется великолепно.
Подскажите как мне побороть данную проблему, буду очень благодарен.
Картами в программе являются формы, которые содержат в себе два Image соответственно лицо и рубашка карты.
Карты создаю так:
Код:
Анимация движения карт реализуется в таймере с минимальным интервалом. Номер карты передается в массив который обслуживает анимацию.Скарость движения я изменяю с помощью цикла.
В массив 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;
}
}
}
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;
}
}
}
Цитата: maximen
...
Для медленных машин можно увеличить шаг перемещения ... Для этого надо узнать насколько быстрая машина... ориентируйся на процессор, потому что видео-карта здесь никакой роли не играет.
Ну и соответственно, чем медленнее машина, тем больше будет шаг перемещения.
P.S. вообще конечно сделать карты формами - это не очень хорошо... точнее даже очень нехорошо. Тогда уж логичнее было сделать их TImage'ми... Или точнее наследниками от этого класса, чтобы можно было гибко управлять ими.
Я думал над проблемой в аспекте Вашего мнения - и создал класс Image - однако не смог справиться с его мерцанием при перемещении...
Это выглядит очень неэстетично...
Код:
ReleaseCapture[COLOR=#0000ff]();[/COLOR]
Panel1[COLOR=#0000ff]->[/COLOR]Perform[COLOR=#0000ff]([/COLOR]WM_SYSCOMMAND[COLOR=#0000ff],0xF012,0)[/COLOR]
Panel1[COLOR=#0000ff]->[/COLOR]Perform[COLOR=#0000ff]([/COLOR]WM_SYSCOMMAND[COLOR=#0000ff],0xF012,0)[/COLOR]
Я пробовал сделать это на панели - такое же мерцание - не могу убрать его....
Цитата: maximen
Я пробовал сделать это на панели - такое же мерцание - не могу убрать его....
Хорошая статья про устранения мерцания:
http://deadbeef.narod.ru/work/articles/flicker.htm
P.S. по-моему достойна включения в FAQ или в статьи. Если это возможно без нарушения автоских прав :)
Код:
TForm::DoubleBuffered = true;
Тоже не помогает - уже пробовал