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

SFML klasa gry i postaci

+1 głos
808 wizyt
pytanie zadane 6 marca 2018 w C i C++ przez zpawlo00 Początkujący (310 p.)

Uczę się SFML'a no i robie sobie małą gierkę zrobiłem klase postaci i klaase gry

#include "TGame.h"
#include <SFML\Graphics.hpp>
#define WIDTH 900
#define HEIGTH 950



TGame::TGame() : mWindow(sf::VideoMode(WIDTH, HEIGTH), "GAME")
{
	mWindow.setFramerateLimit(60);

}


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()
{
	TPlayer player(WIDTH / 2, HEIGTH / 2.5);


	mWindow.clear();

	mWindow.draw(player);
	player.update();
	
	
	mWindow.display();
}

void TGame::update_game()
{
	

}
#include "TPlayer.h"
#include <SFML\Graphics.hpp>

#include <iostream>


TPlayer::TPlayer(float t_X, float t_Y)
{
	
	playerTexture.loadFromFile("player_texture.jpg");
	if (!playerTexture.loadFromFile("player_texture.jpg"))
	{
		std::cout << "Load failed!";
		system("pause");
	}
	
	
	

	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::Left) && this->moveLeft() > 30)
	{
		
		playerSprite.move(-20, 0);
	}
	else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Key::Right) && this->moveRight() < 870)
	{
		
		playerSprite.move(20, 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;
}

co muszę zrobić żeby funkcja update() z klasy postaci dzialala w klasie gry? W programie postać się pokazuje ale nie chce się poruszać

2 odpowiedzi

+1 głos
odpowiedź 6 marca 2018 przez Ehlert Ekspert (215,070 p.)
Obiekt Player jest lokalny dla metody render. Powinieneś go umieścić jako składową klasy game. Po drugie przenieś detekcję klawisza z klasy gracza do klasy gry.
0 głosów
odpowiedź 6 marca 2018 przez mokrowski Mędrzec (158,940 p.)
Zgaduję bo nie umieściłeś deklaracji klas. Twoją intencją były metody wirtualne? W takim razie ich nie masz ( update() )

Co to za kuriozalne system("pause"); ?
komentarz 7 marca 2018 przez zpawlo00 Początkujący (310 p.)

@mokrowski, Niestety nie wiem jak sobie z tym poradzić mógłbyś mi pomóc?

komentarz 7 marca 2018 przez mokrowski Mędrzec (158,940 p.)

Do konstruktora TGame, przekaż obiekt TPlayer. Deklaracja klasy może być np. taka:

#pragma once
#include <SFML\Graphics.hpp>
#include "TPlayer.h"
 
#define WIDTH 900
#define HEIGTH 950
 
class TGame
{
public:
     
    TGame(TPlayer * player_);
    void run();
private:
    void processEvents();
    void update_game();
    void render();
private:
    sf::RenderWindow mWindow;
    TPlayer * player;
};

Implementacja konstruktora TGame np. taka:

TGame::TGame(TPlayer * player_) : player(player_), mWindow(sf::VideoMode(WIDTH, HEIGTH), "GAME")
{
    mWindow.setFramerateLimit(60);
 
}

A TGame::render() np. takie:

void TGame::render()
{
    mWindow.clear();
 
    mWindow.draw(player);
    player->update();
     
     
    mWindow.display();
}

Chodzi o prosty fakt trzymania wskaźnika do raz utworzonego TPlayer a nie tworzenie go "raz po raz".

komentarz 7 marca 2018 przez zpawlo00 Początkujący (310 p.)
int main()
{
	TGame game;
	game.run();
}

source.cpp(61): error C2512: 'TGame': no appropriate default constructor available

 

komentarz 7 marca 2018 przez mokrowski Mędrzec (158,940 p.)

No i mówiłem żebyś pokazał main.cpp...

int main()
{
    TPlayer player(100, 100); // jakieś wsp.
    TGame game(&player);
    game.run();
}

 

komentarz 7 marca 2018 przez zpawlo00 Początkujący (310 p.)
DZIĘKUJĘ BARDZO ZA POMOC WSZYSTKO DZIAŁA <3

Podobne pytania

0 głosów
1 odpowiedź 771 wizyt
pytanie zadane 11 marca 2018 w C i C++ przez zpawlo00 Początkujący (310 p.)
0 głosów
2 odpowiedzi 1,363 wizyt
pytanie zadane 10 kwietnia 2018 w C i C++ przez Damian.W Początkujący (320 p.)
0 głosów
2 odpowiedzi 490 wizyt

93,600 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,085 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
...