pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-16 23:11:22 Dzieki, dodałem linie według wskaza jednak cały czas przy debugowaniu mam vector subscript out of range |
|
killjoy |
» 2015-08-16 23:16:26 for( int i = 0; i, 3; i++ ) { ball[ i ].Move( xSpeed * dt, ySpeed * dt ); }
Nie dziw, że Wychodzisz poza wektor, zerknąłem głębiej w kod i znalazłem takiego potworka. Chyba Pomyliłeś operatory w warunku pętli. |
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-16 23:23:13 Dzięki bardzo działa, jedno mnie tylko zastanawia, czemu otrzymałem z tyc petli tylko dwie dodatkowe kule ? #include <iostream> #include <vector> #include <SFML/Graphics.hpp> #include "Ball.h" #include "Line.h" //#include "TextBall.h" using namespace std; using namespace sf;
int main() { RenderWindow win(VideoMode(800, 600), L"Rozdział 1"); Clock stoper; Font font; font.loadFromFile("arial.ttf"); float ySpeed = -50; float xSpeed = -100; vector<Ball> ball; while (ball.size() < 4) ball.push_back(Ball(win));
for (int i = 0; i < 4; i++) { ball[i].SetPozition(100+10*i, 50*10*i); ball[i].Fil(Color::Yellow); ball[i].Promien(15+2*i); } Ball CircleOne(win); Line linia1(win); linia1.sie(600, 500); linia1.position(20, 20); linia1.thiness(2); Text text; text.setFont(font); text.setString("1"); text.setCharacterSize(15); text.setColor(sf::Color::Black);
CircleOne.SetPozition(100, 100); // CircleOne.SetOutlineColor(Color::Red); CircleOne.Fil(Color::Yellow); CircleOne.Promien(15); // CircleOne.thinesS(); while (win.isOpen()) { win.clear(Color::White); Event e; while (win.pollEvent(e)) { if (e.type == Event::Closed) win.close(); } float xposition = CircleOne.GetPosition().x + CircleOne.radius()*2/3 ; float yposition = CircleOne.GetPosition().y + CircleOne.radius()/4; text.setPosition(xposition, yposition);
auto dt = stoper.restart().asSeconds(); CircleOne.Move(xSpeed *dt , ySpeed * dt); for (int i = 0; i<4; i++) { ball[i].Move(xSpeed *dt*i, ySpeed * dt*i); } text.move(xSpeed *dt, ySpeed * dt); linia1.draw(); for (int i = 0; i< 4; i++) { ball[i].Draw(); } CircleOne.Draw(); win.draw(text); for (int i = 0; i< 4; i++) { int positionY = ball[i].GetPosition().y; if (positionY <= 20){ ySpeed = -ySpeed; } if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed = -ySpeed; } int positionX = ball[i].GetPosition().x; if (positionX <= 20){ xSpeed = -xSpeed; } if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed = -xSpeed; }
} int positionY = CircleOne.GetPosition().y; if (positionY <= 20){ ySpeed = -ySpeed; } if (positionY >= 520.0-2*CircleOne.radius()){ ySpeed = -ySpeed; } int positionX = CircleOne.GetPosition().x; if (positionX <= 20){ xSpeed = -xSpeed; } if (positionX >= 620.0-2*CircleOne.radius()){xSpeed = -xSpeed; } win.display(); } }
|
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-17 14:37:07 W przyszłości chciałem do vectora przekzywac arndomowe obiekty np tez square nadrzedne klasy shape, wiec, chciałbym uzyc deklaracji wielkosci vectora, gdyz ball.push_back( Ball(win) ); spowoduje tyko wrzucenie obiektów jednej klasy. Jak moge to zrobić? Mam także problem przy przenoszeniu TextBall do innej klasy error C2512: 'TextBall' : no appropriate default constructor available c:\program files (x86)\microsoft visual main class #include <iostream> #include <vector> #include <SFML/Graphics.hpp> #include <cstring> #include <cstdlib> #include <ctime> #include <string> #include "Ball.h" #include "Line.h" #include <SFML/Graphics/Text.hpp> #include "TextBall.h" using namespace std; using namespace sf;; const int balls = 49; float xSpeed[balls]; float ySpeed[balls]; float xposition[balls]; float yposition[balls]; int pozitionx[balls]; int pozitiony[balls]; int promien[49];
int main() { RenderWindow win(VideoMode(800, 600), L"Rozdział 1"); srand(time(NULL)); float xSpeeda=83.4f; float ySpeeda=77.9f; Clock stoper; Font font; font.loadFromFile("arial.ttf"); vector<Ball> ball; vector<TextBall> tekst(49); while (ball.size() < 49) ball.push_back(Ball(win)); tekst.push_back(TextBall(win)); for (int i = 0; i < balls; i++) { promien[i] = (std::rand() % 40) + 10; pozitionx[i] = (std::rand() % 200) + 10; pozitiony[i] = (std::rand() % 200) + 10; Color color1 = Color(rand() % 255, rand() % 255, rand() % 255, rand() % 255);
ySpeed[i] = (std::rand() % 100) + 50; xSpeed[i] = (std::rand() % 100) + 50; ball[i].SetPozition(ball[i].radius() + pozitionx[i], ball[i].radius() + pozitiony[i]); ball[i].Fil(color1); ball[i].Promien(promien[i]); std::string s = std::to_string(i); tekst[i].sFont(font); tekst[i].sString(s); tekst[i].sCharacterSize(promien[i]); xposition[i] = ball[i].GetPosition().x + ball[i].radius() * 2 / 3; yposition[i] = ball[i].GetPosition().y + ball[i].radius() / 4; tekst[i].sColor(sf::Color::Black); tekst[i].sPosition(xposition[i], yposition[i]);
} Ball CircleOne(win); Line linia1(win); linia1.sie(600, 500); linia1.position(20, 20); linia1.thiness(2);
CircleOne.SetPozition(100, 100); // CircleOne.SetOutlineColor(Color::Red); CircleOne.Fil(Color::Yellow); CircleOne.Promien(15); // CircleOne.thinesS(); while (win.isOpen()) { win.clear(Color::White); Event e; while (win.pollEvent(e)) { if (e.type == Event::Closed) win.close(); }
auto dt = stoper.restart().asSeconds(); CircleOne.Move(xSpeeda *dt , ySpeeda * dt); for (int i = 0; i<49; i++) { ball[i].Move(xSpeed[i] *dt, ySpeed[i] * dt); tekst[i].Move(xSpeed[i] *dt, ySpeed[i] * dt); } linia1.draw(); for (int i = 1; i< 49; i++) { ball[i].Draw(); tekst[i].Draw(); } // CircleOne.Draw(); for (int i = 0; i< 49; i++) { int positionY = ball[i].GetPosition().y; if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; } if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed[i] = -ySpeed[i]; } int positionX = ball[i].GetPosition().x; if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; } if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed[i] = -xSpeed[i]; }
} int positionY = CircleOne.GetPosition().y; if (positionY <= 20){ ySpeeda = -ySpeeda; } if (positionY >= 520.0-2*CircleOne.radius()){ ySpeeda = -ySpeeda; } int positionX = CircleOne.GetPosition().x; if (positionX <= 20){ xSpeeda = -xSpeeda; } if (positionX >= 620.0-2*CircleOne.radius()){xSpeeda = -xSpeeda; } win.display(); } }
oraz TextBall.h #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <iostream>
using namespace std; using namespace sf;
class TextBall{ public: TextBall(RenderWindow&); void sString(String); void sCharacterSize(int); void sColor(Color); void sPosition(float, float); void Move(float, float); void Draw(); void sFont(Font);
private: Text txt; RenderWindow& Render;
}; TextBall::TextBall(sf::RenderWindow& app) : Render(app) { }
void TextBall::sString(String liczba) { txt.setString(liczba); } void TextBall::sCharacterSize(int size) { txt.setCharacterSize(size); } void TextBall::sColor(Color kolor) { txt.setColor(kolor); } void TextBall::sPosition(float x, float y) { txt.setPosition(x, y); } void TextBall::Move(float a, float b) { txt.move(a, b); } void TextBall::Draw() { Render.draw(txt); } void TextBall::sFont(Font fon) { txt.setFont(fon); }
Gdzie mogę miec błąd? |
|
Monika90 |
» 2015-08-17 17:28:27 Zamiast tego vector < Ball > ball; vector < TextBall > tekst( 49 ); while( ball.size() < 49 ) ball.push_back( Ball( win ) );
tekst.push_back( TextBall( win ) );
to vector < Ball > ball( 49, Ball( win ) ); vector < TextBall > tekst( 49, TextBall( win ) );
bo po co ta pętla z push_back, jak można od razu? W przyszłości chciałem do vectora przekzywac arndomowe obiekty np tez square nadrzedne klasy shape |
To musisz mieć wektor wskaźników np: std::vector<std::unique_ptr<Shape>> shapes; |
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-17 20:27:44 Dziekuje bardzo za odpowiedz, do vectora wskażnikow jeszcze wróce. Nowa deklaracja wiekosci vectorów, pozwoliła na to by zniknął błąd jednak pojawił się nowy przy debugowaniu Unhandled exception at 0x5DBA155F (sfml-graphics-d-2.dll) in Lotto.exe: 0xC0000005: Access violation reading location 0xCCCCCD24.
Wklejam jeszcze swojego maina #include <iostream> #include <vector> #include <SFML/Graphics.hpp> #include <cstring> #include <cstdlib> #include <ctime> #include <string> #include "Ball.h" #include "Line.h" #include <SFML/Graphics/Text.hpp> #include "TextBall.h" using namespace std; using namespace sf;; const int balls = 49; float xSpeed[balls]; float ySpeed[balls]; float xposition[balls]; float yposition[balls]; int pozitionx[balls]; int pozitiony[balls]; int promien[49];
int main() { RenderWindow win(VideoMode(800, 600), L"Rozdział 1"); srand(time(NULL)); float xSpeeda=83.4f; float ySpeeda=77.9f; Clock stoper; Font font; font.loadFromFile("arial.ttf"); vector < Ball > ball(49, Ball(win)); vector < TextBall > tekst(49, TextBall(win)); for (int i = 0; i < balls; i++) { promien[i] = (std::rand() % 40) + 10; pozitionx[i] = (std::rand() % 200) + 10; pozitiony[i] = (std::rand() % 200) + 10; Color color1 = Color(rand() % 255, rand() % 255, rand() % 255, rand() % 255);
ySpeed[i] = (std::rand() % 100) + 50; xSpeed[i] = (std::rand() % 100) + 50; ball[i].SetPozition(ball[i].radius() + pozitionx[i], ball[i].radius() + pozitiony[i]); ball[i].Fil(color1); ball[i].Promien(promien[i]); std::string s = std::to_string(i); tekst[i].sFont(font); tekst[i].sString(s); tekst[i].sCharacterSize(promien[i]); xposition[i] = ball[i].GetPosition().x + ball[i].radius() * 2 / 3; yposition[i] = ball[i].GetPosition().y + ball[i].radius() / 4; tekst[i].sColor(sf::Color::Black); tekst[i].sPosition(xposition[i], yposition[i]);
} Ball CircleOne(win); Line linia1(win); linia1.sie(600, 500); linia1.position(20, 20); linia1.thiness(2);
CircleOne.SetPozition(100, 100); // CircleOne.SetOutlineColor(Color::Red); CircleOne.Fil(Color::Yellow); CircleOne.Promien(15); // CircleOne.thinesS(); while (win.isOpen()) { win.clear(Color::White); Event e; while (win.pollEvent(e)) { if (e.type == Event::Closed) win.close(); }
auto dt = stoper.restart().asSeconds(); CircleOne.Move(xSpeeda *dt , ySpeeda * dt); for (int i = 0; i<49; i++) { ball[i].Move(xSpeed[i] *dt, ySpeed[i] * dt); tekst[i].Move(xSpeed[i] *dt, ySpeed[i] * dt); } linia1.draw(); for (int i = 1; i< 49; i++) { ball[i].Draw(); tekst[i].Draw(); } // CircleOne.Draw(); for (int i = 0; i< 49; i++) { int positionY = ball[i].GetPosition().y; if (positionY <= 20){ ySpeed[i] = -ySpeed[i]; } if (positionY >= 520.0 - 2 * ball[i].radius()){ ySpeed[i] = -ySpeed[i]; } int positionX = ball[i].GetPosition().x; if (positionX <= 20){ xSpeed[i] = -xSpeed[i]; } if (positionX >= 620.0 - 2 * ball[i].radius()){ xSpeed[i] = -xSpeed[i]; }
} int positionY = CircleOne.GetPosition().y; if (positionY <= 20){ ySpeeda = -ySpeeda; } if (positionY >= 520.0-2*CircleOne.radius()){ ySpeeda = -ySpeeda; } int positionX = CircleOne.GetPosition().x; if (positionX <= 20){ xSpeeda = -xSpeeda; } if (positionX >= 620.0-2*CircleOne.radius()){xSpeeda = -xSpeeda; } win.display(); } }
|
|
Monika90 |
» 2015-08-17 22:09:19 Przekazujesz Font przez wartość zamiast przez referencję, przez co tekst używa nieistniejącego fontu. |
|
pasierdamian Temat założony przez niniejszego użytkownika |
» 2015-08-17 22:21:51 Masz rację , dzieki, mam jeszcze pytanie niektóre kule w moim programie odbijaja się wzdłuż jednej z lini. po kilkudzisięciu , powiekszeniu okna lub kliknieciiu na niego kilkakrotnie sekundach wychodza po za okno, co moze byc przyczyną |
|
1 « 2 » 3 |