Witam wszystkich serdecznie, ostatnio zaczełem pracę nad Arkanoidem, no cóż idą dobrze lecz coś mi w kodzie nie pasuję, jeżeli mógłbym prosić o różnego rodzaju wskazówki co mógłbym zmienić, poprawić prosiłbym bardzo. Zależy mi na surowej ocenie ! Ponieważ człowiek jak wiadomo uczy się na błędach
/*COPYRIGHT BIELEC ADRIAN*/
/*Arkanoid.H*/
#pragma once
#include <SFML\Graphics.hpp>
#include <string>
class Arkanoid
{
private:
sf::Vector2f rozmiaryokna; // trzyma rozmiar okna
sf::RenderWindow okno;
sf::RectangleShape paletka;
sf::Event event;
sf::CircleShape kolo;
float vx= 0.9f,vy=-0.9f; // predkosc kola
public:
Arkanoid(); // konstruktor
void WindowsHandleEvent(); // główna pętla
void glowna(); // tworzenie paletki piłki
private:
void nadajv(); // nadawanie predkosci piłce
};
class level :
public sf::Drawable
{private:
sf::RectangleShape cegla; // stwórz cegiełke
protected:
int i=1; // zmienna definiująca pozycje cegły
void sprawdz_czy_uderzyl(sf::CircleShape&, float&, float&);
int ile = bricki; // ile cegiel jeszcze zostalo
float y=1; // zmienna oznaczająca pozycje y
std::vector<sf::RectangleShape>cegielki; // trzyma ilość cegieł
public:
int bricki; // ilość cegieł
void levelplay(); // rozstawianie bricków
void sprawdzkolizje(sf::CircleShape&,float&,float&); // jak nazwa mówi sprawdza kolizje
virtual void ustaw()=0;
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates state) const // rysuje cegiełki
{
for (int q = 0; q <= ile; q++)
{
target.draw(cegielki[q],state);
}
}
};
class lvlv1 :
public level
{
private:
void ustaw();
};
class lvlv2 :
public level
{
private:
void ustaw();
};
/*COPYRIGHT BIELEC ADRIAN*/
/*Arkanoid.cpp*/
#include "Arkanoid.h"
#include <SFML\Graphics.hpp>
#include <string>
#include <iostream>
#include <vector>
Arkanoid::Arkanoid()
{
// konstruktor
kolo.setRadius(8);
kolo.setPosition(100, 400);
sf::Vector2f rozmiaryokna(1024, 612);
paletka.setSize(sf::Vector2f(100, 20));
paletka.setPosition(rozmiaryokna.x / 2-50, rozmiaryokna.y - 50);
okno.create(sf::VideoMode(rozmiaryokna.x, rozmiaryokna.y), "Arkanoid!");
}
void level::levelplay()
{
//rozstawianie briców
for (int q = 0; q <= bricki; q++)
{
if (72 * i >= 1024 - 72) // jeżeli 72 * i jest większe od szerokości ekranu wyzeruj i czyli ustaw x na 72 i zwiększ y o półtora kwadrata
{
i = 1;
y += 1;
}
cegla.setSize(sf::Vector2f(50, 15));
cegla.setFillColor(sf::Color::Red);
cegla.setPosition(72 * i, y * 72); // stwórz cegłe
cegielki.push_back(cegla); // następnie ją włóż do vektora
i++; // zmienna która daje nam znać że jest o jedną cegłe więcej i należy następny klocek położyć w odległośći wyznaczoej wyżej
}
}
void level::sprawdzkolizje(sf::CircleShape& kolo,float& vx,float& vy)
{
for (int i = 0; i <= ile; i++)
{
// sprawdzanie czy nie ma kolizji
sf::FloatRect bkolo = kolo.getGlobalBounds();
sf::FloatRect bcegla = cegielki[i].getGlobalBounds();
// jeżeli zaszła kolizja
if (bcegla.intersects(bkolo))
{
std::cout << ile << std::endl;
//usuń cegłe z vektora
cegielki.erase(cegielki.begin()+i);
// zmiejsz pętle rysowania o 1
ile--;
vy = -vy;
}
}
}
void lvlv2::ustaw()
{
bricki = 30;
ile = bricki;
levelplay();
}
void Arkanoid::glowna()
{ //Polimorficzny wskaźnik ( ma służyć zmianie lvl-a)
level *lvl1 = new lvlv1;
lvl1->ustaw();
while (okno.isOpen())
{
nadajv();
lvl1->sprawdzkolizje(kolo,vx,vy);
WindowsHandleEvent();
okno.clear(sf::Color::Cyan);
okno.draw(paletka);
okno.draw(*lvl1);
okno.draw(kolo);
okno.display();
}
}
void lvlv1::ustaw()
{
bricki = 20;
ile = bricki;
levelplay();
}
void Arkanoid::WindowsHandleEvent()
{
while(okno.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
okno.close(); break;
case sf::Event::KeyPressed:
{
switch (event.key.code)
{
case sf::Keyboard::A: paletka.move(-25, 0); break;
case sf::Keyboard::W: kolo.move(0, -25); break;
case sf::Keyboard::S: kolo.move(0, 25); break;
case sf::Keyboard::D: paletka.move(25, 0); break;
}
}break;
}
}
}
void Arkanoid::nadajv()
{
kolo.move(vx, vy);
///////FIlozofia odbijania
// górna podstawa paletki
if ((kolo.getPosition().x >= paletka.getPosition().x) && (kolo.getPosition().x <= paletka.getPosition().x + 100) && (kolo.getPosition().y >= paletka.getPosition().y))
{
vy = -vy;
}
// srodek paletki (piłka zwolni)
else if (kolo.getPosition().x >= paletka.getPosition().x + 40 && kolo.getPosition().x <= paletka.getPosition().x + 60 && kolo.getPosition().y >= paletka.getPosition().y)
{
vy -=0.2f;
if (vx <= 0)
vx += 0.2f;
else
vx -= 0.2f;
vx = -vx;
std::cout << vx<<std::endl;
}
// lewy bok paletki
else if (kolo.getPosition().x == paletka.getPosition().x && kolo.getPosition().y >= paletka.getPosition().y && kolo.getPosition().y <= paletka.getPosition().y + 20)
{
vy = -vy;
vx = -vx;
}
// prawy bok paletki
else if (kolo.getPosition().x == paletka.getPosition().x + 100 && kolo.getPosition().y >= paletka.getPosition().y && kolo.getPosition().y <= paletka.getPosition().y + 20)
{
vy = -vy;
vx = -vx;
}
// wierzchołek paletki (prawy)
else if (kolo.getPosition().x == paletka.getPosition().x + 100 && kolo.getPosition().y == paletka.getPosition().y)
{
vy = -vy;
vx = -vx;
}
// wierzchołek paletki (lewy)
else if (kolo.getPosition().x == paletka.getPosition().x && kolo.getPosition().y == paletka.getPosition().y-5)
{
vy = -vy;
}
// lewy bok ekranu
else if (kolo.getPosition().x <= 0){
vx = -vx;
}
// sufit
else if (kolo.getPosition().y <= 0){
vy = -vy;
}
// prawy bok ekranu
else if (kolo.getPosition().x >= 1024)
vx = -vx;
}