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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2009, 16:16   #1
fromtuba
 
Регистрация: 20.04.2009
Сообщений: 7
Печаль Рисование объектов в ddraw

Здравствуйте!! У меня тут проблема со знанием библиотеки ddraw
Инициализаци прошла успешно, полноэкранный режим работает. Теперь самое главное. У меня есть объекты
Код:
struct 
{
AnsiString Name;
int Height;
int Width;
int X;
int Y;
bool Enabled;
} Object[101];

я рисовал их раньше так:

void DrawObject()
{
Graphics::TBitmap *Buf;
for (j=1;j<=2;j++)
for (i=1;i<=100;i++)
if (Object[i].Enabled==true)
{
Buf = new  Graphics::TBitmap;
Buf->LoadFromFile("Object//"+Object[i].Name+".bmp");
Form1->Canvas->Draw(Object[i].X,Object[i].Y,Buf);
Buf->Free();
}
Все работало, но понятное дело тормозило и мерцало. теперь хочется рисовать той же методикой, только другим инструментом. Посоветуйте как? Спасибо.

Последний раз редактировалось MaTBeu; 20.04.2009 в 19:45.
fromtuba вне форума Ответить с цитированием
Старый 21.04.2009, 23:03   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

http://www.cracklab.ru/pro/faq.php?pg=1650&ln=50
Здесь есть пример использования TCanvas с DirectDraw.
Somebody вне форума Ответить с цитированием
Старый 22.04.2009, 15:00   #3
fromtuba
 
Регистрация: 20.04.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
http://www.cracklab.ru/pro/faq.php?pg=1650&ln=50
Здесь есть пример использования TCanvas с DirectDraw.
Спасибо за ответ . Почитал статейку, мно познавательного, много непонятного.
Сделал как было описанно. Вставил код:
Код:
HDC *DC;
   TRect ARect;
   int ATopPos;
   Graphics::TCanvas *DDCanvas;

   // fill the primary surface with red and the back buffer with blue
   // and put some text on each. Using a canvas makes this trivial.
   DDCanvas = new  Graphics::TCanvas;


     {// first output to the primary surface
     if (lpDDSPrimary->GetDC(DC) == DD_OK)
     {
         DDCanvas->Handle = DC; // make the canvas output to the DC
         DDCanvas->Brush->Color = clRed;
         DDCanvas->FillRect(ARect);
         DDCanvas->Brush->Style = bsClear; // transparent text background
         DDCanvas->Font->Name = "Arial";
         DDCanvas->Font->Size = 24;
         DDCanvas->Font->Color = clWhite;
         //DDCanvas->ATopPos = (480 - "A".Length()) div 2;
         DDCanvas->TextOut(10, 10, "Primary surface");

       // make sure we tidy up and release the DC
       DDCanvas->Handle = 0;
       lpDDSPrimary->ReleaseDC(DC);
     }
     else
     // now do back buffer
     if (lpDDSBack->GetDC(DC) == DD_OK)
     {
         DDCanvas->Handle = DC; // make the canvas output to the DC
         DDCanvas->Brush->Color = clBlue;
         DDCanvas->FillRect(ARect);
         DDCanvas->Brush->Style = bsClear; // transparent text background
         DDCanvas->Font->Name = "Arial";
         DDCanvas->Font->Size = 24;
         DDCanvas->Font->Color = clWhite;
         DDCanvas->TextOut(600, 10, "Back buffer");

       // make sure we tidy up and release the DC
       DDCanvas->Handle = 0;
       lpDDSBack->ReleaseDC(DC);
     }
 }
DDCanvas->Free();
HRESULT ddrval;
ddrval = lpDDSPrimary->Flip(NULL, 0);
    if(ddrval == DDERR_SURFACELOST)
    {
      ddrval = lpDDSPrimary->Restore();


    }
    if(ddrval != DDERR_WASSTILLDRAWING)
    {
      bActive = False;

    }
в таймер, казалось бы все должно работать, а нет, ошибки не выдает, но и ожидаемый текст не видно . Может все-таки где-то не так что-то сделал?

Последний раз редактировалось MaTBeu; 22.04.2009 в 22:03.
fromtuba вне форума Ответить с цитированием
Старый 22.04.2009, 16:29   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Наверное, текст успешно выводится на DDSPrimary, то есть вывод на DDSBack не производится (в примере не было else). Но его и не должно быть видно, так как здесь используется lpDDSPrimary->Flip(NULL, 0). Попробуй убрать else, тогда "Back buffer" должно быть видно.
Somebody вне форума Ответить с цитированием
Старый 23.04.2009, 12:32   #5
fromtuba
 
Регистрация: 20.04.2009
Сообщений: 7
По умолчанию

Убрал else, результат точно такой же. Поверхности меняются, но текст не на одной не видно, весь монитор глазами обшарил. Может быть другой касяк?
fromtuba вне форума Ответить с цитированием
Старый 23.04.2009, 14:17   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Не знаю, что именно. В общем-то, вроде нормально всё должно быть.
На primary лучше вообще не выводить, насколько помню, на каких-то видеокартах оно и не хотело туда выводиться у меня. Если разрешение 640x480, то координаты (600,10) для надписи "Back buffer" слишком большие, она и не выведется. Что возвращают GetDC, ReleaseDC, Flip?
Somebody вне форума Ответить с цитированием
Старый 23.04.2009, 17:03   #7
fromtuba
 
Регистрация: 20.04.2009
Сообщений: 7
По умолчанию

Менял координаты, не помогает.
GetDC очевидно отдает устройство(не уверен) ReleaseDC - Обновляет буфер, а Flip - Меняет местами буферы. Может повлиять то, что в BackBuffer изначально залит фон(при инициализации)?
fromtuba вне форума Ответить с цитированием
Старый 23.04.2009, 18:07   #8
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

В общем, смотри возвращаемые значения всего, что что-то возвращает
Somebody вне форума Ответить с цитированием
Старый 23.04.2009, 18:45   #9
fromtuba
 
Регистрация: 20.04.2009
Сообщений: 7
По умолчанию

Все просмотрел уже, потихоньку начали руки опускаться. уже думаю книги начать большие-позновательные читать. Ни каких результатов. Попробывал вместо прошлого кода в таймере поставить этот:
LPDIRECTDRAWSURFACE *pSurface;
Graphics::TBitmap *Bitmap;
Bitmap = new Graphics::TBitmap;
Bitmap->LoadFromFile("E://Projects//Ginetic//Object//H1.bmp");
// Этот компонент будет указывать на новую поверхность.
TCanvas *SurfaceCanvas;
// Здесь будет содержаться описание новой поверхности.
DDSURFACEDESC SurfaceDescription; HRESULT DDError; HDC hDeviceContext;
// Обнуляем память, содержащую описание поверхности.
ZeroMemory(&SurfaceDescription, sizeof( DDSURFACEDESC ));
// Устанавливаем член, "отвечающий" за размер описания.
SurfaceDescription.dwSize = sizeof( DDSURFACEDESC );
// Устанавливаем флаги для индикации того, что поля // характеристик, ширины и высоты действительны
SurfaceDescription.dwFlags =
DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
// Устанавливаем свойство dwCaps для создания плоской // поверхности.
SurfaceDescription.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
// Устанавливаем размеры поверхности в соответствии с шириной // и высотой компонента Bitmap.
SurfaceDescription.dwWidth = Bitmap->Width; SurfaceDescription.dwHeight = Bitmap->Height;
// Делаем попытку создать поверхность.
DDError = lpDD->CreateSurface( &SurfaceDescription,
(LPDIRECTDRAWSURFACE *) lpDDSBack, NULL ); // В случае неудачи...
if(FAILED( DDError ))
{
MessageBox(Handle, "Ну удается создать поверхность!!!", "ERROR", MB_OK);
}
// В противном случае копируем растровое изображение Bitmap // на поверхность.
// Для этого получаем контекст устройства для поверхности.
DDError = (lpDDSBack)->GetDC( &hDeviceContext );
// В случае неудачи...
if(FAILED( DDError ))
{
MessageBox(Handle, "Не удалось скопировать растровое изображение", "ERROR", MB_OK);
}
// Создаем новую канву для доступа к поверхности.
SurfaceCanvas = new TCanvas();
// Связываем новую канву с контекстом устройства поверхности.
SurfaceCanvas->Handle = hDeviceContext;
// Накладываем растровое изображение на канву поверхности.
SurfaceCanvas->Draw( 0, 0, Bitmap );
// Освобождаем контекст устройства поверхности.
(lpDDSBack)->ReleaseDC( hDeviceContext );
// Освобождаем компонент TCanvas.
delete SurfaceCanvas;
//lpDDSBack->ReleaseDC(hDeviceContext);
// Возвращаем признак успешного выполнения. return( true );
- результатом стало остановка ОС. пока BCB не отрубил, ОС не отпустило.
fromtuba вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование Granus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 32 30.06.2009 23:23
Рисование Granus Общие вопросы Delphi 2 24.12.2008 07:44
Рисование TriCERATOP Помощь студентам 5 28.11.2008 15:09
Рисование... HunterMan Win Api 10 30.04.2008 23:46
Рисование вTImage Rusl92 Компоненты Delphi 27 02.04.2008 14:18