#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include<math.h>
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
// 设置像素格式
BOOL SetupPixelFormat(HDC hdc) {
PIXELFORMATDESCRIPTOR pfd;
int pixelformat;
ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 24;
pfd.iLayerType = PFD_MAIN_PLANE;
pixelformat = ChoosePixelFormat(hdc, &pfd);
if (pixelformat == 0) {
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, &pfd) == FALSE) {
return FALSE;
}
return TRUE;
}
// 加载纹理
GLuint loadTexture() {
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
// 简单的纹理设置,这里可以替换为实际的纹理加载
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
unsigned char data[] = {255, 0, 0, 255, 0, 255, 0, 255, 0, 0, 255, 255};
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
return textureID;
}
// 绘制方块
void drawCube() {
glBegin(GL_QUADS);
// 前面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
// 后面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f);
// 顶面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
// 底面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
// 左面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
// 右面
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glEnd();
}
// 玩家位置和视角
float playerX = 0.0f;
float playerY = 1.0f;
float playerZ = 5.0f;
float playerYaw = 0.0f;
float playerPitch = 0.0f;
// 处理键盘输入
void handleKeyboardInput() {
if (GetAsyncKeyState(VK_UP) & 0x8000) {
playerX += sinf(playerYaw * 3.1415926f / 180.0f) * 0.1f;
playerZ -= cosf(playerYaw * 3.1415926f / 180.0f) * 0.1f;
}
if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
playerX -= sinf(playerYaw * 3.1415926f / 180.0f) * 0.1f;
playerZ += cosf(playerYaw * 3.1415926f / 180.0f) * 0.1f;
}
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
playerYaw -= 1.0f;
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
playerYaw += 1.0f;
}
}
// 处理鼠标输入
void handleMouseInput(HWND hwnd) {
POINT mousePos;
GetCursorPos(&mousePos);
ScreenToClient(hwnd, &mousePos);
int centerX = 800 / 2;
int centerY = 600 / 2;
int dx = mousePos.x - centerX;
int dy = mousePos.y - centerY;
playerYaw += dx * 0.1f;
playerPitch += dy * 0.1f;
// 限制视角
if (playerPitch > 89.0f) playerPitch = 89.0f;
if (playerPitch < -89.0f) playerPitch = -89.0f;
SetCursorPos(centerX, centerY);
}
// 初始化光照
void initLighting() {
GLfloat light_position[] = {1.0f, 1.0f, 1.0f, 0.0f};
GLfloat light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
static TCHAR szAppName[] = TEXT("MinecraftLike");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT("Minecraft Like Project"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
800, 600,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
HDC hdc = GetDC(hwnd);
if (!SetupPixelFormat(hdc)) {
MessageBox(hwnd, TEXT("Failed to set pixel format!"), TEXT("Error"), MB_OK | MB_ICONERROR);
return 0;
}
HGLRC hglrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hglrc);
// OpenGL 初始化
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, 800.0f / 600.0f, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
// 加载纹理
GLuint textureID = loadTexture();
// 初始化光照
initLighting();
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
handleKeyboardInput();
handleMouseInput(hwnd);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// 设置视角
glRotatef(-playerPitch, 1.0f, 0.0f, 0.0f);
glRotatef(-playerYaw, 0.0f, 1.0f, 0.0f);
glTranslatef(-playerX, -playerY, -playerZ);
// 绑定纹理
glBindTexture(GL_TEXTURE_2D, textureID);
// 绘制方块
for (int x = -5; x < 5; ++x) {
for (int z = -5; z < 5; ++z) {
glPushMatrix();
glTranslatef(x, 0.0f, z);
drawCube();
glPopMatrix();
}
}
SwapBuffers(hdc);
}
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hglrc);
ReleaseDC(hwnd, hdc);
return msg.wParam;
}
有什么问题
最新发布