【附源码】小白打造「传奇游戏」 (一)

    技术2022-07-16  68

    前言:

    热血传奇作为中国网络游戏的奇迹,并且和同时期的红月、石器时代脱颖而出不是没有道理的,在当时来说,热血传奇在各个方面都是非常优异的,放在现在也是超越了不少的游戏。

    而传奇最终陨落,并且没有一直发展至今的原因,有很多事情最终影响到了传奇这款游戏的命运,这其中最主要的还是因为建设私服所需要的成本低,但是收益确实非常大的,

    本质上来说这也是游戏的暴利的一种体现……

    好了,废话不多说,接下来带你手把手撸出属于自己的热血传奇!

     

    创建项目

    选择对话框

    测试运行:

    设计初始界面

    使用编辑控件Edit Control 和按钮控件Button Control

     

    先删除原来的两个按钮以及标签:

    先添加一个编辑控件

    拖放调整大小,效果如下:

     

    再添加一个按钮控件

     

     

    修改按钮显示文本

     

     

     

    填充欢迎文本

    修改编辑框的ID,增加程序的可读性.

    改名为: IDC_EDIT_Welcom

    也可以不用修改。前缀IDC_EDIT不要修改。

    把编辑控件设置为只读。

    把编辑控制设置为多行显示

    设置编辑框中的文本内容

    在对话框类的OnInitDialog函数中修改。

     

    对编辑控件设置设置一个成员变量。

     

    设置控件变量的名称,这里设置为m_edit,同时把访问权限设置为private.​​​​​​​

     

    将自动在对话框的头文件中生成如下代码:​​​​​​​

    设置对话框内容:

    m_font.CreatePointFont(180, _T("隶书"));

    m_edit.SetFont(&m_font);

     

    CString cc;

    cc = "\r\n    《奇牛学院-我的传奇》\r\n\r\n";

    cc += "我的传奇-第一节, 我们将要掌握以下技能:\r\n\r\n";

    cc += "1.在VC++中建立对话框程序。\r\n";

    cc += "2.图形处理的数据结构:HBITMAP 、HDC\r\n";

    cc += "3.C++函数的定义和使用。\r\n";

    cc += "4.显示图像\r\n";

    cc += "5.在编辑框上显示文字\r\n\r\n";

    cc += "备注:我的传奇世界,从这里开始!";

    SetDlgItemText(IDC_EDIT_Welcom, cc); //在编辑框中显字

     

    // 把焦点设置到该编辑控件,否则可能会被自动选择(蓝色背景)

    m_edit.SetFocus(); //获取聚焦

    m_edit.SetSel(0, 0);  // 0, -1选择所有内容

    return FALSE;  // 除非将焦点设置到控件,否则返回 TRUE

    显示游戏界面

    把按钮的ID修改为:IDC_BUTTON_START

    也可以不修改。

     

    双击按钮,自动生成事件处理代码。

     

    把图片资源导入项目的res目录。

     

    添加数据成员, 用来保存位图,以及图片的宽高

    private:

    HBITMAP  bit; //设备相关位图 Handle to a bitmap.(位图句柄 )

    int w, h; //图形尺寸

    导入位图

    BOOL CChuanQiDlg::loadbmp(CString fileName)//调BMP图片[2章]

    {

    DeleteObject(bit); //删除上次的位图内存。

    bit = (HBITMAP)LoadImage     //调入cc指定的图形

       (AfxGetInstanceHandle(),//获得当前应用程序的实例句柄

    fileName, //文件名

    IMAGE_BITMAP, //位图方式

    0, //图形宽

    0, //图形高

    LR_LOADFROMFILE // 从文件加载图片

    | LR_CREATEDIBSECTION当第2个参数是IMAGE_BITMAP时,函数返回DIB section bitmap

    );

    if (bit == NULL) return FALSE; //调图失败

     

    //DIBSECTION 包含了与设备无关的位图的信息

    DIBSECTION ds; //

    GetObject(bit, sizeof(ds), &ds); //取位图的信息->bminfo

    w = ds.dsBmih.biWidth; //得到位图宽度值

    h = ds.dsBmih.biHeight; //得到位图高度值

    return TRUE;

    }

     

    在事件处理代码中,添加图片的导入。

     

    void CChuanQiDlg::OnBnClickedButtonStart()

    {

    //调BMP图片

    if (loadbmp("res/bg.BMP") == FALSE) {

    MessageBox("没找到背景!");

    return;

    }

     

    //隐藏文本框

    GetDlgItem(IDC_EDIT_Welcom)->ShowWindow(SW_HIDE);

     

    //设备相关位图关联到暂存设备场景

    SelectObject(tmpDC, bit);

     

    //显示文字

    SetTextColor(tmpDC, RGB(255, 255, 255)); //设置tmpDC设备上下文的字色

    SetBkMode(tmpDC, TRANSPARENT); //字为透明方式

    CString cc = "一刀999,我的传奇我做主!"; //设文字内容

    TextOut(tmpDC,

    220, 200, //开始位置的x坐标、y坐标

    cc,  //显示的文本

    lstrlen(cc)); //在MemDC显示文字

     

    //CClientDC 客户区设备上下文, 用于客户区的输出,与特定窗口关联,

    // 可以让开发者访问目标窗口中客户区

    CClientDC dc(this);  //参数:关联的特定窗口

     

    //将与矩形像素对应的颜色数据从指定的源设备上下文传输到目标设备上下文。

    BitBlt(dc.m_hDC,  //目标设备上下文

    0, 0, //目标设备上下文的指定区域的左上角的x坐标、y坐标

    w, h, //目标设备上下文的指定区域的宽度、高度

    tmpDC,//源设备上下文

    0, 0, //源设备上下文的指定区域的左上角的x坐标、y坐标

    SRCCOPY); //将源矩形直接复制到目标矩形。    //B、显示角色------------------------------------------------------

     

    // 显示游戏人物

    if (loadbmp("res/0001.BMP") == FALSE) //调BMP图片

    {

    MessageBox(cc + "没找到!");

    return;

    }

    SelectObject(tmpDC, bit);

    BitBlt(dc.m_hDC, 300, 150, w, h, tmpDC, 0, 0, SRCCOPY);

    }

    补充:BitBlt的用法

     

    播放背景音乐

    //添加成员HWND hMCI;//mid

     

    加载背景音乐

    // 在OnInitDialog函数中加载

    hMCI = MCIWndCreate(

    NULL, //父窗口句柄

    NULL, //要与MCIWnd窗口关联的模块实例的句柄

    MCIWNDF_NOPLAYBAR | //从视图中隐藏工具栏并禁止用户访问它。

    MCIWNDF_NOMENU, //从工具栏的视图中隐藏菜单按钮,并禁止用户访问其弹出菜单。

    "res/bg.mid");

    播放音乐

    在按钮的单击事件处理函数中:

    //播放背景音乐

    MCIWndPlay(hMCI);

     

    点击获取完整源码,笔记和视频教程

     

    Processed: 0.015, SQL: 9