首页 > 解决方案 > 无论如何要向鼠标拉伸物体?在 cpp 和 SFML 中

问题描述

https://gyazo.com/0952a960bd7f9e5c9c5e1fe71d0f0b45我想得到类似这样的打孔效果。我目前得到的是

有没有办法复制这个?它将如何完成?给出的代码的问题是当它到达 x 坐标时。它变得很薄。任何线索,如何解决?

我正在检查是否按下了左侧按钮。如果它被按下,它会计算鼠标和它被按下的区域之间的距离。然后将比例设置为 y 的绝对值。

包括“quarks.h”是我创建的小框架。

这是给定的效果 https://gyazo.com/fd46b85cd69d95d05d2a8e6f184c4e06

我希望有人能帮助我

#include "quarks.h"
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <SFML/Audio.hpp>

#include <cmath>
static constexpr float pi = 3.14159265359f;

static constexpr float to_degree(float radian)
{
    return radian * (180.f / pi);
}


int main() {
    QuarksSDK::CreateWindow window;
    window.windowSettings(VideoMode(1000, 900), "Hello.", Style::Close);
    float grid =64;
    RectangleShape click(Vector2f(42, grid));
    click.setPosition(window.getSize().x / 2, window.getSize().y / 2);
    click.setOrigin({ std::round(click.getLocalBounds().width / 2.f), std::round(click.getLocalBounds().height / 2.f) });
    Clock clock;
    QuarksSDK::movement mov;
    sf::Clock tickClock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    sf::Time duration = sf::Time::Zero;
    sf::Time TimePerFrame = sf::seconds(1.f / 60.f);
    QuarksAnimator::easeQuarks ease;

    while (window.isWindowOpen()) {
        window.pollEvents();

        if (Mouse::isButtonPressed(Mouse::Left)) {
            if (clock.getElapsedTime().asSeconds() < 1.f) {
                Vector2f distance = Vector2f(click.getPosition().x - Mouse::getPosition(*window.window).x, click.getPosition().y - Mouse::getPosition(*window.window).y);
                float angle = to_degree(atan2f(distance.y, distance.x));



                click.setRotation(angle + 90);


                click.setSize(Vector2f(grid, abs(distance.y)));
                cout << angle << endl;
            }
            else {
                click.setSize(Vector2f(grid, grid));
                clock.restart();

            }
        }
        else {
            click.setSize(Vector2f(grid, grid));


        }
        mov.SmoothMovement(click);
        window.clear();
        window.draw(click);
        window.display();
    }


}```

标签: c++sfml

解决方案


代码已修复。#include "quarks.h"

#include <time.h>
#include <stdio.h>
#include <SFML/Audio.hpp>

#include <cmath>
static constexpr float pi = 3.14159265359f;

static constexpr float to_degree(float radian)
{
    return radian * (180.f / pi);
}


int main() {
    QuarksSDK::CreateWindow window;
    window.windowSettings(VideoMode(1000, 900), "Hello.", Style::Close);
    float grid =64;
    RectangleShape click(Vector2f(42, grid));
    click.setPosition(window.getSize().x / 2, window.getSize().y / 2);
    click.setOrigin({ std::round(click.getLocalBounds().width / 2.f), std::round(click.getLocalBounds().height / 2.f) });
    Clock clock;
    QuarksSDK::movement mov;
    sf::Clock tickClock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    sf::Time duration = sf::Time::Zero;
    sf::Time TimePerFrame = sf::seconds(1.f / 60.f);
    QuarksAnimator::easeQuarks ease;

    while (window.isWindowOpen()) {
        window.pollEvents();

        if (Mouse::isButtonPressed(Mouse::Left)) {

                Vector2f distance = Vector2f(click.getPosition().x - Mouse::getPosition(*window.window).x, click.getPosition().y - Mouse::getPosition(*window.window).y);
                float angle = to_degree(atan2f(distance.y, distance.x));



                click.setRotation(angle + 90);


                click.setSize(Vector2f(grid,sqrt(distance.y * distance.y + distance.x * distance.x)));
                cout << angle << endl;
            } 

        else {
            click.setSize(Vector2f(grid, grid));


        }
        mov.SmoothMovement(click);
        window.clear();
        window.draw(click);
        window.display();
    }


}```

推荐阅读