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

SFML PixelPerfectTest

Object Storage Arubacloud
0 głosów
256 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,590 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,590 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 (155,460 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ź 755 wizyt
pytanie zadane 6 kwietnia 2017 w C i C++ przez K4mczi Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 303 wizyt
pytanie zadane 29 czerwca 2020 w C i C++ przez oski. eskimoski Początkujący (380 p.)
0 głosów
0 odpowiedzi 485 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 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!

...