Cześć wszystkim. Jestem w Trakcie przygotowywania prostej aplikacji imitującej działanie miecza świetlnego. Pokazałem to na zajęciach z programowania obiektowego na i prowadzacy powiedział, że klasa miecza jest zbyt rozległa i powinieniem rozbić ją na części: logiczną i graficzną. Nie za bardzo wiem jak się za to zabrać. Zastanawia mnie czy w klasie odpowiedzialnej za grafikę mają być tylko tekstury, czy też obiekty rectangle? Jeśli obiekty rectangle będą w klasie grafiki, czy klasa logiczna powinna przechowywać współrzędne i rozmiary miecza? I czy wtedy obie klasy zawrzeć w jednej większej? Czy da się to wszystko zrobić unikając zaprzyjaźniania klas? Podróżując tym tokiem rozumowania przy dodawaniu dźwięku do miecza powinienem stworzyć osobną klasę dla niego? Prosiłbym tylko o słowne wytłumaczenie, żebym mógł sam sobie rozwiązać problem. Z góry serdecznie dziękuję za udzieloną pomoc. :)
#include<iostream>
#include<SFML/Graphics.hpp>
using namespace std;
class Saber {
string handleType;
string beamColor;
string sabreName;
sf::RectangleShape beam;
sf::RectangleShape handle;
sf::Texture Texture_Beam;
sf::Texture Texture_Handle;
bool TurnedOn;
public:
Saber(string,string,string);
void RenderHandle();
sf::RectangleShape ReturnHandle();
void RenderBeam();
sf::RectangleShape ReturnBeam();
bool IsTurned();
void ChangeState(bool);
};
Saber::Saber(string sColor, string sHandle, string sName) {
sColor = "Data/" + sColor + ".png";
beamColor = sColor;
sHandle = "Data/" + sHandle + ".png";
handleType = sHandle;
sabreName = sName;
RenderHandle();
RenderBeam();
TurnedOn = false;
}
void Saber::RenderHandle() {
Texture_Handle.loadFromFile(handleType);
handle.setSize(sf::Vector2f(32, 116));
handle.setPosition(400-16, 484);
handle.setTexture(&Texture_Handle);
}
void Saber::RenderBeam() {
Texture_Beam.loadFromFile(beamColor);
beam.setSize(sf::Vector2f(40, 395));
beam.setPosition(380, 105);
beam.setTexture(&Texture_Beam);
}
bool Saber::IsTurned() {return TurnedOn;}
void Saber::ChangeState(bool state) {
if (state == false) TurnedOn = true;
else TurnedOn = false;
}
sf::RectangleShape Saber::ReturnHandle() { return handle;}
sf::RectangleShape Saber::ReturnBeam() { return beam; }
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "LighSaber");
window.setFramerateLimit(60);
bool play = true;
sf::Event event;
Saber Onyx("red", "onyx", "Onyx");
//States for buttons
bool leftMousePressed = false;
//Variables
int mouseX = 0;
int mouseY = 0;
while (play == true) {
window.clear();
//events
while (window.pollEvent(event)) {
if (event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Left) {
leftMousePressed = true;
}
if (event.type == sf::Event::MouseMoved) {
mouseX = event.mouseMove.x;
mouseY = event.mouseMove.y;
}
//closing app with x
if (event.type == sf::Event::Closed) {
play = false;
}
}
//logic
if (leftMousePressed == true && mouseX <= 390 && mouseX >= 360 && mouseY <= 555 && mouseY >= 535) {
Onyx.ChangeState(Onyx.IsTurned());
cout << Onyx.IsTurned() << "\n";
leftMousePressed = false;
}
if (Onyx.IsTurned()) {
window.draw((Onyx.ReturnBeam()));
}
//render
window.draw((Onyx.ReturnHandle()));
window.display();
}
}