• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rysowanie obiektów z vectora w SFML

Object Storage Arubacloud
0 głosów
718 wizyt
pytanie zadane 25 kwietnia 2018 w C i C++ przez Don Corleone Obywatel (1,210 p.)

Witam, mam problem z rysowaniem obiektów z vectora, nie wiem z jakiego powodu nie są one rysowane w oknie, prosiłbym o radę oraz ewentualne wskazanie błędów lub poprawę schematu kodu

Block.h

#include <SFML/Graphics.hpp>
using namespace sf;
class Block : public Drawable
{

private:
	int block_width=40;
	int block_heigth=80;
	RectangleShape shape;
	Vector2f bok = { block_width,block_heigth };

public:
	RectangleShape getShape();
	Block(float px, float py);
	Block()=delete;
	~Block()=default;
	void draw(RenderTarget &target, RenderStates state) const override;
};

 

Block.cpp

#include "Block.h"



Block::Block(float px, float py)
{
	this->shape.setPosition(px, py);
	this->shape.setFillColor(Color::Yellow);
	this->shape.setSize(bok);
	this->shape.setOrigin(block_width / 2.0f, block_heigth / 2.0f);
}

void Block::draw(RenderTarget &target, RenderStates state) const
{
	target.draw(this->shape, state);
}
 RectangleShape Block::getShape()
{
	return this->shape;
}

Engine.cpp

#include "Engine.h"



Engine::Engine()

{
	Vector2f resolution;
	resolution.x = VideoMode::getDesktopMode().width;
	resolution.y = VideoMode::getDesktopMode().height;
	window.create(VideoMode(resolution.x, resolution.y),
		"Game Engine", Style::Fullscreen);

	backgroundTexture.loadFromFile("background.jpg");
	backgroundSprite.setTexture(backgroundTexture);
	
}


Engine::~Engine()
{
}


void Engine::createBlocks(int ilosc, vector<Block> vec)
{
	int n1 = 200, n2 = 200;
	for (int i = 0; i < ilosc; i++)
	{
		Block block(n1, n2);
		vec.push_back(block);
		n1 += 200;
	}
	
}

void Engine::input()
{
	if (Keyboard::isKeyPressed(Keyboard::Escape))
	{
		window.close();
	}

}


void Engine::start()
{
	Clock clock;
	vector<Block>::iterator it;
	vector<Block>::iterator end;
	while (window.isOpen())
	{
		createBlocks(10, vecBlock);
		// Restart the clock and save the elapsed time into dt
		Time dt = clock.restart();
		// Make a fraction from the delta time
		float dtAsSeconds = dt.asSeconds();
		window.draw(ball);
		window.draw(paddle);
		window.draw(bloczek);
		for (it = vecBlock.begin(), end = vecBlock.end(); it != end; it++)
		{
			window.draw(it->getShape());
		}

		window.display();
		window.clear();
		ball.update();
		ball.update2(paddle);
		paddle.update();
		input();
	}
}

 

1 odpowiedź

+1 głos
odpowiedź 25 kwietnia 2018 przez criss Mędrzec (172,590 p.)
wybrane 25 kwietnia 2018 przez Don Corleone
 
Najlepsza
A jak dodajesz bloki do vectora? Jeśli robisz to metodą createBlocks, to twój vector jest po prostu pusty - pracujesz na kopii. Niech funkcja przyjmuje referencje na vector, żeby pracowała na oryginale. Obecnie wykonujesz `ilosc` push_backów z zerowym efektem.. Podobnie zmień w getShape - dlaczego RectangleShape musi byc kopiowany tylko po to, żeby go narysować (zwracasz kopie) ? Mówie o linii 64. Engine.cpp. Też zmień to na referencje bądź const referencje.
komentarz 25 kwietnia 2018 przez Don Corleone Obywatel (1,210 p.)
Dzięki za pomoc , problem naprawiony tylko miałbym jeszcze jedno pytanie.

Ogólnie tworze grę w której odbijam kulkę sterowalnym obiektem typu Paddle, przed dodaniem tych bloczków kulka oraz ta moja paletka poruszają się zgodnie z prędkością zdefiniowaną wektorem predkosci oraz za pomocą metody move, po dodaniu vectora bloczków predkosc drastycznie maleje, prawie do zera, wiesz może w czym jest problem?
komentarz 25 kwietnia 2018 przez niezalogowany

Don Corleone funkcja createBlocks ma dodać tylko raz 10 bloków czy ma dodawać je za każdym cyklem pętli gry? Po paru sekundach możesz mieć w pamięci kilka tysięcy tych bloków. Myślę, że to może być problem. 

1
komentarz 25 kwietnia 2018 przez criss Mędrzec (172,590 p.)
Tzn. maleje fps czy po prostu prędkość bloczków/paddle bez zmiany fps? Jeśli to drugie, to masz coś bardzo dziwnego w kodzie XD Jeśli to pierwsze, to tak jak mówi Hipcio pewnie rysujesz jakieś tysiące tych bloczków..
komentarz 25 kwietnia 2018 przez Don Corleone Obywatel (1,210 p.)
rzeczywiscie , nie w tym miejscu ja wywolalem dzięki :D
komentarz 26 kwietnia 2018 przez Don Corleone Obywatel (1,210 p.)

Mam jeszcze jedno pytanko, napisałem funkcje obsługująca kolizje między kulką i paletką oraz kulką i bloczkami przy czym od paletki się odbija a bloczków nie, może z powodu godziny to jakaś pierdoła ale wole zapytać :D

Funckje left,right,bottom i top są na pewno poprawne ponieważ w pierwszym przypadku wszystko działa jak należy

Funkcja 

void Ball::update2(Paddle &padle,vector<Block> &vec)
{
    /* warunek obslugujacy odbicie pileczki od paletki */

    if (this->right() <= padle.right() && this->left() >= padle.left()
        && this->bottom() >= padle.top() && this->top() <= padle.bottom())
    {
            velocity.y = -ballSpeedVelocity;
            
    }

    /* warunek obslugujacy odbicie pileczki od bloczkow*/

    for (it = vec.begin(), end = vec.end(); it != end; it++)
    {
        if (this->right() <= it->right() && this->left() >= it->left()
            && this->bottom() >= it->top() && this->top() <= it->bottom())
        {
            velocity.y = -ballSpeedVelocity;
        }
    }

    shape.move(velocity);
}
komentarz 26 kwietnia 2018 przez niezalogowany
edycja 26 kwietnia 2018
Klasa Block ma poprawnie zdefiniowane metody top/bottom/left/right (najlepiej jakby były odziedziczone od sf::RectangleShape)? BTW Wrzuć cały kod na github czy gdzieś. Wtedy obędzie się bez wróżenia z fusów, a na pewno będzie można więcej doradzić :D
komentarz 26 kwietnia 2018 przez Don Corleone Obywatel (1,210 p.)
Pierwszy raz korzystam ze zdalnego repo mam nadzieje ze dobrze to zrobilem ;p

https://github.com/Kulkenson7/firstgamee
komentarz 26 kwietnia 2018 przez niezalogowany

Przynajmniej wszystko widać. Wydaje mi się, że w tym momencie najłatwiej będzie zastąpić Twój system kolizji tym który w SFML jest czyli metod getGlobalBounds + intersects (ta sama kanciata kolizja wyjdzie (prostokąt-prostokąt)). Żeby nie robić tych funkcji od zera od razu wykonaj dziedziczenie od sf::RectangleShape/sf::CircleShape (albo sf::Sprite). Wszystkie ważne funkcje łącznie z draw zostaną odziedziczone. Przykład kolizji:

bool is_col = a.getGlobalBounds().intersect(b.getGlobalBounds);

Z takich kilku innych uwag włącz sobie C++11 żeby móc używać range-based for i auto (obędzie się bez std::vector::iterator):

for (it = vecBlock.begin(), end = vecBlock.end(); it != end; it++)
{
    window.draw(it->getShape()); // lepiej window.draw(*it);
}
for (auto& ball : vecBlocks) // może od razu blocks?
{
    window.draw(ball);
}
komentarz 26 kwietnia 2018 przez Don Corleone Obywatel (1,210 p.)
Dzięki wielkie za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 146 wizyt
pytanie zadane 19 września 2017 w C i C++ przez CPP_Newbie Użytkownik (770 p.)
0 głosów
1 odpowiedź 218 wizyt
pytanie zadane 29 grudnia 2018 w C i C++ przez midlas12 Nowicjusz (140 p.)
0 głosów
3 odpowiedzi 143 wizyt
pytanie zadane 21 maja 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...