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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2010, 17:13   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию DirectX. Где я ошибаюсь?

Код во вложении(сюда не влез).
Всё вроде бы работает нормально, однако при переключении режима(из полноэкранного в оконный пропадает изображение). В чём проблема?
Вложения
Тип файла: rar DirectX.rar (176.9 Кб, 15 просмотров)
_-Re@l-_ вне форума Ответить с цитированием
Старый 16.08.2010, 20:37   #2
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

А где D3DX9Sab.dll ?
Без него не пашет.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 16.08.2010, 20:59   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Разумеется, он есть. Без него приложение вообще бы не запустилось бы.
А проблему уже нашёл.
В общем, она здесь:
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (ssAlt in Shift) and (Key = VK_RETURN) then
  begin
    FWindowed:=not FWindowed;
    FreeD3D;
    InitD3D;
    PrepareVertices;
  end;
  If Key = VK_UP Then N:=1;
  If Key = VK_LEFT Then N:=2;
  If Key = VK_RIGHT Then N:=3;
  If Key = VK_DOWN Then N:=4;
end;
А нужно так:
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (ssAlt in Shift) and (Key = VK_RETURN) then
  begin
    FWindowed:=not FWindowed;
    FreeD3D;
    InitD3D;
    N:=1;
    PrepareVertices;
  end;
  If Key = VK_UP Then N:=1;
  If Key = VK_LEFT Then N:=2;
  If Key = VK_RIGHT Then N:=3;
  If Key = VK_DOWN Then N:=4;
end;
И тогда всё прекрасно работает.
Вообще, N - это переменная которая отвечает за тип вращения матрицы(ну это у меня так)
1 - вращение по оси Х
2 - вращение по оси Y
3 - вращение по оси Z
4 - вращение по осям X,Y,Z одновременно
Планирую ещё добавить значение 0 - то есть если N = 0 то просто остановить кубик висеть так, как он висит, только пока не могу придумать как это сделать.
О! Ура. Сделал. Если что, то код вращения кубика такой:
Код:
function TForm1.RenderScene(Side:Integer): HResult;
var
   WorldMatrix:  TD3DMatrix;
   WorldMatrixX: TD3DMatrix;
   WorldMatrixY: TD3DMatrix;
   WorldMatrixZ: TD3DMatrix;
begin
  Result := ClearDevice;
  if FAILED(Result) then EXIT;
  FD3DDevice.BeginScene;
  try
    FD3DDevice.SetStreamSource(0, FD3DVertexBuffer, 0, SizeOf(TCustomVertex));
    FD3DDevice.SetFVF(D3DFVF_CUSTOMVERTEX);
    inc(FRotAngle, 1);
    Case Side Of
    0: Begin //останавливаем кубик, т.е. не изменяем мировую матрицу
    FD3DDevice.SetIndices(FD3DIndexBuffer);
    FD3DDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,0,12);
    End;
    1: Begin // вращаем кубик по оси Х, т.е. текущую мировую матрицу умножаем на WorldMatrixX
    D3DXMatrixRotationX(WorldMatrixX, GradToRad(FRotAngle));
    D3DXMatrixMultiply(WorldMatrix, WorldMatrixX, WorldMatrixX);
    FD3DDevice.SetTransform(D3DTS_WORLD, WorldMatrix);
    FD3DDevice.SetIndices(FD3DIndexBuffer);
    FD3DDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    End;
    2: Begin //вращаем кубик по оси Y, т.е. текущую мировую матрицу умножаем на WorldMatrixY
    D3DXMatrixRotationY(WorldMatrixY, GradToRad(FRotAngle));
    D3DXMatrixMultiply(WorldMatrix, WorldMatrixY,  WorldMatrixY);
    FD3DDevice.SetTransform(D3DTS_WORLD, WorldMatrix);
    FD3DDevice.SetIndices(FD3DIndexBuffer);
    FD3DDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    End;
    3: Begin //вращаем кубик по оси Z, т.е. текущую мировую матрицу умножаем на WorldMatrixZ
    D3DXMatrixRotationZ(WorldMatrixZ, GradToRad(FRotAngle));
    D3DXMatrixMultiply(WorldMatrix, WorldMatrixZ,  WorldMatrixZ);
    FD3DDevice.SetTransform(D3DTS_WORLD, WorldMatrix);
    FD3DDevice.SetIndices(FD3DIndexBuffer);
    FD3DDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12);
    End;
    4: Begin //вращаем по всем осям, т.е. перемножаем все матрицы и записываем результат в WorldMatrix
    D3DXMatrixRotationX(WorldMatrixX,GradToRad(FRotAngle));
    D3DXMatrixRotationY(WorldMatrixY,GradToRad(FRotAngle));
    D3DXMatrixRotationZ(WorldMatrixZ,GradToRad(FRotAngle));
    D3DXMatrixMultiply(WorldMatrix,WorldMatrixX,WorldMatrixY);
    D3DXMatrixMultiply(WorldMatrix,WorldMatrix, WorldMatrixZ);
    FD3DDevice.SetTransform(D3DTS_WORLD,WorldMatriX);
    FD3DDevice.DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,0,12);
    End;
    End;
  finally
    FD3DDevice.EndScene;
  end;
  FD3DDevice.Present(NIL, NIL, 0, NIL);
end;

Последний раз редактировалось _-Re@l-_; 16.08.2010 в 21:12.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
где-то ошибаюсь, а где не пойму!укажите ошибку <<Katushka>> Общие вопросы C/C++ 2 15.05.2010 11:41
C# + directx dampirik Общие вопросы .NET 2 22.01.2010 10:07
DirectX и С++ mrandrey Общие вопросы C/C++ 2 24.08.2009 14:46
Где скачать DirectX 9 SDK для Delphi7? VintProg Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 04.08.2009 09:56
Простая вещь, кажется сложной, или я ошибаюсь? mimimi PHP 8 13.03.2009 22:10