学OpenGL编3D游戏_1 框架

在这部分,与NeHe不同的是,OpenGL框架被定义为类,与windows框架分开,其内容与NeHe教程第一章大同小异。

错误记录:

1、WinMain只能在windows桌面应用中使用,main在控制台程序中使用,网上有教程说在控制台应用中,将属性->编译器->系统->subsystem中_CONSOLE改为_WINDOWS,实测并不可行难过,需要重新新建一个工程;

2、搭建框架时,OpenGL框架被定义为类保存于opengl.cpp中,我犯了一个很大的错误,未将类实例化(m_opengl = new opengl),花了一上午找问题,c++基础较为薄弱,及时看书时知道,写程序又忘了,还需要多加实践。大笑


资源:

学OpenGL编3D游戏文档及其源码


效果:



代码:

#include "stdafx.h"
#include "windows.h"
#include "opengl.h"

opengl* m_opengl;
HDC hDC;
HGLRC hRC = NULL;
HWND hWnd = NULL;
int Width = 800;
int Height = 600;
int bits = 16;

void GameLoop()
{
	MSG msg;
	BOOL fMessage;
	PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
	while (msg.message != WM_QUIT)
	{
		fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);
		if (fMessage)
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else
		{
			m_opengl->Render();
		}
	}
}

LRESULT WINAPI MsgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_CREATE://建立窗口消息
		hDC = GetDC(hWnd);//获取当前窗口的设备句柄
		m_opengl->SetupPixelFormat(hDC);
		return 0;
		break;
	case WM_CLOSE:
		m_opengl->CleanUp();
		PostQuitMessage(0);
		return 0;
		break;
	case WM_SIZE:
		Height = HIWORD(lParam);
		Width = LOWORD(lParam);
		if (Height == 0)	Height = 1;
		m_opengl->init(Width, Height);
		return 0;
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		break;
	case WM_KEYUP:
		switch (wParam)
		{
		case VK_ESCAPE:
			m_opengl->CleanUp();
			PostQuitMessage(0);
			return 0;
			break;
		default:
			break;
		}
	default:
		break;
	}
	return (DefWindowProc(hWnd, message, wParam, lParam));
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, INT)
{
	bool fullScreen = TRUE;
	DWORD dwExStyle;
	DWORD dwStyle;
	RECT windowRect;
	int nX = 0, nY = 0;
	dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;//使窗口具有3D外观
	dwStyle = WS_OVERLAPPEDWINDOW;//使用标准窗口
	int wid = GetSystemMetrics(SM_CXSCREEN);//取得当前屏幕宽
	int hei = GetSystemMetrics(SM_CYSCREEN);//取得当前屏幕高
	nX = (wid - Width) / 2;
	nY = (hei - Height) / 2;//窗口居中用
	AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);//根据窗口风格来调整窗口尺寸达到要求的大小
	char cc[] = "tml";
	WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
		GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
		(LPCWSTR)cc,NULL
	};
	RegisterClassEx(&wc);
	m_opengl = new opengl;
	HWND hWnd = CreateWindowEx(NULL,
		(LPCWSTR)cc,
		L"OpenGL Game",
		dwStyle | WS_CLIPCHILDREN,
		nX, nY,
		Width, Height,
		NULL,
		NULL,
		hInstance,
		NULL
	);
	ShowWindow(hWnd, SW_SHOWDEFAULT);
	UpdateWindow(hWnd);
	GameLoop();
	return 0;
}



#include "stdafx.h"
#include "opengl.h"
#include "OPENGLSB.H"

extern HWND hWnd;

opengl::opengl()
{
	
}


opengl::~opengl()
{
	CleanUp();
}

BOOL opengl::SetupPixelFormat(HDC hDC)
{
	int nPixelFormat;
	PIXELFORMATDESCRIPTOR pfd =
	{
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW |
		PFD_SUPPORT_OPENGL |
		PFD_DOUBLEBUFFER,
		PFD_TYPE_RGBA,
		16,
		0,0,0,0,0,0,
		0,
		0,
		0,
		0,0,0,0,
		32,
		0,
		0,
		PFD_MAIN_PLANE,
		0,
		0,0,0
	};
	if (!(nPixelFormat = ChoosePixelFormat(hDC, &pfd)))
	{
		MessageBox(NULL, (LPCWSTR)"cannot find", (LPCWSTR)"Error", MB_OK | MB_ICONEXCLAMATION);
		return FALSE;
	}
	SetPixelFormat(hDC, nPixelFormat, &pfd);
	hRC = wglCreateContext(hDC);//获取渲染描述句柄
	wglMakeCurrent(hDC, hRC);//激活渲染描述句柄
	return TRUE;
}

void opengl::init(float Width, float Height)
{
	glViewport(0, 0, Width, Height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective
	(45.0f,//透视角设置为45度
		Width / Height,
		1.0f,//近点
		1000.0f//远点
	);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void opengl::Render()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glFlush();
	SwapBuffers(hDC);
}

void opengl::CleanUp()
{
	wglMakeCurrent(hDC, NULL);
	wglDeleteContext(hRC);
}

#pragma once


class opengl
{
public:
	
	opengl();
	~opengl();
public:
	HDC hDC;
	HGLRC hRC;
	BOOL SetupPixelFormat(HDC hDC);
	void init(float Width, float Height);
	void Render();
	void CleanUp();
};






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL3D游戏(含全部源程序)讲述3D游戏写方法。 《OpenGL3D游戏》重在游戏的实现方案。全书以一个完整(基本)的3D游戏为主线,采用循序渐进的方法,从建立OpenGL图形环境入手,讲解3D基本图形、构图原理;从引入摄像机,建立天空、山地、树木,到3D模型使用和3D动画模型的显示。用鱼骨方式讲解相关知识技术,完整地展示了3D游戏写过程。● 特点 重在游戏的基本实现方法 搭建一个基本功能的游戏环境 最新的外部功能模块的使用● 提供《OpenGL3D游戏》的教演示课件 《OpenGL3D游戏》的教课件。用多媒体的表现手法将习过程完全显示在你面前,使用者可以随时查看所选章节的知识要点提示,可以观看程序的制作过程和效果,也可以马上进入到VC辑器对范例程序修修改改,在实践中加深对知识的理解;还可以进入到网上论坛和朋友们讨论习心得。● 内容提要第1 章 OpenGL的程序框架__Windows、OpenGL程序框架的建立。第2 章 OpenGL的基本图形__在OpenGL图形界面上作一些简单的图形。第3 章 OpenGL的组合图形__用简单图形来构成两个复杂一点的3D模型。第4 章 摄像漫游__________有了摄像机你就可以在OpenGL场景中自由地漫游了。第5 章 开天辟地__________在OpenGL场景中有了天空、大地、景物。第6 章 OpenGL中显示文字__介绍了OpenGL中文字的几种显示方式。第7 章 特殊的平面_树_____栽些树种些草,让这个OpenGL世界充满生机。第8 章 显示3D模型________在OpenGL场景中显示3DS格式的模型。第9 章 使用MD2动画模型___OpenGL场景中出现了活生生的人(3D动画模型)。第10 章 使用MDL动画模型__介绍一种更先进的动画模型—3D骨骼动画。第11章 射击、爆炸________逼真的爆炸效果,是用程序仿真爆炸的物理过程。第12章 碰撞检测__________加入碰撞检测后,游戏才有真实的感觉。第13章 游戏进度保存______场景(或进度)保存和调入是游戏必不可少的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值