LINUX.ORG.RU

SFML. Проблемы с отображением пуль.

 , , textures


0

1

Не могу заставить текстуры отображаться, уже всю голову сломал :(

Создал класс Bullet. Если не учитывать движение, то всё будет выглядеть примерно так(минимальная конструкция):

	bullets[0] = Bullet(Rbullet, Tbullet, velocityBullet);
	bullets[0].create(player.getPosition().x, player.getPosition().y);
	bullets[0].render(window);

В результате всё работает даже без IntRect(ширина и высота кореекстно считываются с текстуры), но текстура вся белая.

Если работать не с массивом (векторы), а с одним объектом, то всё будет работать нормально:

	Bullet test(Rbullet, Tbullet, velocityBullet);
	test.create(player.getPosition().x, player.getPosition().y);
	test.render(window);

Вот заголовочный файл класса и файл с реализацией класса:

#ifndef BULLET_H
#define BULLET_H


class Bullet {

public:
	Bullet(sf::IntRect bulletRect, sf::Texture bulletTexture, sf::Vector2f velocityBullet);
	~Bullet();
	
	void create(float bulletXPostition, float bulletYPosition);
	bool update(float deltaTime, sf::RenderWindow &window);
	void render(sf::RenderWindow &window);


private:
	sf::IntRect Rbullet;
	sf::Texture Tbullet;
	sf::Sprite bullet;
	
	sf::Vector2f velocity;

};


#endif
#include "bullet.hpp"





Bullet::Bullet(sf::IntRect bulletRect, sf::Texture bulletTexture, sf::Vector2f velocityBullet) {
	Tbullet = bulletTexture;
	Rbullet = bulletRect;
	
	bullet.setTexture(Tbullet);
	bullet.setTextureRect(Rbullet);
	
	bullet.setPosition(sf::Vector2f(-100.f, -100.f));
	
	velocity = velocityBullet;
}



Bullet::~Bullet() {
	
}



void Bullet::create(float bulletXPostition, float bulletYPosition) {
	bullet.setPosition(sf::Vector2f(bulletXPostition, bulletYPosition));
}



bool Bullet::update(float deltaTime, sf::RenderWindow &window) {
	bool isBool = true;
	
	
	bullet.move(velocity * deltaTime);
	
	if(bullet.getPosition().y < 0.f - Rbullet.height || bullet.getPosition().y > window.getSize().y)
		isBool = false;
	
	
	return isBool;
}



void Bullet::render(sf::RenderWindow &window) {
	window.draw(bullet);
}

Вообще принято sf::Texutre, sf::IntRect, sf::Vector2f и прочие передавать по константной ссылке const sf::Vector2f &vec. Это первое.
По теме: первое что приходит в голову теряется текстура. Пуля вылетает и удаляет хендл. (Это смотря какая реализация копирования sf::Texture).
И да bullets[0] = Bullet(Rbullet, Tbullet, velocityBullet); это вообще что? должно же быть:

vector<Bullet> bullets;
Bullet someBullet = new Bullet(blablabla);
someBullet.blablabla;
bullets.push_back(someBullet)

RevenantX ★★★★
()

Я для таких целей писал ResourceManager. Который возвращал ссылки на ресурсы sf::Texrure&, sf::Sound&. потом в конструкторе сразу назначал что-то вроде:

sprite.SetTexture(world->resources.GetTexture("laser"));

RevenantX ★★★★
()
Ответ на: комментарий от RevenantX
Bullet tmp_Bullet = new Bullet(Rbullet, Tbullet, velocityBullet);
player.cpp:62:65: ошибка: запрошено преобразование от «Bullet*» к нескалярному типу «Bullet»

Попробовал так:

Bullet *tmp_Bullet = new Bullet(Rbullet, Tbullet, velocityBullet);
bullets.push_back(tmp_Bullet);
player.cpp:63:30: ошибка: нет подходящей функции для вызова «std::vector<Bullet>::push_back(Bullet*&)»
Human-source
() автор топика
Ответ на: комментарий от RevenantX

Нет, переменные типа Bullet используются несколько раз, через функцию create().

Human-source
() автор топика
Ответ на: комментарий от Human-source

Ну конечно десятки. На классы лучше использовать почти всегда указатели. Придется поменять код в некоторых местах чтобы было как надо и работало. Советую немного подучить C++ если решил таким заниматься.

RevenantX ★★★★
()
Ответ на: комментарий от Human-source

позаменяй точки . на -> там где обращаешься к элементу вектора vector<Bullet*>

RevenantX ★★★★
()

Ты все неправильно делаешь. Теперь модно писать игры на LISP'е.

Сразу все ошибки исчезнут, FPS возрастет на 146%, а текстуры станут мягкими и шелковистыми.

anonymous
()
Ответ на: комментарий от RevenantX

Буду дома, исправлю.

Занимаюсь этим только из-за удовольствия, как и многими другими языками, библиотеками и даже областями(3D моделирование, системное администратирование и др.)

Human-source
() автор топика
Ответ на: комментарий от anonymous

Уже слышал, но как-то не особо заинтересовало. Но если будет время - посмотрю.

Human-source
() автор топика

Перепиши свой код так:

vector<Bullet*> bullets;
Bullet *someBullet = new Bullet(blablabla);
someBullet->blablabla;
bullets.push_back(someBullet)
karmich
()
Ответ на: комментарий от Human-source

Занимаюсь этим только из-за удовольствия, как и многими другими языками, библиотеками и даже областями(3D моделирование, системное администратирование и др.)

Судя по перечисленному, чем ты профессионально не знаимаешься, ты, наверное, доктором работаешь

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.