问题标题: 我的世界(3d)

4
3
已解决
陈则霖
陈则霖
资深光能
资深光能

最近很多人都做出了我的世界的2d版,在这里呢,我就放一个狠话:我决定尝试制作一个3d版的我的世界!!!!

看到这里,肯定有很多人都认为我在开玩笑,不过,我要说的是:我是认真的!!!!

 

我要声明一下,我可没有不务正业,当然,凡是以学习为重!!!

 

那首先我们需要梳理一下步骤:

1:制作方块

    众所周知,我的世界是由无数个方块组成的,那想要作出我的世界就必须要制作出一个正方体方块,这算是制作我的世界的第一步。

    那经过了无数次实验后,我作出了一个方块:

cout<<"          * * * * * * * * * * * * *        \n";
    cout<<"        *                       * *        \n";
    cout<<"      *                       *   *        \n";
    cout<<"    *                       *     *        \n";
    cout<<"  *                       *       *        \n";
    cout<<"* * * * * * * * * * * * *         *        \n";
    cout<<"*                       *         *\n";
    cout<<"*                       *         *\n";
    cout<<"*                       *         *\n";
    cout<<"*                       *         *\n"; 
    cout<<"*                       *         *\n";
    cout<<"*                       *         *\n";
    cout<<"*                       *         *\n";
    cout<<"*                       *         *\n";
    cout<<"*                       *       *\n";
    cout<<"*                       *     *\n";
    cout<<"*                       *   *\n";
    cout<<"*                       * *\n";
    cout<<"* * * * * * * * * * * * *";

 

这个代码段放到这上面就成了这样,但是在dev上面是可以生成一个正方体的。

 

同理,我们还可以生成一个小的正方体

 

 

    cout<<"\n\n\n\n\n";
    cout<<"    * * * *\n";
    cout<<"  *     * *\n";
    cout<<"* * * *   *\n";
    cout<<"*     *   *\n";
    cout<<"*     * *\n";
    cout<<"* * * *\n";

 

当我们生成好一个正方体后,就可以将“*”替换成横线就行了。(这里乐意使用easyx的图形库)

2:生成地图

    这也是比较简单的,主要由无数个方块组成。

    生成很多的方块就会比较的取巧。具体步骤如下:

  众所周知,正方体一共有六个面,但是在可见的视野中,我们永远只能看到三个面。所以在代码中,我们只需要吧人看到的三个面输出即可。当然,如果生成的方块太多,也会撑爆我们的cpu。

最后只需要加上地图的生成算法即可。

3:加入人物角色

这一步也是非常困难的,因为人物为两个高,那么需要将摄像头转到两个高的地方。

另外大家都知道,在我的世界中,在第一人称下的视角是可以看见手的。不过在这个项目里我并不准备制作手。具体还是因为不会做。

 

至此,整个项目的核心也就完成了,最后就是ui的制作了。

 

 

 

当然,我知道自己的想法有亿些天方夜谭,不过,我相信终有一天我也可以实现自己的想法。

另外,如果有想要和做的同学们可以在下方评论告诉我。我们一起制作出3d我的世界!!!

 

 

如果在多年后这个帖子没有任何进展,也请大家忘掉以上的所有话,毕竟这不过是我一时的想法。但是,希望我永远也不会忘记!!!

 

(申精)

陈则霖在2022-01-30 18:13:05追加了内容

希望很快就会有人找上门(QWQ)


0
已采纳
蔡程睿
蔡程睿
高级守护
高级守护

先别编了,能先把救世主更一下吗?

0
王牌工作室官方
王牌工作室官方
新手光能
新手光能

tgi出了之后,我有办法

0
薛乘志
薛乘志
初级启示者
初级启示者

你在逗我?

1. 按你的思路,你的3D游戏只有一个视角

2. 这样显示,远近的方块都只有有限的几个大小

3. 这是一个控制台3d游戏,建议看看这写了多少代码

0
沙宸安
沙宸安
高级启示者
高级启示者

但就控制台游戏的话,我认为也是比较困难的。

如果真要做3D的话,要从建模开始,切了这题才行。

如果考虑光照的话,难度就更上一层楼,这题就可以看出。

以上还是第三人称视角的玩法。

第一人称的话,要考虑远近视角的遮挡关系,还有切换视角的问题,要保证720°的空间建模都是规整的。

总之,建立体图的难度是远比720°视角的3D游戏简单的。

0
王牌工作室官方
王牌工作室官方
新手光能
新手光能

可以用图形界面
比方说,立方体的一个面在x1,y1,x2,y2的位置,另一个面的偏移量为x,y则
在(x1,y1,x2,y2)的位置,画一个空心矩形,再在(x1+x,y1+y,x2+x,y2+y)的位置
画一个空心矩形,再把他们的顶点用线连起来,就是一个立方体
更多请参考<<我们在四维空间里可以做什么>>

王牌工作室官方在2022-02-04 10:56:38追加了内容

看看它吧,它能画出一个立方体

请在Windows7+**试验

#include<windows.h>
#include<stdlib.h>
#include<wp/console.h>

#define WIDTH  640
#define HEIGHT 480

HINSTANCE thisInst;
LPCSTR lpClassName="WindowClass";
LPCSTR lpTitleName="Window";
const UINT x=30,y=20;
const UINT x1=100,x2=200,y1=100,y2=200;

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
void frameRect(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color)
{
	RECT rect;
	SetRect(&rect,x1,y1,x2,y2);
	HBRUSH hBrush=CreateSolidBrush(color);
	FrameRect(hdc,&rect,hBrush);
	DeleteObject(hBrush);
}
void Line(HDC hdc,int x1,int y1,int x2,int y2,COLORREF color)
{
	HPEN hPen=CreatePen(PS_SOLID,1,color);
	HPEN hOldPen=(HPEN)SelectObject(hdc,hPen);
	MoveToEx(hdc,x1,y1,0);
	LineTo(hdc,x2,y2);
	SelectObject(hdc,hOldPen);
	DeleteObject(hPen);
}

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR cmdline,int nCmdShow)
{
	thisInst=hInst;

	WNDCLASSEX wc;
	HWND hwnd;
	MSG msg;

	memset(&wc,0,sizeof(wc));
	wc.cbSize				 =	sizeof(WNDCLASSEX);
	wc.hCursor				 =	LoadCursor(NULL,IDC_ARROW);
	wc.hIcon				 =	LoadIcon(NULL,IDI_APPLICATION);
	wc.hIconSm				 =	LoadIcon(NULL,IDI_APPLICATION);
	wc.lpfnWndProc			 =	WndProc;
	wc.hInstance			 =	hInst;
	wc.hbrBackground		 =	(HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName		 =	lpClassName;

	if(!RegisterClassEx(&wc))
	{
		MessageBox(NULL,"注册窗口时遇到问题","错误",MB_ICONERROR);
		return EXIT_FAILURE;
	}

	hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,
		lpClassName,
		lpTitleName,
		WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		100,
		200,
		WIDTH,
		HEIGHT,
		NULL,
		NULL,
		hInst,
		NULL);

	if(hwnd==NULL)
	{
		MessageBox(NULL,"创建窗口时遇到问题","错误",MB_ICONERROR);
		return EXIT_FAILURE;
	}

	ShowWindow(hwnd,nCmdShow);

	while(GetMessage(&msg,hwnd,0,0) > 0)
	{
		TranslateMessage	(&msg);
		DispatchMessage		(&msg);
	}
	return EXIT_SUCCESS;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		case WM_PAINT: {
			HDC hdc=GetDC(hwnd);
			frameRect(hdc,x1,y1,x2,y2,RGB(0,0,0));
			frameRect(hdc,x1+x,y1+y,x2+x,y2+y,RGB(0,0,0));
			Line(hdc,x1,y1,x1+x,y1+y,RGB(0,0,0));
			Line(hdc,x2,y1,x2+x,y1+y,RGB(0,0,0));
			Line(hdc,x1,y2,x1+x,y2+y,RGB(0,0,0));
			Line(hdc,x2,y2,x2+x,y2+y,RGB(0,0,0));
			ReleaseDC(hwnd,hdc);
			break;
		}
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}

 

王牌工作室官方在2022-02-04 10:57:39追加了内容

把第三行删掉

0
包涵宇
包涵宇
中级天翼
中级天翼

3D?(你在开玩笑)

c++是不适合编游戏的(真话)

不信,编个c++程序,打印个这个:

1

十分钟内完成,我算你**

要知道,某些语言干这件事只要导个图片。。。

0
吴庞茂旭
吴庞茂旭
资深光能
资深光能

“《做好了,还是网页版》”(人话:你相信这是我做的吗?)

吴庞茂旭在2022-02-04 18:57:48追加了内容

另外,您看否定您的人吧,全是巨头,希望您好好努力啊,以酷町堂学员的实力,实现您的梦想还差一大段呢!

吴庞茂旭在2022-02-09 13:38:09追加了内容

回复@刘宇航,这是一个无名网站而已,不是我做的,你不理解双引号和书名号的含义吗?

我要回答