Maison > développement back-end > C++ > Programmation graphique C++ : atteindre l'interactivité en temps réel

Programmation graphique C++ : atteindre l'interactivité en temps réel

WBOY
Libérer: 2024-06-02 12:42:57
original
734 Les gens l'ont consulté

Il existe deux techniques principales pour obtenir une interactivité en temps réel dans la programmation graphique C++ : Gestion des événements : utiliser des bibliothèques (telles que SFML) pour détecter et répondre aux entrées de l'utilisateur, telles que les mouvements de la souris et les pressions sur le clavier. Boucles : exécutez en continu un bloc de code, mettez à jour l'état du jeu, dessinez des graphiques et traitez les entrées jusqu'à ce que certaines conditions soient remplies. Cas pratique : Jeu Snake : Utilisez SFML pour le traitement des événements, et obtenez l'interactivité en temps réel du jeu Snake en bouclant pour mettre à jour la position du corps du serpent, vérifier les collisions et dessiner des graphiques.

Programmation graphique C++ : atteindre linteractivité en temps réel

Programmation graphique en C++ : activer l'interactivité en temps réel

Introduction

L'interactivité en temps réel est un aspect clé des applications graphiques qui permet aux utilisateurs de contrôler et de manipuler les objets affichés dans l'application. En C++, vous pouvez utiliser diverses techniques pour obtenir une interactivité en temps réel, telles que la gestion des événements et les boucles.

Gestion des événements

La gestion des événements est une technologie qui détecte et répond aux entrées de l'utilisateur (telles que les mouvements de la souris, les pressions sur le clavier). En C++, vous pouvez utiliser des bibliothèques comme SFML (Simple and Intuitive Media Library) pour la gestion des événements.

Exemple de code :

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "实时交互性");

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
            else if (event.type == sf::Event::MouseButtonPressed)
                std::cout << "鼠标按下了" << std::endl;
        }

        window.clear();
        // 绘制图形...
        window.display();
    }
}
Copier après la connexion

Loop

Une boucle est un bloc de code qui continue de s'exécuter jusqu'à ce qu'une condition spécifique soit remplie. Dans les applications graphiques, les boucles sont utilisées pour mettre à jour l'état du jeu, dessiner des graphiques et répondre aux entrées.

Exemple de code :

#include <iostream>
#include <thread>

using namespace std;

int main()
{
    bool running = true;

    while (running)
    {
        // 游戏状态更新...
        // 绘制图形...

        // 处理输入
        char input;
        cin >> input;

        if (input == 'q')
            running = false;
    }
}
Copier après la connexion

Cas pratique

Ce qui suit est un exemple d'application graphique C++ interactive en temps réel qui utilise SFML pour la gestion des événements :

Snake game

Snake est un classique gourmand jeu Dans le jeu Snake Eating, les joueurs contrôlent un serpent pour manger de la nourriture dans un labyrinthe. En utilisant C++ et SFML, nous pouvons implémenter une version simple du jeu Snake :

#include <SFML/Graphics.hpp>

const int GRID_SIZE = 20;

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "贪吃蛇");

    // 初始化蛇的身体
    std::vector<sf::RectangleShape> snake;
    snake.emplace_back(sf::RectangleShape(sf::Vector2f(GRID_SIZE, GRID_SIZE)));
    snake[0].setPosition(GRID_SIZE, GRID_SIZE);

    // 初始化食物
    sf::RectangleShape food(sf::Vector2f(GRID_SIZE, GRID_SIZE));
    food.setPosition(rand() % (800 / GRID_SIZE) * GRID_SIZE, rand() % (600 / GRID_SIZE) * GRID_SIZE);

    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    sf::Time timePerFrame = sf::seconds(1 / 60.0f);

    bool running = true;
    sf::Vector2i direction = sf::Vector2i(0, 0);

    while (running)
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                running = false;
            else if (event.type == sf::Event::KeyPressed)
            {
                if (event.key.code == sf::Keyboard::Up)
                    direction = sf::Vector2i(0, -1);
                else if (event.key.code == sf::Keyboard::Down)
                    direction = sf::Vector2i(0, 1);
                else if (event.key.code == sf::Keyboard::Left)
                    direction = sf::Vector2i(-1, 0);
                else if (event.key.code == sf::Keyboard::Right)
                    direction = sf::Vector2i(1, 0);
            }
        }

        timeSinceLastUpdate += clock.restart();

        if (timeSinceLastUpdate >= timePerFrame)
        {
            // 更新游戏状态
            sf::Vector2i newPosition = snake.front().getPosition() + (direction * GRID_SIZE);

            // 检查边界碰撞
            if (newPosition.x < 0 || newPosition.x >= 800 || newPosition.y < 0 || newPosition.y >= 600)
                running = false;

            // 检查自身碰撞
            for (size_t i = 1; i < snake.size(); i++)
            {
                if (newPosition == snake[i].getPosition())
                    running = false;
            }

            // 检查食物碰撞
            if (newPosition == food.getPosition())
            {
                snake.emplace_back(sf::RectangleShape(sf::Vector2f(GRID_SIZE, GRID_SIZE)));
                snake.back().setPosition(newPosition);

                food.setPosition(rand() % (800 / GRID_SIZE) * GRID_SIZE, rand() % (600 / GRID_SIZE) * GRID_SIZE);
            }
            else
            {
                snake.emplace_back(sf::RectangleShape(sf::Vector2f(GRID_SIZE, GRID_SIZE)));
                snake.back().setPosition(newPosition);

                snake.erase(snake.begin());
            }

            // 绘制图形
            window.clear();

            for (auto& rect : snake)
                window.draw(rect);

            window.draw(food);

            window.display();

            timeSinceLastUpdate = sf::Time::Zero;
        }
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal