【硬核教程】,如何摆脱黑白框编程,1小时学会用c++做一个飞机大战

简介: 【硬核教程】,如何摆脱黑白框编程,1小时学会用c++做一个飞机大战

老规矩,先上效果图:

在这里插入图片描述

最近很多同学加我好友后问我,c++是学完了,但是不知道能做什么。是否应该更加深入学习,更深入研究。其实,c++学完后,最重要的是实践能力,需要知道自己行不行,动手编写下代码就知道了。

我们可以做一些具体的项目,例如贪吃蛇,俄罗斯方块,或者我今天讲的这个飞机大战。然后小伙伴又说:c++的黑白框太low了,怎么可以整得高大上一点呢?其实,不难的,你们可以试着用一下easyx,这个是一个c++的图形库。我们可以用来写一些图形,从此告别黑白框。\

image.png

来,我们直接进入主题:\
这个打飞机小游戏素材都很一般,直接网上抠图下来的。子弹素材还是我自己随便一个截图。不过这些都不影响我们撸代码。我们应该学习一下怎么入门这一款经典小游戏。

image.png

首先游戏对象就这几个东西

// 全局画板
IMAGE bk;
IMAGE BK;
IMAGE Plane;
IMAGE Diren;
IMAGE Zidan;

这个游戏用到游戏插件easyX,我们想载入这几个图片。

//预加载资源,需要加载了之后才能用
void loadRes()
{
    loadimage(&bk, _T("res\\bg.png"));

    loadimage(&BK, _T("res\\bg.png"));
    loadimage(&Plane, _T("res\\plane.png"));

    loadimage(&Diren, _T("res\\diren.png"));
    loadimage(&Zidan, _T("res\\zidan.png"));
}

子弹和敌人的结构体先设计好,其实就是用来控制他们的位置的。

struct ZIDAN
{
    int x;
    int y;
};

struct DIREN
{
    int x;
    int y;
};

子弹和敌人是否碰撞,这里需要写碰撞检测,其实就是几点两点之间的距离就可以,这是最经典的碰撞算法。

bool isPeng(int x2,int y2,int x1,int y1)
{
    int result=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    if(result<2500)
    {
        return true;
    }
    return false;
}

子弹与敌人碰撞之后,敌人就毁灭。这里面只需要把敌人移出屏幕就可以,因为子弹和敌人都是可以重复利用的,所以最好做一个对象池,可以重复用上。

    //判断子弹和飞机是否相撞
        for(i=0;i<8;i++)
        {
            for(int j=0;j<5;j++)
            {
                if(isPeng(zidans[j].x,zidans[j].y,direns[i].x+25,direns[i].y+15))
                {
                    direns[i].y = -100;
                }
            }
        }

需要wsad进行控制摇杆,飞机飞行

        if (_kbhit()) 
        {
            char ch = _getch();
            if (ch == 'w') 
            {
                planeY-=5;
            }
            if(ch == 's')
            {
                planeY+=5;
            }
            if(ch == 'a')
            {
                planeX-=5;
            }
            if(ch == 'd')
            {
                planeX+=5;
            }
        }

根据透明度绘图

// 根据透明度绘图
void drawAlpha(IMAGE* dstimg, int x, int y, IMAGE* srcimg)
{
    if (dstimg == NULL)
    {
        return;
    }
    // 变量初始化
    DWORD *dst = GetImageBuffer(dstimg);
    DWORD *src = GetImageBuffer(srcimg);
    int src_width = srcimg->getwidth();
    int src_height = srcimg->getheight();
    int dst_width = dstimg->getwidth();
    int dst_height = dstimg->getheight();

    // 实现透明贴图  可优化

}

…完整代码,请移步到公众号:诗一样的代码

相关文章
|
1月前
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
231 64
|
1月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
89 5
|
29天前
|
算法 数据挖掘 Shell
「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
还在为生信软件的安装配置而烦恼?micromamba(micromamba是mamba包管理器的小型版本,采用C++实现,具有mamba的核心功能,且体积更小,可以脱离conda独立运行,更易于部署)帮你解决!
56 1
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
81 11
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
38 1
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
205 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
1月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
77 2
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4