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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2010, 14:24   #21
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Не получается задать шрифт (Delphi XE).
Код:
...
DXCreateFont(18,0,'Tahoma',iFont);
DXOutText('Test',Rect(470,900,1220,990),$FF000000,iFont);
...
Размер, цвет, флаг выставляются, а шрифт нет.
Какой бы не выставлял выглядят все одинаково.

Рисованный пока еще не пробовал.
ZBEP вне форума Ответить с цитированием
Старый 21.12.2010, 19:10   #22
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Ой, я уже и забыл про то как реализовал тамошний спагетти код...

Но у меня в delphi 7 все пашет правильно...
Вложения
Тип файла: rar ex3.rar (11.0 Кб, 26 просмотров)
Kostia вне форума Ответить с цитированием
Старый 21.12.2010, 22:15   #23
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Kostia, угу, на 7 задается шрифт, на XE не хочет из-за юникода скорее всего(
Ну он и прорисовывать не хотел по началу, но после незначительных изменений все заработало.
А со шрифтами что-то не получается под XE переделать
Я пока в раздумьях, может растровый шрифт буду использовать, хз.

И еще такой вопрос, как можно прорисовать только часть загруженного объекта?
(например загрузил рисунок 200х100, а прорисовываю только 100х100).

П.с.
Если вдруг кому-то понадобится, то во вложении приспособленный к Delphi XE Mini 2D engine. (на 2009, 2010, так же по идее должен успешно работать).
Проблему со шрифтом пока не решил.
Вложения
Тип файла: rar Mini 2D engine XE.rar (6.4 Кб, 29 просмотров)

Последний раз редактировалось ZBEP; 22.12.2010 в 08:27.
ZBEP вне форума Ответить с цитированием
Старый 23.12.2010, 14:17   #24
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Все, разобрался с прикручиванием шрифта на XE.
Нужно вместо D3DXCreateFont использовать D3DXCreateFontW (также как и с прорисовкой примерно было, хз почему раньше не сделал так).

Было:
Код:
procedure DXCreateFont(Height: integer; Flag: DWORD; FontName: pChar; var ppFont: ID3DXFont);
var
  DC: HDC;
  FBold: LongWord;
  italic: boolean;
begin
  DC := GetDC(0);
  italic:=false;
  FBold:=0;
  if Flag and 1 = 1 then italic:=true;
  if (Flag shr 1) and 1 = 1 then FBold:=FW_BOLD;
  try
    D3DXCreateFont(ppiD3DDevice9, Height,
      0, FBold, 0, italic, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE,
      FontName, ppFont);
  finally
    ReleaseDC(0, DC);
  end;
end;
Стало:
Код:
procedure DXCreateFont(Height: integer; Flag: DWORD; FontName: pChar; var ppFont: ID3DXFont);
var
  DC: HDC;
  FBold: LongWord;
  italic: boolean;
begin
  DC := GetDC(0);
  italic:=false;
  FBold:=0;
  if Flag and 1 = 1 then italic:=true;
  if (Flag shr 1) and 1 = 1 then FBold:=FW_BOLD;
  try
    D3DXCreateFontW(ppiD3DDevice9, Height,
      0, FBold, 0, italic, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE,
      FontName, ppFont);
  finally
    ReleaseDC(0, DC);
  end;
end;
ZBEP вне форума Ответить с цитированием
Старый 28.12.2010, 03:50   #25
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

При попытке загрузить любую текстуру при принятии команды idIRC -ом от idIRCServer -а, изображение часто не выводится и прога намертво виснит.
Пример:
Код:
procedure TForm1.IdIRC1DellKart(ASender: TIdCommand); 
begin
DXLoadTextureFromFile('Data/Karts/1.png',Bus,0);
end;
Функцию DXLoadTextureFromFile я уже ковырял и почти без результатно.
Ожидание перед загрузкой текстуры не помогает, получилось сделать только с использованием таймера, но это не выход.

Код:
procedure TForm1.IdIRC1DellKart(ASender: TIdCommand); 
begin
timer2.enabled:=True;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
DXLoadTextureFromFile('Data/Karts/1.png',Bus,0);
timer2.Enabled:=false;
end;
Тогда грузится всегда и без вылетов, но необходимо загружать текстуру в процедуре IdIRC1DellKart.
Как можно решить эту проблему?

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

А если сделать так:
Код:
procedure TForm1.IdIRC1DellKart(ASender: TIdCommand); 
begin
IdIRC1.CommandHandlers.Items[1].Enabled:=false; //Это команда DellKart, типа обрабатывать ее или нет.
DXLoadTextureFromFile('Data/Karts/1.png',Bus,0);
IdIRC1.CommandHandlers.Items[1].Enabled:=true;
end;
То иногда начинаются жуткие артефакты (видео) в программе и немного поменьше вне ее и после закрытия проги не исчезают.
(Начинает экран зерниться).
С чем это связано я хз, INDY явно против DX :lol:

Отключил в ннди ParseParams и сделал паузу перед загрузкой текстуры в 10мс, немного помогло, зависает реже, но зависает.
Код:
IdIRC1.CommandHandlers.Items[1].ParseParams:=False;

Последний раз редактировалось ZBEP; 28.12.2010 в 17:54.
ZBEP вне форума Ответить с цитированием
Старый 29.12.2010, 18:36   #26
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

А юзать виндовые треды не пробовали? Модет и поможет... хотя х.з. ...
Kostia вне форума Ответить с цитированием
Старый 29.12.2010, 20:48   #27
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Kostia, вроде дело в потоках.

Цитата:
Судя по тому что написано дело именно в потоках. Стандартом VCL является то что вы не можете использовать Visual Component Library из потоков. Зная немного IdXXX реальнее предположить что вы не в главном потоке это делаете. Рекоммендация одна и та же как написал Frodo_Torbins. Получив по IdXXX вы посылаете себе сообщение.
Попробую изобразить код что надо:
Код:
TForm1 = class(TForm) 
  ... 
  private 
      procedure WM_User_1(var Message: TMessage); message WM_User+1; 
   ... 
 
procedure TForm1.IdIRC1DellKart(ASender: TIdCommand); 
begin 
    PostMessage(Handle, WM_User+1, 0, 0) 
end;  
 
procedure TForm1.WM_User_1(var Message: TMessage); 
begin 
    Memo1Click(Self.Memo1); 
end;
Сейчас пытаюсь понять, как передать в WM_User_1, нужное значение, не объявляя переменную в теле формы, что бы было что-то вроде этого:
Код:
procedure TForm1.IdIRC1DellKart(ASender: TIdCommand); 
var KDell:string; 
begin 
KDell:=ASender.RawLine[12];  //Как KDell передать, не объявляя ее глобально? 
PostMessage(Handle, WM_User+1, 0, 0) 
end; 
 
procedure TForm1.WM_User_1(var Message: TMessage); 
begin 
DXLoadTextureFromFile('Data/Karts/'+KDell+'.png',Bus,0); //Что бы загрузило текстуру по полученному номеру. 
end;

Последний раз редактировалось ZBEP; 30.12.2010 в 19:30.
ZBEP вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уроки по использованию Direct3D в Delphi Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 32 23.02.2010 17:48
Перспектива в Direct3D Ulex Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 11.03.2008 01:04
Aquatica engine MagicIndie Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 23.04.2007 18:33