⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geneditpreviewdlg.cpp

📁 3D游戏场景编辑器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//	==================================================================================
void CGenEditPreviewDlg :: ControlCamera()		
{
	geXForm3d		TempXform;				//	for holding rotational info
	geQuaternion	Quat;					//	our quaternion variable
	geFloat			TURN_SPEED = 0.0f;		// speed camera will move if turning left/right
	geFloat			MOVE_SPEED = 0.0f;		//	speed craft will move forward or backward
	int				Movement = 0;
    char			buffer[256]; 
    HRESULT			hr; 
	DIMOUSESTATE	MouseState;
	float			Sensitivity = 0.005f;
	float			NormalSpeed = 60.0f;

											//	DirectInput stuff
    hr = g_pdevKeyboard->GetDeviceState(sizeof(buffer),(LPVOID)&buffer); 
    if FAILED(hr) 
    {  if (hr == DIERR_INPUTLOST) ReacquireKeyboardInput();
      hr = g_pdevKeyboard->GetDeviceState(sizeof(buffer),(LPVOID)&buffer); 
    } 	

   hr = g_pdevMouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&MouseState); 
    if FAILED(hr) 
    {  if (hr == DIERR_INPUTLOST) ReacquireMouseInput();
      hr = g_pdevMouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&MouseState); 
    } 	

	if ((MouseState.lX) | (MouseState.lY) |
		(KEYDOWN(buffer, ACTION_FORWARD))  |
		(KEYDOWN(buffer, ACTION_BACKWARD)) |
		(KEYDOWN(buffer, ACTION_SLIDE_LEFT))  |
		(KEYDOWN(buffer, ACTION_SLIDE_RIGHT)))
		
	{
		if (MouseState.lX)		//	is mouse moving left or right?
		{
		TempXform = XForm;
		geXForm3d_SetZRotation(&TempXform, 0.0f);	//	Prevent actor roll
		geXForm3d_GetUp(&TempXform, &m_cameraUp);		//	Get Z axis
		
		TURN_SPEED   = MouseState.lX * Sensitivity *20;
									/*	We will create a quaternion based on our actor's
										object-space y axis. This is completely independent
										from the World's y axis. Then we will rotate this
										quaternion based on our mouse's position. */
		geQuaternion_SetFromAxisAngle(&Quat, &m_cameraUp, -RAD(TURN_SPEED));
									/*	Now, we convert our quaternion into a temporary
										transform. This is a preparatory step so we can
										give our PlayerXform the rotational properties of
										our quaternion. */
		geQuaternion_ToMatrix(&Quat, &TempXform);
									/*	Finally, we paste our TempXform's rotational
										properties into our PlayerXform. Our PlayerXform
										now is rotated in object-space. */
		geXForm3d_Multiply(&TempXform, &XForm, &XForm);
		}	//	if (MouseState.1X...
		
		if (MouseState.lY)			//	is mouse moving up or down?
		{
		TempXform = XForm;
		geXForm3d_SetZRotation(&TempXform, 0.0f);		//	Prevent actor roll
		geXForm3d_GetLeft(&XForm, &m_cameraLeft);		//	Get X axis
		
		TURN_SPEED   = MouseState.lY * Sensitivity *20;
		geQuaternion_SetFromAxisAngle(&Quat, &m_cameraLeft, RAD(TURN_SPEED));
		geQuaternion_ToMatrix(&Quat, &TempXform);
		geXForm3d_Multiply(&TempXform, &XForm, &XForm);
		}	//	if (MouseState.1Y...
		
		//	MOVEMENT CONTROL	=============================================================
		if (KEYDOWN(buffer, ACTION_FORWARD))					// Move Forward	
		{
			Movement += 1;
			MOVE_SPEED = Movement * Sensitivity * 2000;	//	determine the speed
			geXForm3d_GetIn(&XForm, &m_cameraIn);				//	Get the forward vector for the craft 
			MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraIn);		//	move it forward
		}
		
		if (KEYDOWN(buffer, ACTION_BACKWARD))					// Move Backward
		{
			Movement -= 1;
			MOVE_SPEED = Movement * Sensitivity * 2000;	//	determine the speed
			geXForm3d_GetIn(&XForm, &m_cameraIn);				//	Get the forward vector for the craft 
			MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraIn);		//	move it forward
		}
		
		if (KEYDOWN(buffer, ACTION_SLIDE_LEFT))					//	Slide left
		{
			Movement += 1;
			MOVE_SPEED = Movement * Sensitivity * 2000;	//	determine the speed
			geXForm3d_GetLeft(&XForm, &m_cameraLeft);			//	Get the left vector for the craft 
			MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraLeft);	//	move it left
		}
		
		if (KEYDOWN(buffer, ACTION_SLIDE_RIGHT))				//	Slide right
		{
			Movement -= 1;
			MOVE_SPEED = Movement * Sensitivity * 2000;	//	determine the speed
			geXForm3d_GetLeft(&XForm, &m_cameraLeft);			//	Get the left vector for the craft 
			MoveCamera ((float)NormalSpeed * MOVE_SPEED, &m_cameraLeft);		//	move it right
		}
		
	}	//	if (MouseState.1X ||...
	
						
										//	Translate ONCE after rotation and movement
	XForm.Translation = m_cameraNewPos;	//	update our camera's position in the world
	geCamera_SetWorldSpaceXForm(Camera, &XForm);

		if (KEYDOWN(buffer, ACTION_MENU))	//	check for <Esc>
		{run = 0;}
}



void CGenEditPreviewDlg::OnPreviewBrowseBtn() 
{

	int				itemtext = 0;
	int				nItem = 0;
	LPCTSTR			bsp = NULL;
	CFileDialog		m_levelFile
		(
		TRUE,
		bsp,
		CGlobals::m_GlobalAppPath,
		OFN_EXTENSIONDIFFERENT	|
		OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST,
		_T("bsp files(.bsp)|*.bsp|")
		);
	
	m_levelFile.m_ofn.lpstrTitle	="GenEdit QuickViewer Level Picker";

	if(IDOK !=m_levelFile.DoModal())
		return;
	m_previewLevelList.DeleteItem(nItem);	//	clear the list to make room for new entry
	
	POSITION pos = m_levelFile.GetStartPosition();
	while (pos)
	m_previewLevelList.InsertItem(m_previewLevelList.GetItemCount(), m_levelFile.GetNextPathName(pos));
	m_previewLevelPath = m_previewLevelList.GetItemText( itemtext, NULL ); 
	m_previewWithEngineBtn.EnableWindow(TRUE);

	UpdateData(FALSE);
}


void CGenEditPreviewDlg::OnRadio640() 
{
	Width = 640;
	Height = 480;
	
}


void CGenEditPreviewDlg::OnRadio800() 
{
	Width = 800;
	Height = 600;
	
}


void CGenEditPreviewDlg::OnRadio1024() 
{
	Width = 1024;
	Height = 768;
	
}


void CGenEditPreviewDlg::OnSoftwareRadio() 
{
	m_DriverName = _T("Software");
	
	OnRadio640();

	m_640RadioBtn->SetCheck(1);
	m_800RadioBtn->SetCheck(0);
	m_1024RadioBtn->SetCheck(0);

	m_softwareText.ShowWindow(TRUE);

	m_800RadioBtn->EnableWindow(FALSE);
	m_1024RadioBtn->EnableWindow(FALSE);

	m_bDrawGripper = TRUE;
	RedrawWindow();

}


void CGenEditPreviewDlg::OnDirect3dRadio() 
{
	m_DriverName = _T("D3D");	

	m_softwareText.ShowWindow(FALSE);

	m_800RadioBtn->EnableWindow(TRUE);
	m_1024RadioBtn->EnableWindow(TRUE);

	m_bDrawGripper = FALSE;
	RedrawWindow();

}


void CGenEditPreviewDlg::OnGlideRadio() 
{
	m_DriverName = _T("Glide");	

	m_softwareText.ShowWindow(FALSE);

	m_800RadioBtn->EnableWindow(TRUE);
	m_1024RadioBtn->EnableWindow(TRUE);

	m_bDrawGripper = FALSE;
	RedrawWindow();
}


void CGenEditPreviewDlg::OnRadioCollide() 
{
	m_collisionDetection = true;
	
}


void CGenEditPreviewDlg::OnRadioNocollide() 
{
	m_collisionDetection = false;	
}



void CGenEditPreviewDlg::OnClose() 
{
	run = 0;

	CDialog::EndDialog(1);
}


void CGenEditPreviewDlg::OnOK()
{
	run = 0;

	CDialog::EndDialog(1);
}


void CGenEditPreviewDlg::OnKillfocusCameraX() 
{
	int	lastValue = m_cameraXPos;
	int currentValue = GetDlgItemInt(IDC_CAMERA_X);

	if (currentValue == 0)
	{
		this->SetDlgItemInt(IDC_CAMERA_X, 0);
		m_cameraSliderX.SetPos(0);
		UpdateData(TRUE);
		return;
	}

	if ((currentValue >= -4000) && (currentValue <= 4000)) 
	{
		m_cameraXPos = currentValue;
		m_cameraSliderX.SetPos(m_cameraXPos);
		UpdateData(TRUE);	
		return;
	}
	else
	{
		m_cameraXPos = lastValue;
		UpdateData(FALSE);
		AfxMessageBox("Value must be >= -4000 and <= 4000");
	}
}

void CGenEditPreviewDlg::OnKillfocusCameraY() 
{
	int	lastValue = m_cameraYPos;
	int currentValue = GetDlgItemInt(IDC_CAMERA_Y);

	if (currentValue == 0)
	{
		this->SetDlgItemInt(IDC_CAMERA_Y, 0);
		m_cameraSliderY.SetPos(0);
		UpdateData(TRUE);
		return;
	}

	if ((currentValue >= -4000) && (currentValue <= 4000)) 
	{
		m_cameraYPos = currentValue;
		m_cameraSliderY.SetPos(m_cameraYPos);
		UpdateData(TRUE);	
		return;
	}
	else
	{
		m_cameraYPos = lastValue;
		UpdateData(FALSE);
		AfxMessageBox("Value must be >= -4000 and <= 4000");
	}
}

void CGenEditPreviewDlg::OnKillfocusCameraZ() 
{
	int	lastValue = m_cameraZPos;
	int currentValue = GetDlgItemInt(IDC_CAMERA_Z);

	if (currentValue == 0)
	{
		this->SetDlgItemInt(IDC_CAMERA_Z, 0);
		m_cameraSliderZ.SetPos(0);
		UpdateData(TRUE);
		return;
	}

	if ((currentValue >= -4000) && (currentValue <= 4000)) 
	{
		m_cameraZPos = currentValue;
		m_cameraSliderZ.SetPos(m_cameraZPos);
		UpdateData(TRUE);	
		return;
	}
	else
	{
		m_cameraZPos = lastValue;
		UpdateData(FALSE);
		AfxMessageBox("Value must be >= -4000 and <= 4000");
	}
}


void CGenEditPreviewDlg::OnHScroll(UINT nSBCode, UINT nPos, CSliderCtrl* pScrollBar) 
{
	CSliderCtrl *pSlider = (CSliderCtrl*) pScrollBar;
	
	
	if (pSlider->m_hWnd == m_cameraSliderX.m_hWnd)
		m_cameraXPos = m_cameraSliderX.GetPos();
	if (pSlider->m_hWnd == m_cameraSliderY.m_hWnd)
		m_cameraYPos = m_cameraSliderY.GetPos();
	if (pSlider->m_hWnd == m_cameraSliderZ.m_hWnd)
		m_cameraZPos = m_cameraSliderZ.GetPos();
	
	UpdateData(FALSE);
}

void CGenEditPreviewDlg::OnPaint() 
{
	CPaintDC dc(this); 

	if(m_bDrawGripper)
	{
		CRect rc;
		GetClientRect(rc);

		rc.left = rc.right - 20;
		rc.top = rc.bottom - 20;
		m_GripperRect = rc;
		dc.DrawFrameControl(rc,DFC_SCROLL,DFCS_SCROLLSIZEGRIP);
	}
}


UINT CGenEditPreviewDlg::OnNcHitTest(CPoint point)
{
	UINT ht = CDialog::OnNcHitTest(point);

	if(ht==HTCLIENT && m_bDrawGripper)
	{
		CRect rc;
		GetWindowRect( rc );
		rc.left = rc.right - 20;
		rc.top = rc.bottom - 20;
		if(rc.PtInRect(point))
		{
			ht = HTBOTTOMRIGHT;
		}
	}
	return ht;
}

void CGenEditPreviewDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	InvalidateRect(m_GripperRect);	

	RedrawWindow();
}


								//	post 0.55
								//	zero out camera coordinates, 
								//	set camera at level center
void CGenEditPreviewDlg::OnZeroCameraBtn() 
{
	m_cameraSliderX.SetPos(0);
	m_cameraSliderY.SetPos(0);
	m_cameraSliderZ.SetPos(0);

	m_cameraXPos = m_cameraSliderX.GetPos();
	m_cameraYPos = m_cameraSliderY.GetPos();
	m_cameraZPos = m_cameraSliderZ.GetPos();

	UpdateData(FALSE);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -