zoukankan      html  css  js  c++  java
  • 三 地图的绘制

    拿到我们上一节得到的map.txt,就可以简单把图画出来(只是实验,并不是最终版本)。

    效果图

    因为要直接“借鉴”原版的地图,我们需要用cheatengine查好每种数字之后对应的是什么图片,基本块我会放在代码后面。

    然后直接循环输出就好了。这个时候我们要定义一下一个地图中基本块占的像素个数,原版的大概是16的样子。

    这个基本块大小MinSize指的并不是最小块,因为一个基本块还能被打成四分之一大小,一个坦克的大小大致对应四块砖头。

    贴一下代码

    #include<graphics.h> 
    #include<iostream> 
    #include<fstream>
    #include<set>
    #include <iomanip>//输出宽度setw
    #define MinSize 18
    using namespace std;
    int Map[28][32];
    IMAGE MapPic[100]; 
    
    int calhex(string s) {
        int base = 1,res = 0;
        for (int i = 1; i >= 0; i--) {
            if (s[i] >= 'A') res += base * (s[i] - 'A' + 10);
            else res += base * (s[i] - '0');
            base *= 16;
        }
        return res;
    }
    void LoadTxtMap() {
        std::ifstream map_file;
        map_file.open("map.txt");
        for (int i = 0; i < 28; i++) {
            for (int j = 0; j < 32; j++) {
                string tem;
                map_file >> tem; 
                Map[i][j] = calhex(tem);
            }
        }
    }
    void OutoutTxtMap() { 
        for (int i = 0; i < 28; i++) {
            for (int j = 0; j < 32; j++) {
                cout << setw(3) << Map[i][j] << ' ';
            }
            cout << '
    ';
        }
    }
    void LoadPic() {
        loadimage(&MapPic[1], _T("Image\wall.png"), MinSize, MinSize, false);
        loadimage(&MapPic[2], _T("Image\iron.png"), MinSize, MinSize, false);
        loadimage(&MapPic[3], _T("Image\border.png"), MinSize, MinSize, false);
        loadimage(&MapPic[4], _T("Image\border.png"), MinSize, MinSize, false);//没找到素材
        loadimage(&MapPic[5], _T("Image\commander0.png"), MinSize*2, MinSize*2, false);   
        loadimage(&MapPic[6], _T("Image\enemy_mark_ps.png"), MinSize, MinSize, false);
        loadimage(&MapPic[7], _T("Image\player_mark_ps.png"), MinSize, MinSize, false);
        loadimage(&MapPic[8], _T("Image\flag_ps.png"), MinSize*2, MinSize*2, false);
    }
    void PicShow() {
        initgraph(MinSize*32, MinSize*28);
        set<int> CanShow;
         CanShow.insert(16),CanShow.insert(32), CanShow.insert(17), CanShow.insert(15),
            CanShow.insert(200), CanShow.insert(201), CanShow.insert(202), CanShow.insert(203), CanShow.insert(0);
        for (int i = 0; i < 28; i++) {
            for (int j = 0; j < 32; j++) {
                IMAGE pic;
                switch (Map[i][j])
                {
                    /*
                            0空地
                            1 2 4 8代表左上,右上,左下,右下  15整块砖块
                            16 铁
                            17 边界 
                            106 敌军的maek
                            20 玩家的 mark
                            88 字母I
                            19 字母P
                            112 数字2
                            108 棋子的左上角 表示关卡 还有三个(顺时针)252 253 109
                            111 数字1 
                            200 老窝左上角
                    */
                case 0:
                    break; 
                case 16:
                    pic = MapPic[2];
                    break;
                case 15:
                    pic = MapPic[1];
                    break;
                case 17:
                    pic = MapPic[3];
                    break; 
                case 200:
                    pic = MapPic[5];
                    break;
                default:
                    break;
                }
                if (CanShow.count(Map[i][j]))  //只要一层
                    if (Map[i][j])
                        putimage(j * MinSize, i * MinSize, &pic);
                    else;
                else {   
                    putimage(j * MinSize, i * MinSize, &MapPic[3] ); //放一层边界
                    switch (Map[i][j]){
                    case 106:
                        putimage(j * MinSize, i * MinSize, &MapPic[6]);
                        break;
                    case 90:// I 
                    case 88:
                        outtextxy(j * MinSize, i * MinSize, TCHAR('I'));
                        break;
                    case 19:// P
                        outtextxy(j * MinSize, i * MinSize, TCHAR('P'));
                        break;
                    case 20:// P
                        putimage(j * MinSize, i * MinSize, &MapPic[7]);
                        break;
                    case 108:
                        putimage(j * MinSize, i * MinSize, &MapPic[8]);
                        break;
                    default:
                        break;
                    }
                }
                if (Map[i][j] >= 110 && Map[i][j] <= 168) {
                    char a[10];  
                    _itoa_s(Map[i][j], a, 10); 
                    TCHAR s[] = _T("a");
                    outtextxy(j * MinSize, i * MinSize, s);
                }
            }
        }
        putimage(29 * MinSize, 22 * MinSize, &MapPic[8]);
    }
    int MapShow() { 
        LoadTxtMap();
        if(0) OutoutTxtMap(); 
        else {
            LoadPic();
            PicShow();
        }
        system("pause");
        return 0;
    }

     可以右击保存

                  

     

     

     命名如下:

  • 相关阅读:
    haproxy frontend 和backend
    haproxy 页面重定向(域名跳转)
    LWP::Simple 模块
    Perl LWP模块
    错误代码: 1582 Incorrect parameter count in the call to native function 'str_to_date'
    perl 面向对象 -> 符号使用
    跨域访问设置
    mysql 主从复制用户权限限制
    错误代码: 1045 Access denied for user 'skyusers'@'%' (using password: YES)
    sync_relay_log
  • 原文地址:https://www.cnblogs.com/SunChuangYu/p/12825052.html
Copyright © 2011-2022 走看看