|
김정훈 님이 쓰신 글 :
: 정확히는 게임 스테이지 에디터를 짜는데요
: 폼위에서 mousemove를 해도 폼위에 몬스터같은 그림을 계속 찍기때문에(Timage를 생성)
: 마우스가 그 위를 지나갈경우 그 그림에 대한 이벤트로 넘어가버려서
: mousemove를 쓸 수가 없어요ㅠ.ㅠ;
:
: 그래서 생각한게 mouseenter와 mouseleave를 이용해서
: 들어와있는 상태이면 무조건 처리하고
: 떠나 있는 상태면 처리하지 않는 식으로 하려는데
: 들어와있는 상태일때의 루프를 어떻게 만드나요?
:
: 타이머로 돌려야할까요?
:
음 일단 두가지 방법을 생각해 봤습니다.
처음 방법은 님 말씀대로 일정 시간 간격으로 보여주는 거겠지요
제일 무난하고 짜기도 쉬울 것 같구요.
bool isMouseEnter;
...
OnMouseEnter(...)
{
isMouseEnter = true;
...
}
OnMouseLeave(...)
{
isMouseEnter = false;
}
OnTimer(...)
{
if(isMouseEnter)
{
// 그림 찍기
}
}
대충 이런 구조가 되겠네요....타이머는 1초에서 3초 정도면 될 것 같구요
두번째 생각한 방법은 OnMouseMove 이벤트 핸들러를 폼에서 마우스가 지나는
모든 컨트롤이 공유하는 것이지요
단순히 이벤트 핸들러 하나 재정의 하고
모든 컨트롤의 OnMouseMove 이벤트 핸들러 함수를 그것으로 설정하면 되겠죠
OnMyMouseMove(...) -> OnMouseMove(...) 와 선언은 같아야 합니다.
오브젝트 인스펙터 OnMouseMove <- 여기에 OnMyMouseMove 라고 적으면 됩니다.
그래서 이 공유 이벤트 핸들러에서 받는 TObject *Sender 로 호출하는 컨트롤을 파악한 후
(제 트릭이긴 합니다만 전 이 컨트롤을 구분할 때 대개 Hint를 씁니다.
Hint 에 구분할 구분자를 (아마도 AnsiString 형의 문자 또는 문자열) 정해서 각각 적어놓고
ShowHint 를 false 로 만들어 버립니다. 그리고 그 Hint 값으로 파악해 내죠.)
각각 알맞는 처리를 해 주시면 되겠죠.
아마 이 방법은 위 방법을 쓰기는 곤란하고..
바로 밑에서 말하는 방법도 쓰기 곤란한 경우에 쓰실 수 있으실 겁니다.
이번 방법은 폼에 깔리는 다른 컨트롤들은 OnMouseMove 이벤트를 사용하지 않을 경우입니다.
그냥 폼 위에 TImage 나 다른 프리 컴포넌트에서 제공하는 마우스 영역 컴포넌트 등을 이용해서
그대로 맨 위에 덮어버리는 것입니다.
그리고 그 덮어버린 컨트롤의 OnMouseMove 를 쓰시면 되겠지요
다른 컨트롤들이 이벤트가 없거나 조금 있을 경우 쓰시면 좋겠네요.
다른 컨트롤 이벤트가 그저 간단한 이벤트라면 단순 좌표 계산으로도 충분히 커버 가능하니깐요.
밑에 깔린 TImage 들이 아마 게임 스테이지 타일 이미지라고 추정 되는데요
그러면 일정 크기를 가질 테니 그저 좌표계산으로 해당 TImage 이벤트로 보내면 되니깐요.
머 이외에도 많은 방법이 있겠습니다마는...이 이상은 금방 안떠오르네요..^^;
어차피 주어진 대로 프로그램을 만들 필요는 없겠지요.
기교적 차원에서 살짝 생각을 바꿔보면 더 좋은 해결 방법이 있을 거라고 봅니다.
그럼 즐프하세요~ ^-^*
|