Bác nào chỉ cho em cách xài chuột trong OpenGL được không (khởi tạo, làm sao để bắt sự kiện bấm chuột, tọa độ thời điểm bấm,Object nào được chuột nhấn vào?) Em đọc trong Nehe chỉ toàn keys không có thấy mouse.
Bác nào chỉ cho em cách xài chuột trong OpenGL được không (khởi tạo, làm sao để bắt sự kiện bấm chuột, tọa độ thời điểm bấm,Object nào được chuột nhấn vào?) Em đọc trong Nehe chỉ toàn keys không có thấy mouse.
bác đã đọc hết nehe chưa mà phán vậy. Một là chuột với OGL ko có bà con gì hết, hai là có khá nhiều tut của nehe xài chuột. Bác chưa gì mà la um lên rồi.
anh march2 nóng qua',em no' mới hỏi 1 tí mà anh march giận rồi T.T .lâu lâu mới thấy march tái xuất giang hồ
Ê ngocquang, tôi bằng tuổi ông đấy, xie xie vì đã binh tui nha! ^_^
Mach2 ơi! Trong nehe chỉ có phần chuột di theo hướng nào thôi, còn lấy tọa độ điểm nhấn chuột thì mình chưa biết, với lại làm sao để biết được object nào được nhấn mình cũng kô thấy trong đó nói. Giả sử mình có bàn cờ 64 ô, làm sao để biết ô nào được nhấn, phải vẽ 64 ô tương đương 64 object à,ngày xưa làm đánh cờ trên dos (2D) thì mình dùng cách xác định tọa độ điểm nhấn chuột để => số ô. nhưng tọa độ nhấn chuột trong 3D thì lúc quay góc đi biết tính ra sao.
Ai giúp mình với, mình đang kẹt phần đó!
2 cái bạn cần là khác nhau. Bắt tọa độ thì như bình thường thôi, bắt tọa độ điểm rồi tính ngược ra tọa độ 3d bằng glUnProject hay dễ nhất như bạn cần là chỉ dùng phép chiếu Ortho để việc tính ngược đơn giản hơn. Picking thì có hắn 1 tut trên nehe bàn chuyện này. Cần nói thêm là 2 cái này đều xem như kỹ thuật advance cả nên nếu bạn chưa rành OGL thì cần tìm hiểu thêm trước khi rờ đến nó.
Thế với phần mềm đánh cờ, làm sao để biết được ô nào được nhấn (di) chuột vào hả bác Mach2!
Nếu bạn cần bắt object trong 3D "thật" thì phải dùng picking rồi. Dễ nhất là đọc tut 32 của nehe (cái này thì như tôi đã nói là khá rối rắm nếu bạn chưa rành OGL). Hoặc là đọc trong OpenGL Superbible viết cũng được. Quyển này thì chắc là bạn phải có, còn nếu ko có thì kiếm cũng dễ.
dạ, cảm ơn bác nhé, cái tut này đúng là cái em đang cần! Còn sách thì em tìm vẫn chưa ra bác ạ! Bác có không cho em với!
Chuột là sự kiện của window , khi bạn khởi tạo 1 form thì có sự kiện chuột bàn phím ...
ở trong cái WndProc (hàm call back của window ) . Còn picking ra sao thi tùy vào phần xử lý của bạn theo hướng nào (RayCaster , ObjID picking , hay bitmap .. ) .
1 số tút các bạn tham khảo về sự kiện và khởi tạo window. có gì thắc mắc hay càu nhàu thì tính sau. dân amater nên viết hơi khó hiểu .(hehe)
unit GXsystem ;
interface
{Define FPS_AUTO_BLANCE}
uses windows ,
Opengl ,
Messages ,
Sysutils ,
GXTypes ,
KeyBoard ,
GxVectorTypes;
var
SYS_KEYPRESS : Boolean ;
SYS_KEYDOWN : Boolean ;
SYS_KEYUP : Boolean ;
SYS_MOUSEUP : Boolean ;
SYS_MOUSEDOWN : BOOLEAN ;
SYS_MOUSEWHEEL : BOOLEAN ;
KeyList : Set of Byte = [] ;
MOUSEBUTTONs : SET of TXMOUSEBUTTONTAG ;
MOUSEWHEEL : Integer ;
MOUSELEFT
,MOUSERIGHT
,MOUSEMIDdle : Boolean;
MOUSEMOVE : Boolean;
MouseOffX : integer;
MouseOffY : Integer;
//------------------------------------------------------------------------------
SYS_Viewer : Tvector3f;
//------------------------------------------------------------------------------
SYS_MSG : INteger ;
SYS_WPARAM : WPARAM ;
SYS_LPARAM : LPARAM ;
SYS_SPF : integer=0 ;
SYS_FPS : integer=100;
SYS_FCount : integer=0;
Sys_FPS_String : String;
Sys_StartTime : Cardinal =0;
Sys_EndTime : Cardinal =0;
Sys_ElappedTime : Cardinal =0;
SYS_DeltaTime : Cardinal =0;
SYS_INTERVAL : Integer =1000;
SYS_TIMEInterval : Integer =0;
//------------------------------------------------------------------------------
H_wnd : Hwnd = 0 ;
H_dc : Hdc = 0 ;
H_Rc : HglRc = 0 ;
ScrWidth : Integer = 800;
ScrHeight : integer = 600;
ScrBits : integer = 32;
Full_screen : boolean = False ;
SCr_Othor_Swap : Boolean = False ;
//------------------------------------------------------------------------------
DesktopRect : Trect;
//------------------------------------------------------------------------------
Mou*** ,MouseY : Integer;
SYS_MLeftTime : Integer =0;
SYS_MLeftOldTime : Integer =0;
SYS_MRightTime : Integer =0;
SYS_MRightOldTime : Integer =0;
SYS_MLeftLastTime : Integer =0;
SYS_MRightLastTime : Integer =0;
SYS_MTimeMin : Cardinal = 250;
SYS_MouseLOCk : Boolean = false;
SYS_MouseLOckX : Integer = 0;
SYS_MouseLockY : Integer = 0;
MOusePoint : Tpoint;
SYS_Char_Buffer : String;
//------------------------------------------------------------------------------
Procedure TIMERESET;
Procedure TIMEACTIVATE;
Function TIMEStatus : TXTimeTag;
//------------------------------------------------------------------------------
Function KeyNameToCode (name : string ) : Integer;
Function KeyCOdeToName (Code : Integer) : String;
Function KeyDown (Kname : string ) : Boolean ;Overload;
Function KeyDown (VK : Integer ) : Boolean ;Overload;
Function keyUp (Vk : Integer ) : Boolean ;overload;
Function keyup (Vk : String ) : Boolean ;Overload;
Function keyPress (Vk : Integer ) : Boolean ;Overload;
Function keyPress (Vk : String ) : Boolean ;Overload;
Function KeyStatus (VK : Integer ) : TStatusTag;
Function KeyCode : Integer;
Function KeyChar : TXChar;
Function KeyMultiDown (K1 ,K2 : string ) : Boolean; Overload;
Function KeyMultiDown (K1 ,K2,K3 : string ) : Boolean; Overload;
Function KeyMultiDown (Keys : Array Of string ) : Boolean; Overload;
Function KeyTest (key : Integer ; T : TXkeyStatusTag ) : Boolean; Overload;
Function keytest (key : String ; T : TXkeyStatusTag ) : Boolean ; Overload;
//------------------------------------------------------------------------------
Procedure KeyUpdate ;
Procedure KeyReset ;
//------------------------------------------------------------------------------
Procedure MouseUpdate ;
Procedure Mousereset ;
//------------------------------------------------------------------------------
Function MLeftPress : Boolean;
Function MRightPress : Boolean;
//------------------------------------------------------------------------------
Function MLeftDown : Boolean;
Function MRightDown : Boolean;
//------------------------------------------------------------------------------
Function MLeftUp : Boolean;
Function MRightUp : Boolean;
//------------------------------------------------------------------------------
Function MleftTimeElapped : cardinal;
Function MRightTimeElapped : cardinal;
//------------------------------------------------------------------------------
Function MleftTime2Click : cardinal;
Function MRightTime2Click : cardinal;
//------------------------------------------------------------------------------
Function MLeft2Click : Boolean;
Function MRiGht2Click : Boolean;
//------------------------------------------------------------------------------
Function MouseIsMoveP (X : integer =0;Y : Integer =0) : TmousePoints;Overload;
Function MouseIsMove (X : integer =0;Y : Integer =0) : TmouseMoves;Overload;
PRocedure MouseLockPosition (X, y : integer ;Locked : Boolean);
//------------------------------------------------------------------------------
Function Getdesktoprect : Trect;
function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
Procedure StringOK (Mess1 : String ;Titl : string );
Procedure IntegerOK (Mess1 : Integer ;Titl : string );
Procedure SingleOK (Mess1 : Single ;Titl : string );
//------------------------------------------------------------------------------
Function SYSGetFps : Integer;
Function SYSGetFpsString : string ;
//------------------------------------------------------------------------------
implementation
//------------------------------------------------------------------------------
Procedure StringOK (Mess1 : String ;titl : string );
begin
Messagebox (0, Pchar(Titl),Pchar(mess1),Mb_ok);
End;
//------------------------------------------------------------------------------
Procedure INtegerOK (Mess1 : Integer ;titl : string );
begin
Messagebox (0, Pchar(Titl),Pchar(Format('%d',[mess1])),Mb_ok);
End;
//------------------------------------------------------------------------------
Procedure SingleOK (Mess1 : Single ;titl : string );
begin
Messagebox (0, Pchar(Titl),Pchar(Format('%.2f',[mess1])),Mb_ok);
End;
//------------------------------------------------------------------------------
procedure MouseUpdate;
begin
Windows.GetCursorPos(Mousepoint) ;
Mou*** := mousepoint.X ;
If Scr_othor_Swap then
mousey := ScrHeight - mousepoint.Y Else
mousey := mousepoint.Y ;
IF SYS_MouseLOck then
setcursorPos (SYS_MouseLockx ,SYS_mouseLockY);
Case SYS_MSG Of
Wm_LBUttonDOWN : begin
SYS_MOUSEDOWN := True ;
MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSELEFT] ;
MOUSELEFT := TRUE;
SYS_MLeftTime := GettickCount()-SYS_MLeftOLdTime;
SYS_MLeftOLdTime := GettickCount();
End;
Wm_RBUttonDown : begin
SYS_MOUSEDOWN := True ;
MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSERIGHT] ;
MOUSERIGHT := TRUE;
SYS_MRightTime := GettickCount()- SYS_MrightOldTime;
SYS_MRightOLdTime := GetTickCount();
End;
Wm_LButtonUp : begin
SYS_MOUSEUp := True ;
MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSELEFT] ;
MOUSELEFT := FALSE;
SYS_MLeftLastTime := GetTickCount-SYS_MLeftOLDTime;
End;
Wm_RButtonUp : Begin
SYS_MOUSEUp := True ;
MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSERIGHT] ;
MOUSERIGHT := FALSE;
SYS_MRightLastTime := GettickCount;
End;
Wm_MButtonDown : begin
SYS_MOUSEDOWN := True ;
MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSEMIDDLE] ;
MouseMiddle := true ;
End;
Wm_MButtonUp : Begin
SYS_MOUSEUP := True ;
MOUSEBUTTONS := MOUSEBUTTONs+[X_MOUSEMIDDLE] ;
MouseMiddle := False ;
End;
Wm_MOUSEWHEEL : Begin
SYS_MOUSEWHEEL := TRUE ;
MOUSEWHEEL := SYS_WPARAM;
End;
End;
End;
//------------------------------------------------------------------------------
PRocedure MouseReset ;
Begin
SYS_MLeftTime := 0;
SYS_MRightTime := 0;
SYS_MOUSEWHEEL := False;
SYS_MOUSEDOWN := FALSE;
SYS_MOUSEUP := FALSE;
MOUSEWHEEL := 0;
MOUSEBUTTONS := [] ;
End;
//------------------------------------------------------------------------------
Procedure KeyUpdate ;
Begin
Case SYS_MSG Of
WM_KeyDOWN : Begin
SYS_KeyDown := True ;
KeyList := KeyList+[SYS_WPARAM] ;
End;
Wm_KeyUp : Begin
SYS_KeyUp := True ;
KeyList := KeyList+[SYS_WPARAM] ;
End;
Wm_Char : begin
SYS_KeyPress := true ;
SYS_Char_Buffer := Char(SYS_WPARAM);
eND;
End;
End;
//------------------------------------------------------------------------------
Procedure keyReset;
Begin
KeyList := [];
SYS_CHAR_BUFFER := '';
SYS_KeyDOWN := False;
SYS_KeyUp := False;
SYS_keyPress := False;
End;
//------------------------------------------------------------------------------
Function Getdesktoprect : Trect;
var HDesk : Hwnd;
begin
Hdesk := windows.GetDesktopWindow ;
Windows.GetWindowRect(Hdesk , result) ;
End;
//------------------------------------------------------------------------------
function WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
Begin
SYS_MSG := Msg;
SYS_WPARAM := WPARAM ;
SYS_LPARAM := LPARAM ;
KeyUpdate;
MOUSEUpdate;
// SYS_Char_Buffer := '';
//........................................
case (Msg) of
//........................................
WM_CREATE:
begin
SYS_StartTime := GettickCount;
end;
WM_LbuttonDown : begin
End;
WM_LbuttonUp : Begin
End;
//........................................
WM_RbuttonDown : Begin
End;
//........................................
WM_RbuttonUp : Begin
End;
Wm_MButtonDown :
begin
End;
Wm_MButtonUp :
begin
MouseMiddle := False ;
End;
//........................................
WM_CLOSE:
begin
PostQuitMessage(0);
end;
else
Result := DefWindowProc(hWnd, Msg, wParam, lParam); // Default result if nothing happens
end;
//........................................
end;
//------------------------------------------------------------------------------
Function KeyNameToCode (name : string ) : Integer;
begin
Result := KeyBoard.KeyNameToVirtualKeyCode(Name);
End;
//------------------------------------------------------------------------------
Function KeyCOdeToName (Code : Integer) : String;
begin
Result := keyboard.VirtualKeyCodeToKeyName( Code ) ;
End;
//------------------------------------------------------------------------------
Function KeyDown (Kname : string ) : Boolean;
begin
result := IskeyDown (KeyNameToCode(Kname));
End;
//------------------------------------------------------------------------------
Function KeyDown (VK : Integer ) : Boolean;
Begin
Result := ISkeyDown (Vk);
End;
//------------------------------------------------------------------------------
Function keyStatus (Vk : Integer ) : TStatusTag ;
Begin
If keyDown (Vk) then Result := Result+[X_keyDown ] ;
If keyUp (Vk) then Result := Result+[X_keyUp ] ;
If keypress (Vk) then Result := Result+[X_keyPress ] ;
End;
//------------------------------------------------------------------------------
Function KeyCode : Integer;
begin
result := 0;
If Length(SYS_Char_Buffer)>0 then
Result := ORD(SYS_Char_BUFFER[1]);
End;
//------------------------------------------------------------------------------
Function KeyChar : TXChar;
begin
Result := SYS_CHAR_BUFFER ;
End;
//------------------------------------------------------------------------------------------------------------------
Function KeyMultiDown (K1 ,K2 : string ) : Boolean;
begin
result := False;
If (KeyDown (k1))
And
(KeyDown (k2))
Then
result := true;
End;
//------------------------------------------------------------------------------------------------------------------
Function KeyMultiDown (K1 ,K2,K3 : string ) : Boolean; Overload;
Begin
result := False;
If (KeyDown (k1))
And
(Keydown (k2))
And
(keydown (k3))
then
result := true ;
End;
//------------------------------------------------------------------------------------------------------------------
Function KeyMultiDown (Keys : Array Of string ) : Boolean;
var
T : Boolean;
i : Integer;
begin
result := False;
T := Keydown (Keys[0]);
For i:=1 to High (Keys) do
T := T And keyDown(KEys[i]) ;
result := T;
End;
//------------------------------------------------------------------------------------------------------------------
Function MLeftPress : Boolean;
begin
Result := (SYS_MOUSEDOWN)And (X_MOUSELEFT in MOUSEBUTTONS);
End;
//------------------------------------------------------------------------------------------------------------------
Function MRightPress : Boolean;
Begin
Result := (SYS_MOUSEDOWN)And (X_MOUSERIGHT in MOUSEBUTTONS);
End;
//---------------------------------------------------------------------------------
//-------------------------------
Function MLeftDown : Boolean;
Begin
result := keyboard.IsKeyDown(VK_Lbutton);
End;
//------------------------------------------------------------------------------------------------------------------
Function MRightDown : Boolean;
begin
result := keyboard.IsKeyDown(VK_Rbutton);
End;
//------------------------------------------------------------------------------------------------------------------
Function MLeftUp : Boolean;
begin
Result := (SYS_MOUSEUP)And (X_MOUSERIGHT in MOUSEBUTTONS);
End;
//------------------------------------------------------------------------------------------------------------------
Function MRightUp : Boolean;
begin
Result := (SYS_MOUSEUP)And (X_MOUSERIGHT in MOUSEBUTTONS);
End;
//------------------------------------------------------------------------------------------------------------------
PRocedure MouseLockPosition (X, y : integer;Locked : Boolean );
Begin
SYS_MouseLOck := Locked;
SYS_MouseLockX := X;
SYS_MouseLockY := Y;
End;
//------------------------------------------------------------------------------------------------------------------
Bookmarks