2017-11-27 32 views
0

最近、私はSFMLライブラリと簡単なゲームの作り方を学び始めました。そして、とてもシンプルなアニメーションを作ることにしました。原子の周りを移動する電子。オブジェクト座標X0、Y0 - - 中心の座標C++ OpenGL SFML

何かをしたが、私はいくつかの問題を持っている私はこの式をX、Y

x = x0 + radius*sin(angle); 
y = y0 + radius*cos(angle); 

を用います。私は原子の周りに自分の電子とこの動きを見ることができませんでした。私は移動のためにループを使うべきだとは思いますが、わかりません。

これは私のコードです:

#include "stdafx.h" 

#include <SFML/Graphics.hpp> 

using namespace sf; 

int main() 
{ 
    float xo = 250;//координаты центра(coordinates of the center) 
    float yo = 250;//координаты центра(coordinates of the center) 

    float radius = 10;//радиус 

    float k = 0.0f;//время(time) 

    float x = 130;//координаты объекта(object coordinates) 
    float y = 330;//координаты объекта(object coordinates) 

    float rotation = 5.0; 

    //float x = 1000/2; 
    //float y = 1000/2; 

    float alpha = 0;//угол(angle) 

    RenderWindow window(sf::VideoMode(1000, 1000), "Atom"); 
    window.setFramerateLimit(60); 

    Clock clock; 
    sf::Event windowEvent; 

    Texture herotexture; 
    herotexture.loadFromFile("atom_image.png"); 

    Sprite herosprite; 
    herosprite.setTexture(herotexture); 
    //herosprite.setTextureRect(IntRect(0, 99, 48, 51));//получили нужный нам прямоугольник с котом 
    herosprite.setPosition(250, 250); //выводим спрайт в позицию x y (output the sprite to the position x y) 

    CircleShape circle; 
    circle.setRadius(radius); 
    circle.setOutlineColor(Color::Red); 
    circle.setOutlineThickness(5); 
    circle.setPosition(x, y); 
    circle.setRotation(0); 

    bool track; 

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

     circle.rotate(rotation); 

     //alpha++; 
     alpha+=deltaTime*k; 
     x = xo + radius*sin(alpha);//формула для движения по окружности(formula for motion along a circle) 
     y = yo + radius*cos(alpha);//формула для движения по окружности(formula for motion along a circle) 

     //Vector2f direction(x, y); 
     //float speed = 20.0f; 

     //circle.move(direction * k * speed); 
     circle.move(x, y); 

     /*(if (Keyboard::isKeyPressed(Keyboard::Left)) { herosprite.move(-0.1, 0); } //первая координата Х отрицательна =>идём влево 
     if (Keyboard::isKeyPressed(Keyboard::Right)) { herosprite.move(0.1, 0); } //первая координата Х положительна =>идём вправо 
     if (Keyboard::isKeyPressed(Keyboard::Up)) { herosprite.move(0, -0.1); } //вторая координата (У) отрицательна =>идём вверх (вспоминаем из предыдущих уроков почему именно вверх, а не вниз) 
     if (Keyboard::isKeyPressed(Keyboard::Down)) { herosprite.move(0, 0.1); } //вторая координата (У) положительна =>идём вниз (если не понятно почему именно вниз - смотрим предыдущие уроки) 
     */ 
     window.clear(); 
     window.draw(herosprite); 
     window.draw(circle); 
     k = clock.restart().asSeconds(); 
     window.display(); 
    } 

    return 0; 
} 

EDIT

一部@StarShine訂正:

circle.rotate(rotation); 
x = xo + radius*sin(alpha); //формула для движения по окружности(formula for motion along a circle) 
y = yo + radius*cos(alpha); //формула для движения по окружности(formula for motion along a circle) 
Vector2f direction(x, y); 
float speed = 20.0f; 
circle.move(direction * k * speed); 
+0

は罪とCOSは、一般的にそう角度「アルファをインクリメント、ラジアンを取ります'1を押すと単位円上を飛びます。 – StarShine

+0

@StarShineああ、混乱した。私は 'alpha + = deltaTime * k'を使う必要があるので、時間の経過とともに角度の変化があります。私はクロックを使用しようとしましたが、エラーが発生しました。アルファには値floatとclock-clockがあります。しかし、私は数式の使い方を理解していません。私はこれをどのように使うのか? – Lado

+0

https://www.sfml-dev.org/documentation/2.0/classsf_1_1Clock.phpのドキュメントでは、ループの前にrestart()関数を一度呼び出すことができ、getElapsedTime()を使用して経過秒数をポーリングすることができます'angle = clock.getElapsedTime()* rotationSpeed;'と書くことができます。 – StarShine

答えて

0
#include "stdafx.h" 
#include <iostream> 
#include <math.h> 
#include <SFML/Graphics.hpp> 

using namespace std; 
using namespace sf; 

int main() 
{ 
    float xo = 250;//координаты центра(coordinates of the center) 
    float yo = 250;//координаты центра(coordinates of the center) 

    float radius = 10;//радиус 

    float k = 0.0f;//время(time) 

    float x = 130;//координаты объекта(object coordinates) 
    float y = 330;//координаты объекта(object coordinates) 

    float rotation = 5.0; 

    /*float x = 1000/2; 
    float y = 1000/2;*/ 

    float alpha = 0;//угол(angle) 

    float speed = 200.0f; 

    RenderWindow window(sf::VideoMode(1000, 1000), "Atom"); 
    window.setFramerateLimit(60); 

    Clock clock; 
    sf::Event windowEvent; 

    Texture herotexture; 
    herotexture.loadFromFile("atom_image.png"); 

    Sprite herosprite; 
    herosprite.setTexture(herotexture); 
//herosprite.setTextureRect(IntRect(0, 99, 48, 51));//получили нужный нам прямоугольник с котом 
    herosprite.setPosition(250, 250); //выводим спрайт в позицию x y (output the sprite to the position x y) 

    CircleShape circle; 
    circle.setRadius(radius); 
    circle.setOutlineColor(Color::Red); 
    circle.setOutlineThickness(5); 
    circle.setPosition(x, y); 
    circle.setRotation(0); 


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

     /*circle.rotate(rotation); 

     alpha = (float)clock.getElapsedTime().asMicroseconds() * k;*/ 

     float Radius = sqrt(pow(((float)circle.getPosition().x - (float)herosprite.getPosition().x), 2.0f) + pow(((float)circle.getPosition().y - (float)herosprite.getPosition().y), 2.0f)); 

     clock.restart(); 
     k = k/800; 
     float deltaTime = clock.restart().asSeconds(); 

     alpha += deltaTime*(float)clock.getElapsedTime().asSeconds(); 

     cout << "\nGet Position Atom is -> " << (float)herosprite.getPosition().x << endl; 
     cout << "\nGet Position Circle is -> " << (float)circle.getPosition().x << endl; 
     cout << "\nRadius is -> " << Radius << endl; 

     x = xo + Radius*cos(alpha) * speed;//формула для движения по окружности(formula for motion along a circle) 
     y = yo + Radius*sin(alpha) * speed;//формула для движения по окружности(formula for motion along a circle) 
     cout << "x is -> " << x << endl; 
     Vector2f direction(x, y); 

     circle.move(direction * deltaTime * speed); 

     if (sqrt(pow(((float)circle.getPosition().x - (float)herosprite.getPosition().x), 2.0f) + pow(((float)circle.getPosition().y - (float)herosprite.getPosition().y), 2.0f)) > (float)herosprite.getPosition().x && sqrt(pow(((float)circle.getPosition().x - (float)herosprite.getPosition().x), 2.0f) + pow(((float)circle.getPosition().y - (float)herosprite.getPosition().y), 2.0f)) > (float)herosprite.getPosition().y) 
     { 
      circle.move(-direction * deltaTime * speed); 
      float cd = circle.getPosition().x + 40; 
      circle.move(cd, circle.getPosition().y); 
      circle.setPosition(130, 330); 
     } 


     /*circle.move(direction); 
     circle.move(x, y);*/ 

     window.clear(); 
     window.draw(herosprite); 
     window.draw(circle); 
     window.display(); 
    } 

    return 0; 
}