📜  c++中游戏所需的库(1)

📅  最后修改于: 2023-12-03 14:39:56.819000             🧑  作者: Mango

C++中游戏所需的库

当我们开始写游戏时,可能会发现需要使用到一些额外的库才能达到自己想要的效果。本文将介绍C++中一些常用的游戏所需库,以帮助程序员更方便地开发游戏。

1. SDL

SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,用于开发2D游戏、图像处理和音频应用程序。它提供了访问输入设备、音频设备、图形硬件加速、定时器、线程和网络的功能。SDL被广泛用于开发跨平台的游戏,如《糖果传奇》、《钢铁雄心4》等。

安装SDL:

sudo apt-get install libsdl2-dev

使用SDL:

#include<SDL2/SDL.h> 

int main(int argc, char* args[])  {
    SDL_Init(SDL_INIT_EVERYTHING); 

    SDL_Window* win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    SDL_Surface* sur = SDL_GetWindowSurface(win);
    SDL_FillRect(sur, NULL, SDL_MapRGB(sur->format, 0xFF, 0xFF, 0xFF));
    SDL_UpdateWindowSurface(win);
    SDL_Delay(2000);

    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
} 
2. SFML

SFML(Simple and Fast Multimedia Library)是一个跨平台的多媒体库,类似于SDL。它是一个比较新的图形库,提供了音频、图形、网络、输入等功能,同时也提供了更简单的C++编程接口。SFML被广泛用于开发2D游戏。

安装SFML:

sudo apt-get install libsfml-dev

使用SFML:

#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow window(sf::VideoMode(640, 480), "SFML App");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
        }
        window.clear();
        window.draw(shape);
        window.display();
    }
    return 0;
}
3. OpenGL

OpenGL是一个跨平台的图形库,用于开发2D和3D图形应用程序。它提供了底层硬件加速的3D图形以及2D图形渲染技术,因此在游戏应用方面有着广泛的应用。可以使用OpenGL进行3D建模、场景渲染、纹理映射等等。

安装OpenGL:

sudo apt-get install libglu1-mesa-dev freeglut3-dev mesa-common-dev

使用OpenGL:

#include <GL/gl.h>
#include <GL/glut.h>

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_POLYGON);
    glVertex3f(-0.5f, -0.5f, 0.0f);
    glVertex3f(0.5f, -0.5f, 0.0f);
    glVertex3f(0.5f, 0.5f, 0.0f);
    glVertex3f(-0.5f, 0.5f, 0.0f);
    glEnd();
    glFlush();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutCreateWindow("OpenGL Example");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
4. Boost

Boost是一个C++库集合,它提供了各种不同的功能,如数字计算、文件系统、正则表达式等等。其中Boost中提供的线程库,让开发人员能够更容易地在游戏中实现多线程并行计算。

安装Boost:

sudo apt-get install libboost-all-dev

使用Boost:

#include <iostream>
#include <boost/thread.hpp>

void thread_function() {
    for (int i = 0; i < 100; ++i) {
        std::cout << "Thread Function Executing" << std::endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(100));
    }
}

int main() {
    boost::thread t(&thread_function);
    for (int i = 0; i < 100; ++i) {
        std::cout << "Main Function Executing" << std::endl;
        boost::this_thread::sleep(boost::posix_time::milliseconds(100));
    }
    t.join();
    return 0;
}
5. Box2D

Box2D是一个平衡和碰撞模拟引擎,用于开发2D物理游戏。Box2D提供坚实的碰撞检测,支持重力模拟、碰撞、约束和物体绑定等功能。

安装Box2D:

git clone https://github.com/erincatto/Box2D.git
cd Box2D/
mkdir build296
cd build296
cmake ../
make -j4
sudo make install

使用Box2D:

// 简单的Box2D示例
#include <iostream>
#include <Box2D/Box2D.h>

int main() {
    b2Vec2 gravity(0.0f, -10.0f);
    b2World world(gravity);

    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0.0f, -10.0f);
    b2Body* groundBody = world.CreateBody(&groundBodyDef);
    b2PolygonShape groundBox;
    groundBox.SetAsBox(50.0f, 10.0f);
    groundBody->CreateFixture(&groundBox, 0.0f);

    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(0.0f, 4.0f);
    b2Body* body = world.CreateBody(&bodyDef);
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(1.0f, 1.0f);
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    body->CreateFixture(&fixtureDef);

    float timeStep = 1.0f / 60.0f;
    int32 velocityIterations = 6;
    int32 positionIterations = 2;
    for (int32 i = 0; i < 60; ++i) {
        world.Step(timeStep, velocityIterations, positionIterations);
        b2Vec2 position = body->GetPosition();
        float32 angle = body->GetAngle();
        std::cout << "Ball Position: " << position.x << "," << position.y << "  Angle: " << angle << std::endl;
    }

    return 0;
}

总的来说,以上这几个库都是非常优秀的,适用于C++游戏的开发。开发人员可以根据自己的需求,选择其中一个或者多个来使用,以便更快速地开发出高质量的游戏。