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

SFML PixelPerfectTest

0 głosów
400 wizyt
pytanie zadane 17 marca 2018 w C i C++ przez zpawlo00 Początkujący (310 p.)

Chciałem skorzystać z tej biblioteki i z funkcji PixelPerfectText, tlyko ja mam dwie klasy w ktorych sa spajty.

#pragma once
#include <SFML\Graphics.hpp>


class TBlocks:public sf::Drawable
{
public: 
	TBlocks(float t_X, float t_Y);
	TBlocks()=delete;
	virtual ~TBlocks() = default;

	void update_block();
	

private:
	void draw(sf::RenderTarget& target, sf::RenderStates states) const override;
	sf::Texture block_texture;
	sf::Sprite blockSprite;
	sf::Texture *bTexture = &block_texture;

	
	std::string blocks[3];


};

#include "TBlocks.h"
#include "Collision.h"
#include <iostream>
#include <stdio.h>     
#include <SFML\Graphics.hpp>
#include <stdlib.h>  
#include <algorithm>
#include <random>
#include <time.h> 






TBlocks::TBlocks(float t_X, float t_Y)
{
	blocks[0] = "blocks/block_1.png";
	blocks[1] = "blocks/block_2.png";
	blocks[2] = "blocks/block_3.png";

	//RANDOMOWE BLOKI
	std::random_device rseed;
	std::mt19937 rgen(rseed()); 
	std::uniform_int_distribution<int> idist(0, 2); 

	int los = idist(rgen);
	
	
	
	Collision::CreateTextureAndBitmask(block_texture, blocks[los]);
	blockSprite.setTexture(block_texture);
	blockSprite.setPosition(t_X, t_Y);
	blockSprite.setOrigin(sf::Vector2f(blockSprite.getTexture()->getSize().x * 0.5, blockSprite.getTexture()->getSize().y * 0.8));
}

void TBlocks::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
	target.draw(this->blockSprite, states);
}
void TBlocks::update_block()
{
	blockSprite.move(0, 3);
}
#ifndef TPLAYER_H
#define TPLAYER_H
#include <SFML/Graphics.hpp>


class TPlayer : public sf::Drawable
{
public:

	TPlayer(float t_X, float t_Y);
	TPlayer() = delete;
	virtual ~TPlayer() = default;
	void update();

	float moveRight();
	float moveLeft();

	void draw(sf::RenderTarget& target, sf::RenderStates states) const override;



private:
	
	sf::Texture playerTexture;
	sf::Sprite playerSprite;
	sf::Texture *pTexture = &playerTexture;


	const double playerVelocity{4};
	sf::Vector2f velocity{ playerVelocity, 0.f };




};

#endif // TPLAYER_H
#include "TPlayer.h"
#include <SFML\Graphics.hpp>
#include "Collision.h"
#include <iostream>


TPlayer::TPlayer(float t_X, float t_Y)
{

	
	Collision::CreateTextureAndBitmask(playerTexture, "player_texture.jpg");
	playerSprite.setTexture(playerTexture);
	playerSprite.setPosition(t_X, t_Y);
	playerSprite.setOrigin(sf::Vector2f(playerSprite.getTexture()->getSize().x * 0.5, playerSprite.getTexture()->getSize().y * 0.5));

	

}

void TPlayer::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
	
	target.draw(this->playerSprite, states);
}

 void TPlayer::update()
{
	
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::A) && this->moveLeft() >20)
	{
		
		playerSprite.move(-7, 0);
	}
	else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::D) && this->moveRight() < 880 )
	{
		
		playerSprite.move(7, 0);
	}
	else
	{
		
		playerSprite.move(0, 0);
	}
}

float TPlayer::moveLeft()
{
	
	return this->playerSprite.getPosition().x - playerSprite.getOrigin().x / 2.f;
	
}

float TPlayer::moveRight()
{
	
	return this->playerSprite.getPosition().x + playerSprite.getOrigin().x / 2.f;
}

#include "TGame.h"
#include "TBlocks.h"
#include "Menu.h"
#include "Collision.h"
#include <SFML\Graphics.hpp>\

#define WIDTH 900
#define HEIGTH 950




TGame::TGame(TPlayer * player_, TBlocks * block_) : player(player_), block(block_), mWindow(sf::VideoMode(WIDTH, HEIGTH), "GAME") 
{
	mWindow.setFramerateLimit(60);
	if (Collision::PixelPerfectTest(player, block))
	{
		mWindow.close();
	}
}


void TGame::run()
{
	while (mWindow.isOpen())
	{
		processEvents();
		update_game();
		render();
	}
}

void TGame::processEvents()
{
	sf::Event event;
	while (mWindow.pollEvent(event))
	{
		if (event.type == sf::Event::Closed)
			mWindow.close();
		

		break;
	}
}


void TGame::render()
{
	
	mWindow.clear();

	mWindow.draw(*block);
	mWindow.draw(*player);
	block->update_block();
	player->update();


	mWindow.display();
}

void TGame::update_game()
{
	

}


W jaki sposób mogę użyć tej funkcji w klasie TGame tak żeby sprawdzała kolizję dla tych dwóch klas player i blocks?

komentarz 17 marca 2018 przez criss Mędrzec (172,570 p.)

Wrzuciłeś kod WSZYSTKIEGO poza tym o co pytasz. Serio, jak wy to robicie? To jest jakiś talent?

komentarz 18 marca 2018 przez zpawlo00 Początkujący (310 p.)

Wrzuciłem kod WSZYSTKIEGO w razie gdyby ktoś potrzebował zobaczyć jak wygląda całość, pytam o to jak mogę użyć funkcji z tej biblioteki (nie mam pojęcia dlaczego nie ma linku w poście, mam wrażenie, że go dodawałem https://github.com/SFML/SFML/wiki/Source:-Simple-Collision-Detection-for-SFML-2 ), jak mam podać sprajty z klas TPlayer oraz TBlocks do funkcji PixelPerfectTest,, tak żeby ta funkcja była w klasie TGame

1 odpowiedź

0 głosów
odpowiedź 18 marca 2018 przez criss Mędrzec (172,570 p.)

jak mam podać sprajty z klas TPlayer oraz TBlocks do funkcji PixelPerfectTest,, tak żeby ta funkcja była w klasie TGame

Po prostu podać sprajta a nie player czy block. Ofc teraz są prywatne, ale żaden problem zrobić je public, albo jakiś getter. Ja bym jednak zrobił jakiś interfejs np. Collideable który będą implementować wszystkie klasy między którymi można sprawdzić kolizje. W zasadzie wystarczy, że będzie miał jedną pure virtual metode `getSprite()` którą będą overridować twoje klasy tak żeby zwracały swoje sprajty. A druga metoda `testCollision` może być już zdefiniowana gdzie będziesz wewnętrznie korzystał z tego Collision z linka który wrzuciłeś. 

komentarz 18 marca 2018 przez zpawlo00 Początkujący (310 p.)

bool TGame::PixelPerfectTest( ) 
{
	sf::FloatRect Intersection;
	if (Object1.getGlobalBounds().intersects(Object2.getGlobalBounds(), Intersection)) {
		sf::IntRect O1SubRect = Object1.getTextureRect();
		sf::IntRect O2SubRect = Object2.getTextureRect();

		sf::Uint8* mask1 = Bitmasks.GetMask(Object1.getTexture());
		sf::Uint8* mask2 = Bitmasks.GetMask(Object2.getTexture());

		for (int i = Intersection.left; i < Intersection.left + Intersection.width; i++) {
			for (int j = Intersection.top; j < Intersection.top + Intersection.height; j++) {

				sf::Vector2f o1v = Object1.getInverseTransform().transformPoint(i, j);
				sf::Vector2f o2v = Object2.getInverseTransform().transformPoint(i, j);

				if (o1v.x > 0 && o1v.y > 0 && o2v.x > 0 && o2v.y > 0 &&
					o1v.x < O1SubRect.width && o1v.y < O1SubRect.height &&
					o2v.x < O2SubRect.width && o2v.y < O2SubRect.height) {

					if (Bitmasks.GetPixel(mask1, Object1.getTexture(), (int)(o1v.x) + O1SubRect.left, (int)(o1v.y) + O1SubRect.top) > AlphaLimit &&
						Bitmasks.GetPixel(mask2, Object2.getTexture(), (int)(o2v.x) + O2SubRect.left, (int)(o2v.y) + O2SubRect.top) > AlphaLimit)
						return true;

				}
			}
		}
	}
	return false;
}

#pragma once
#include <SFML\Graphics.hpp>
#include "TPlayer.h"
#include "Menu.h"
#include "TBlocks.h"


#define WIDTH 900
#define HEIGTH 950

class TGame
{
public:

	TGame(TPlayer *player_, TBlocks *block_);

	void run();
	
	bool PixelPerfectTest(const sf::Sprite& Object1, const sf::Sprite& Object2, sf::Uint8 AlphaLimit = 0);

private:
	void processEvents();
	void update_game();
	void render();
	void checkCollision();
	
	sf::RenderWindow mWindow;
	TPlayer * player;
	TBlocks * block;
	Menu * menu;



};

Jak teraz podać sprajty z tych klas? 

komentarz 18 marca 2018 przez mokrowski Mędrzec (158,940 p.)
W TBlocks zeób metodę dostępową do sprite a w TGame::checkCollision(), wywołaj tę metodę uzyskując sprite z każdego egzemplarza TBlocks. Tak Ci zresztą napisał kolega.
komentarz 23 marca 2018 przez zpawlo00 Początkujący (310 p.)

@Criss,  Mógłbyś mi jakoś pomóc jak to zrobić? Nie bardzo wiem jak

Podobne pytania

0 głosów
1 odpowiedź 1,231 wizyt
pytanie zadane 6 kwietnia 2017 w C i C++ przez K4mczi Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 630 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez oski. eskimoski Początkujący (380 p.)
0 głosów
0 odpowiedzi 839 wizyt

93,604 zapytań

142,529 odpowiedzi

322,997 komentarzy

63,092 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

Kursy INF.02 i INF.03
...