Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan grafik C++: mencapai interaktiviti masa nyata

Pengaturcaraan grafik C++: mencapai interaktiviti masa nyata

WBOY
WBOYasal
2024-06-02 12:42:57710semak imbas

Terdapat dua teknik utama untuk mencapai interaktiviti masa nyata dalam pengaturcaraan grafik C++: Pengendalian acara: menggunakan perpustakaan (seperti SFML) untuk mengesan dan bertindak balas kepada input pengguna, seperti pergerakan tetikus dan penekanan papan kekunci. Gelung: Laksanakan blok kod secara berterusan, mengemas kini keadaan permainan, melukis grafik dan memproses input sehingga syarat tertentu dipenuhi. Kes praktikal: Permainan ular: Gunakan SFML untuk pemprosesan acara, dan capai interaktiviti masa nyata permainan Ular dengan menggelung untuk mengemas kini kedudukan badan ular, menyemak perlanggaran dan melukis grafik.

Pengaturcaraan grafik C++: mencapai interaktiviti masa nyata

Pengaturcaraan Grafik dalam C++: Mendayakan Interaktiviti Masa Nyata

Pengenalan

Interaktiviti masa nyata ialah aspek utama aplikasi grafik yang membolehkan pengguna aplikasi untuk mengawal dan memanipulasi objek Dalam C++, anda boleh menggunakan pelbagai teknik untuk mencapai interaktiviti masa nyata, seperti pengendalian acara dan gelung.

Pengendalian Acara

Pengendalian acara ialah teknologi yang mengesan dan bertindak balas kepada input pengguna (seperti pergerakan tetikus, menekan papan kekunci). Dalam C++, anda boleh menggunakan perpustakaan seperti SFML (Perpustakaan Media Mudah dan Intuitif) untuk pengendalian acara.

Contoh Kod:

#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();
    }
}

Gelung

Gelung ialah blok kod yang terus dilaksanakan sehingga syarat tertentu dipenuhi. Dalam aplikasi grafik, gelung digunakan untuk mengemas kini keadaan permainan, melukis grafik dan bertindak balas kepada input.

Contoh kod:

#include <iostream>
#include <thread>

using namespace std;

int main()
{
    bool running = true;

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

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

        if (input == 'q')
            running = false;
    }
}

Kes praktikal

Berikut ialah contoh aplikasi grafik C++ interaktif masa nyata yang menggunakan SFML untuk pengendalian acara:

Permainan ular klasik

Snake grees

permainan Dalam Permainan Makan Ular, pemain mengawal seekor ular untuk memakan makanan dalam labirin. Menggunakan C++ dan SFML kami boleh melaksanakan versi ringkas permainan Ular:

#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;
        }
    }
}

Atas ialah kandungan terperinci Pengaturcaraan grafik C++: mencapai interaktiviti masa nyata. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn