Hallo Leute,
es geht darum erstellte Sprites per Mausklick auf eine Zielposition zu bewegen (Klick 1 auf Sprite zwecks Selektion, Klick 2 Zielkoordinaten für dieses Sprite usw.), sodass man die Bewegung auch beobachten kann, also ohne "Teleportation" wie das bei folgendem Code leider der Fall ist:
Wenn ich recht verstehe, braucht man eine Zeitmessung, Richtung, Geschwindigkeit, 2. Positionsvektor etc., aber hab keine Ahnung wie man das richtig umsetzt. Schon mal vielen Dank für jede Antwort im Voraus!
es geht darum erstellte Sprites per Mausklick auf eine Zielposition zu bewegen (Klick 1 auf Sprite zwecks Selektion, Klick 2 Zielkoordinaten für dieses Sprite usw.), sodass man die Bewegung auch beobachten kann, also ohne "Teleportation" wie das bei folgendem Code leider der Fall ist:
Wenn ich recht verstehe, braucht man eine Zeitmessung, Richtung, Geschwindigkeit, 2. Positionsvektor etc., aber hab keine Ahnung wie man das richtig umsetzt. Schon mal vielen Dank für jede Antwort im Voraus!
Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
int main()
{
sf::RenderWindow mMainWindow(sf::VideoMode(600,600), "Map", sf::Style::Close);
mMainWindow.setFramerateLimit(60);
mMainWindow.setKeyRepeatEnabled(false);
sf::Image image;
image.create(50, 50, sf::Color::Red);
sf::Texture texture;
texture.loadFromImage(image);
std::vector<sf::Sprite> EnemyVector;
sf::Sprite* focus = nullptr;
while (mMainWindow.isOpen())
{
sf::Event event;
bool creating = false;
bool leftclicked = false;
bool rightclicked = false;
sf::Vector2i mousePos;
while (mMainWindow.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
mMainWindow.close();
break;
case sf::Event::KeyPressed:
creating = (event.key.code == sf::Keyboard::A);
break;
case sf::Event::MouseButtonPressed:
if (event.mouseButton.button == sf::Mouse::Left)
{
leftclicked = true;
mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
break;
}
if (event.mouseButton.button == sf::Mouse::Right)
{
rightclicked = true;
mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
break;
}
}
}
if (creating)
{
sf::Sprite sprite;
mousePos = (mousePos == sf::Vector2i(0, 0) ? sf::Mouse::getPosition(mMainWindow) : mousePos);
sprite.setTexture(texture);
sprite.setColor(sf::Color::Red);
sprite.setOrigin(static_cast<float>(sprite.getTextureRect().width) / 2, static_cast<float>(sprite.getTextureRect().height) / 2);
sprite.setPosition(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y));
focus=nullptr;
EnemyVector.push_back(sprite);
}
if (leftclicked)
{
for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
{
if (enemy->getGlobalBounds().contains(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)))
{
focus = &(*enemy);
break;
}
else
if(focus!=nullptr)
{
focus->move((sf::Mouse::getPosition(mMainWindow).x - focus->getPosition().x),(sf::Mouse::getPosition(mMainWindow).y - focus->getPosition().y)) ;
focus = nullptr;
break;
}
}
}
if(rightclicked)
{
focus = nullptr;
}
mMainWindow.clear();
for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
{
mMainWindow.draw(*enemy);
}
mMainWindow.display();
}
return 0;
}
Zuletzt bearbeitet: