SFML Pytanie o mape oraz podskakiwanie

Odpowiedz Nowy wątek
2014-12-29 17:00
0

Witam
Musze wykonac na projekt w C++ jakis program/ gre. Wpadlem na pomysl zrobienia runnera(biegnie postac z lewej do prawej i musimy podskakiwac w tempo). Lecz nie moge wyswietlic mojej postaci. Okienko wyswietla i nic. Oto kody z moich plikow.

main.cpp

#include "Game.h"
 
int main()
{
    Game game;
    game.GameStart();
 
    return EXIT_SUCCESS;
} 

Game.h

#include <SFML\Window.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Window\WindowStyle.hpp>
 
using namespace sf;
 
class Game
{
public:
 
    Game(void);
 
    void GameStart();
    RenderWindow window;
    Texture texture;
    Sprite sprite;
 
    void PlayerTexture();
 
private:
    Font font;
 
}; 

Game.cpp

#include "Game.h"
 
Game::Game(void)
{
    window.create(VideoMode(800, 600), "Runner");
}
 
void Game::PlayerTexture()
{
 
    if (!texture.loadFromFile("postac.png"))
    {
 
        sprite.setTexture(texture);
    }
 
}
 
void Game::GameStart()
{
 
    Game::PlayerTexture();
    while (window.isOpen())
    {
 
        sf::Event event;
        while (window.pollEvent(event))
        {
            window.draw(sprite);
            window.display();
            window.clear();
 
            if (event.type == sf::Event::Closed || Keyboard::isKeyPressed(Keyboard::Key::Escape))
                window.close();
        }
    }
 
}
 

Pozostało 580 znaków

2014-12-29 17:10
Wybitny Pomidor
1

Zamien

 
void Game::GameStart()
{
 
    Game::PlayerTexture();
    while (window.isOpen())
    {
 
        sf::Event event;
        while (window.pollEvent(event))
        {
            window.draw(sprite);
            window.display();
            window.clear();
 
            if (event.type == sf::Event::Closed || Keyboard::isKeyPressed(Keyboard::Key::Escape))
                window.close();
        }
    }
 

na

 
void Game::GameStart()
{
 
    Game::PlayerTexture();
    while (window.isOpen())
    {
 
        sf::Event event;
        while (window.pollEvent(event))
        {
 
            if (event.type == sf::Event::Closed || Keyboard::isKeyPressed(Keyboard::Key::Escape))
                window.close();
        }
 
  window.draw(sprite);
            window.display();
            window.clear();
}

Inaczej będzie ono rysowane tylko przy evencie.

Pozostało 580 znaków

2014-12-29 17:11
Wybitny Pomidor
1

Jeszcze jeden błąd

void Game::PlayerTexture()
{
 
    if (!texture.loadFromFile("postac.png"))
    {
 
        sprite.setTexture(texture);
    }
 
}

Musi byc if(texture.loadFromFile(...)) a nie if(!texture) inaczej ustawiasz tektury dla sprite tylko gdy nie udało się załadować textury.

Pozostało 580 znaków

2014-12-29 17:13
0

ok wielkie dzieki

a w ladowaniu byl blad bo poczatkowa wersja wyswietlala jeszcze error a pozniej to usunalem a wykrzyknik zostal

dzieki

Pozostało 580 znaków

2014-12-30 13:56
0

mam jeszcze jedno pytanie zwiazane z mapa

doszla mi 1 klasa

Level.h

#include <SFML\Graphics.hpp>
#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
 
#include "Game.h"
 
class Level
{
public:
 
    void LoadLevel();
    void drawLevel();
 
    sf::Texture tileTexture;
    sf::Sprite tiles;
    std::string tileLocation;
    std::string str;
 
    sf::Vector2i map[100][100];
    sf::Vector2i loadCounter = sf::Vector2i(0, 0);
 
    friend Game::Game();
 
}; 

Level.cpp

#include "Level.h"
 
void Level::LoadLevel()
{
    std::ifstream openfile("level/map.txt");
 
    if (openfile.is_open())
    {
 
        openfile >> tileLocation;
 
        tileTexture.loadFromFile(tileLocation);
        tiles.setTexture(tileTexture);
        while (!openfile.eof())
        {
            openfile >> str;
            char x = str[0], y = str[2];
 
            if (!isdigit(x) || !isdigit(y))
                map[loadCounter.x][loadCounter.y] = sf::Vector2i(-1, -1);
            else
                map[loadCounter.x][loadCounter.y] = sf::Vector2i(x - '0', y - '0');
 
            if (openfile.peek() == '\n')
            {
                loadCounter.x = 0;
                loadCounter.y++;
            }
            else
                loadCounter.x++;
        }
    }
 
    loadCounter.y++;
}
 
void Level::drawLevel()
{
    for (int i = 0; i < loadCounter.x; i++)
    {
        for (int j = 0; j < loadCounter.y; j++)
        {
            if (map[i][j].x != -1 && map[i][j].y != -1)
            {
                tiles.setPosition(i * 32, j * 32);
                tiles.setTextureRect(sf::IntRect(map[i][j].x * 32, map[i][j].y * 32, 32, 32));
 
            }
        }
    }
 
} 

Jak zrobic aby wyswietlic mape na oknie ktore jest tworzone w innej klasie.

Pozostało 580 znaków

2014-12-30 16:12
0

Musiałbyś zrobić funkcję, która bierze jako argument

sf::RenderWindow& 

lub dziedziczyć posf::Drawable

.
Ps. Użyj do tworzenia tilemapy VertexArray w tutorialu o 
```cpp
sf::VertexArray

jest przykład jak taką mape zaimplementować.

edytowany 3x, ostatnio: tffsts, 2014-12-30 16:22

Pozostało 580 znaków

2014-12-30 16:28
0

no ok mam funkcje DrawLevel ktora bierze jako argument window, ale nie moge teraz wywolac tej funkcji...

Pozostało 580 znaków

2014-12-30 16:30
0

Pokaż kod tej funkcji i jak ją wywołujesz. Powinieneś zwyczajnie zrobić tą funkcji, potem obiekt klasy i wywołać funkcje

Pozostało 580 znaków

2014-12-30 16:32
0

dopisalem do funkcji DrawLevel (sf::RenderWindow &window)

a wywoluje w Game.cpp poprzez Level::DrawLevel(window);

edytowany 1x, ostatnio: dawid1110, 2014-12-30 16:36

Pozostało 580 znaków

2014-12-30 16:36
0

A dopisałeś

window.draw(tiles);

?

Pozostało 580 znaków

2014-12-30 16:36
0
tffsts napisał(a):

A dopisałeś

window.draw(tiles);

?

tak dopisalem ale mi sie rzuca o wywolanie funkcji

no to pokaż jak wywołujesz tą funkcję i jaki błąd wyskakuje - tffsts 2014-12-30 16:38
Level::DrawLevel(window); a blad to Error 1 error C2352: 'Level::drawLevel' : illegal call of non-static member function c:\users\dawid\desktop\visual 2013\sfml game\game.cpp 62 1 SFML Game - dawid1110 2014-12-30 16:39

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0