رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

پست های پیشنهاد شده

معمولاً در بازی سازی و یا تولید اپلیکیشن‌های کاربردی مدیریت رخداد‌ها بسیار مهم بوده و برای استفاده و نشان دادن واکنش بر یک عمل خاص نیازمند توابع و کلاس‌های پیچیده‌ای می‌باشد که در موتور‌های بازی سازی پیاده سازی می‌شوند. کلاس Event در قالب sf::Event تمامی اطلاعات رخداد از طرف سیستم را ارائه می‌دهد. برای مثال فشرده شدن کلیدی بر روی صفحه کلید و یا حرکات دسته‌ی بازی و مواردی از این قبیل را می‌توان توسط این ماژول مدیریت کرد.

یک sf::Event به طور کلی نمونه ای از انواع رخداد‌ها را شامل می‌شود (حرکات ماوس، فشرده شدن کلید، بسته شدن پنجره و غیره...) همگی حزئیاتی از این رویداد می‌باشند. برای مثال وقتی شما یک رویداد فشرده شدن کلیدی را دریافت می‌کنید، بعد از آن باید عضوی از event.key و یا دیگر اعضای مرتبط با event.mouseMove و یا event.text را فراخوانی کنید.

برای مثال:

sf::Event event;
while (window.pollEvent(event))
{
    // Request for closing the window
    if (event.type == sf::Event::Closed)
        window.close();
    // The escape key was pressed
    if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape))
        window.close();
    // The window was resized
    if (event.type == sf::Event::Resized)
        doSomethingWithTheNewSize(event.size.width, event.size.height);
    // etc ...
}
  • نوع شمارنده‌ی Closed زمانی مورد استفاده قرار می‌گیرد که پنجره درخواست بسته شدن را درخواست کرده باشد.
  • شمارنده‌ی KeyPressed در هنگام درخواست کلیدی مورد استفاده قرار می‌گیرد. و یا Keyboard::Escape اشاره به فشرده شدن کلید Esc بر روی صفحه کلید را دارد.
  • نوع Resized زمانی که پنجره درخواست تغییر اندازه را داشته باشد استفاده خواهد شد.
  • نوع TextEntered زمانی که کاراکتری وارد شود عمل می‌کند.
  • یا انواعی مانند JoystickConnected که در زمان اتصال دسته‌ی بازی عمل می‌کند.
  • در ادامه لیستی از انواع شمارشی رویداد‌ها آورده شده است.

 

فرض کنیم در محیط بازی یا برنامه‌ی خود قرار است مختصات x و y حرکت ماوس را دریافت نماییم. با استفاده از شرایط رخداد‌ها و به کارگیری کلاس sf::Mouse می‌توان این کار را به راحتی انجام داد.

تابعی به صورت زیر خواهیم داشت:

void MousePosition(){
    sf::Mouse ms;
    std::cout << "Mouse Position X : " << ms.getPosition().x << "\t Y : " << ms.getPosition().y << std::endl;
}

کلاس Mouse با استفاده از توابع عضو با نام‌ getPosition().x و getPosition.y مختصات x و y حرکت ماوس در محیط پنجره ساخته شده را برمی‌گرداند.

کُد تکمیلی:

#include <SFML/Window.hpp>
#include <iostream>

void MousePosition(){

    sf::Mouse ms;
    std::cout << "Mouse Position X : " << ms.getPosition().x << "\t Y : " << ms.getPosition().y << std::endl;
}

int main() {

    sf::Window window(sf::VideoMode(640, 480), "Hello world!");

    while (window.isOpen())
    {
        sf::Event event;

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::KeyPressed)
                window.close();
        }

        // check the type of the event...
        switch (event.type)
        {
        // window closed
        case sf::Event::Closed:
            window.close();
            break;

            // key pressed
        case sf::Event::KeyPressed:
            std::cout << "Key pressed!" << std::endl;
            break;
        case sf::Event::MouseMoved:
            MousePosition();
            break;
            // we don't process other types of events
        default:
            break;
        }

    }

    return 0;
}

کُد فوق را اجرا کرده و نتیحه آن با حرکت ماوس در داخل پنجره به صورت زیر خواهد بود:

Mouse Position X : 746   Y : 567
Mouse Position X : 746   Y : 567
Mouse Position X : 746   Y : 567
Mouse Position X : 746   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 729   Y : 567
Mouse Position X : 707   Y : 561
Mouse Position X : 707   Y : 561
Mouse Position X : 707   Y : 561
Mouse Position X : 707   Y : 561
Mouse Position X : 707   Y : 561
Mouse Position X : 707   Y : 561
Mouse Position X : 707   Y : 561
Mouse Position X : 679   Y : 551
Mouse Position X : 679   Y : 551
Mouse Position X : 679   Y : 551
Mouse Position X : 679   Y : 551

 

  • پسندیدن 1
  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

فرض بر اینکه قرار است تابع یا کلاس شلیک توسط دسته‌ی بازی اجرا شود. ابتدا باید مطمئن باشید که دسته‌ی بازی به سیستم متصل و توسط سیستم عامل شناسایی شده است. برای این منظور دستور زیر را خواهیم داشت:

if (sf::Joystick::isConnected(0))
{
  // joystick number 0 is connected
}

سپس تحت یک دستور ساده و شرطی می‌توان تابع مورد نظر را با فشرده شدن کلید روی دسته اجرا کرد:

if (sf::Joystick::isButtonPressed(0, 1))
{
 Fire();
}

در ادامه مثالی زده‌ایم که اطلاعات دسته‌ی متصل شده را گرفته و در نهایت با فشرده شدن کلید روی آن تابع Fire اجرا می‌شود.🙂

#include <SFML/Window.hpp>
#include <iostream>


void GetDeviceInfo(){

    if (sf::Joystick::isConnected(0))
    {

        //get information about the joystick
        sf::Joystick::Identification id = sf::Joystick::getIdentification(0);
        std::cout << "\nVendor ID: " << id.vendorId << "\nProduct ID: " << id.productId << std::endl;
        sf::String controller("Joystick Use: " + id.name);

    }

}

void Fire(){

    std::cout << "Shooted! Boooom!" << std::endl;
}

int main() {


    sf::Window window(sf::VideoMode(640, 480), "Hello world!");
    GetDeviceInfo();
    
    while (window.isOpen())
    {
        sf::Event event;


        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::KeyPressed)
                window.close();
        }

        if (sf::Joystick::isButtonPressed(0, 1))
        {
            Fire();
        }

        // check the type of the event...
        switch (event.type)
        {
        // window closed
        case sf::Event::Closed:
            window.close();
            break;
            // key pressed
        case sf::Event::KeyPressed:
            std::cout << "Key pressed!" << std::endl;
            break;
        case sf::Event::MouseMoved:
            break;
            // we don't process other types of events
        default:
            break;
        }



    }

    return 0;
}

 

  • پسندیدن 2
  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

شاید لازم باشد تعداد کلید‌های موجود را بر روی دسته‌ی مورد نظر دریافت کنیم، کُد مربوطه به صورت زیر خواهد بود:

bool hasZ = sf::Joystick::hasAxis(0, sf::Joystick::Z);
std::cout << "Button count: " << buttonCount << std::endl;

در صورتی که نیاز باشد تعداد محور‌های موجود بر روی دکمه‌های چرخشی (یا همان آنالوگ‌ها) را دریافت کنیم، در این صورت به شکل زیر خواهد بود:

bool hasZ = sf::Joystick::hasAxis(0, sf::Joystick::Z);
std::cout << "Has a z-axis: " << hasZ << std::endl;

bool hasY = sf::Joystick::hasAxis(0, sf::Joystick::Y);
std::cout << "Has a y-axis: " << hasY << std::endl;

برای دریافت حداکثر دستگاه‌های ورودی پشتیبانی شده توسط SFML دستور زیر مورد استفاده قرار خواهد گرفت:

unsigned int deviceCount = sf::Joystick::Count;
std::cout << "Maximum number of supported joysticks: " << deviceCount;

 

  • پسندیدن 1
  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

همانطور که می‌دانید در بازی‌های رایانه‌ای مدیریت حرکت کاراکتر یا شیء در محیط توسط کلید‌های روی صفحه کلید و یا دسته‌ی بازی مدیریت می‌شوند. در این پست چگونگی واکنش نشان دادن به فشرده شدن کلید‌های بالا (رو به جلو)، پایین (رو به عقب)، چپ و راست را بررسی می‌کنیم.

ابتدا توابع مورد نیاز را جهت نمایش در خروجی پیاده سازی می‌کنیم:

void MoveToUp(){
    std::cout << "Moved to Up!" << std::endl;
}

void MoveToDown(){
    std::cout << "Moved to Down!" << std::endl;
}

void MoveToLeft(){
    std::cout << "Moved to left!" << std::endl;
}

void MoveToRight(){
    std::cout << "Moved to right!" << std::endl;
}

void Fire(){
    std::cout << "Shooted! Boooom!" << std::endl;
}

سپس تحت کلاس sf::Keyboard آن‌ها را مدیریت می‌کنیم:

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
// move left...
MoveToLeft();
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
// move right...
MoveToRight();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
// move up...
MoveToUp();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
// move down...
MoveToDown();
}

 

  • پسندیدن 2
  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
مهمان
این موضوع برای عدم ارسال قفل گردیده است.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...