
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.231.217.107] |
![]() |
|
Сообщ.
#1
,
|
|
|
Здравствуйте, посоветуйте что можно сделать для решения проблемы.
Имеем стандартную форму Delphi7 и графическую библиотеку Blitz3D. При инициализации библиотеки можно задать окно, в которое будет делаться рендер. Если не задавать окно, то создастся новое. При создании нового окна, ввод обрабатывается, функциями библиотеки, но когда в качестве окна задаёшь, например, окно формы обработать клавиши не получается ни функциями библиотеки, ни стандартным обработчиком OnKeyDown формы в которую редерит B3D. Вот исходный бредо-код: ![]() ![]() unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Blitz3D, OleCtnrs, ExtCtrls, StdCtrls; type TMainForm = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure InitB3D(); procedure LoopB3D(); procedure QuitB3D(); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; TNewThread = class(TThread) private procedure ProcessLoop(); protected procedure Execute; override; end; TModel = class private obj: BBObject; public constructor Create(path:string); procedure Scale(size:float = 1); procedure Position(x,y,z:integer); end; var MainForm: TMainForm; b3dState: Boolean; model: TModel; camera: BBCamera; light: BBLight; implementation {$R *.dfm} constructor TModel.Create(path:string); begin obj:=bbLoadMesh(PAnsiChar(path)); end; procedure TModel.Position(x, y, z: integer); begin bbPositionEntity(obj,x,y,z); end; procedure TModel.Scale(size:float); begin bbScaleEntity(obj,size,size,size); end; procedure TNewThread.Execute(); begin repeat sleep(10); Synchronize(ProcessLoop); until Terminated; end; procedure TNewThread.ProcessLoop(); begin MainForm.LoopB3D(); end; procedure TMainForm.InitB3D(); begin b3dState:=LoadLibrary('b3d.dll'); if(b3dState) then begin bbSetBlitz3DHWND(MainForm.Handle); bbBeginBlitz3D(); bbGraphics3D(MainForm.Width,MainForm.Height,32,GFX_WINDOWED); bbAntiAlias(1); bbSetBuffer(bbBackBuffer()); model:= TModel.Create('models/BMW325I/BMW325I.3ds'); camera:=bbCreateCamera(); bbCameraClsColor(camera,200,200,200); bbCameraRange(camera,1,100000); light:=bbCreateLight(); bbPositionEntity(light,50,50,100); bbLightRange(light,200); bbLightColor(light,250,250,250); end; end; procedure TMainForm.LoopB3D(); begin if(b3dState)then begin if(bbKeyDown(KEY_DOWN)=1)then bbMoveEntity(camera,0,0,-500); if(bbKeyDown(KEY_UP)=1)then bbMoveEntity(camera,0,0,500); bbUpdateWorld(); bbRenderWorld(); bbFlip(); end; end; procedure TMainForm.QuitB3D(); begin if(b3dState)then bbEndBlitz3D(); end; procedure TMainForm.FormCreate(Sender: TObject); var newThread:TNewThread; begin InitB3D(); newThread:=TNewThread.Create(true); newThread.FreeOnTerminate:=true; newThread.Priority:=tpNormal; newThread.Resume; end; procedure TMainForm.FormDestroy(Sender: TObject); begin QuitB3D(); end; procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if(Key=KEY_DOWN)then ShowMessage('sss'); end; end. |