2017-06-07 4 views
0

Ich habe es endlich geschafft, meine Fliesen auf dem Bildschirm richtig zu zeichnen. Obwohl der Standort ein bisschen aus ist und ich nicht herausfinden kann, warum ...Fliesen werden an der falschen Stelle gezeichnet

Ich benutze SFML zum Zeichnen.

Tile.hpp:

#ifndef TILE_HPP 
#define TILE_HPP 

#include <SFML/Graphics.hpp> 
#include <SFML/System.hpp> 

#include "textureManager.hpp" 

class Tile { 
public: 
    Tile(); 
    Tile(sf::Vector2i coord, int biome); 
    ~Tile(); 

    sf::Vector2i getCoord() const { return coord; }; 
    int getBiome() const { return biome; }; 

    void setCoord(sf::Vector2i coord) { this->coord = coord; }; 
    void setBiome(int biome) { this->biome = biome; }; 

    void draw(int x, int y, sf::RenderWindow* rw); 
    void update(sf::Texture& texture); 

private: 
    sf::Vector2i coord; 
    int biome; 

    sf::Sprite sprite; 
}; 

#endif 

Tile.cpp

#include <SFML/Graphics.hpp> 
#include <SFML/System.hpp> 

#include "textureManager.hpp" 
#include "tile.hpp" 

Tile::Tile() 
{} 

Tile::Tile(sf::Vector2i coord, int biome) { 
    this->biome = biome; 
    this->coord = coord; 
} 

Tile::~Tile(){} 

void Tile::draw(int x, int y, sf::RenderWindow* rw) 
{ 
    sprite.setPosition(x, y); 
    rw->draw(sprite); 
} 

void Tile::update(sf::Texture& texture) 
{ 
    switch (biome) 
    { 
     // Not important here 
    } 
} 

Jetzt desto relevanter Teil: die Zeichnung

void StatePlay::draw(const float dt) 
{ 
    game->window.setView(view); 
    game->window.clear(sf::Color::Black); 

    sf::Vector2f offset = camera.getLocation(); 
    int newX = (offset.x/map.getTileSize()) - (map.chunkSize/2); 
    int newY = (offset.y/map.getTileSize()) - (map.chunkSize/2); 

    for (int x = 0; x < map.chunkSize; x++) 
    { 
     for (int y = 0; y < map.chunkSize; y++) 
      { 
       Tile tile = map.getTile(newX + x, newY + y); 
       tile.draw((newX + x) * map.getTileSize(), (newY + y) * map.getTileSize(), &game->window); 
      } 
     } 

    return; 
} 

StatePlay::StatePlay(Game* game) 
{ 
    this->game = game; 
    sf::Vector2f pos = sf::Vector2f(game->window.getSize()); // 1366x768 
    view.setSize(pos); 
    pos *= 0.5f; // 688x384 
    view.setCenter(pos); 

    // Initialize map 
    map.init(game->gameTime, game->textureManager.getImage("tileset.png")); 

    float w  = (float) map.getWidth(); // 500 
    float h  = (float) map.getHeight(); // 500 
    w   *= 0.5f; // 250 
    h   *= 0.5f; // 250 
    w   *= map.getTileSize(); // 250 * 32 = 8000 
    h   *= map.getTileSize(); // 250 * 32 = 8000 
    // Move camera 
    // Uses view::move from sfml to move the view with w and h 
    // Also sets camera private to w and h values, return with camera::getLocation() 
    camera.setLocation(&view, sf::Vector2f(w, h)); 
} 

Das Ergebnis ist, dass ich nur die ~ 10 sehen Quadrate, in der unteren linken Ecke meines Bildschirms, etwa 3/4.

Example

Die richtigen Fliesen werden so gewählt, aber die Zieh Lage ist falsch ... Es ist das Zentrum von 64x64 (x 32px each) Fliesen, so viel wie Passform auf dem Bildschirm zu zeichnen.

+0

Was ist newX und newY? Was versuchst du mit deinem Sprite zu zeichnen, du positionierst nur Positionen ... Es gibt weder Textur noch Farbe. Und könnten Sie bitte aufschreiben, was gerade schief läuft? –

+0

Ich habe es weggelassen, weil es schon so viel Code war. Der Schritt-für-Schritt-Prozess: 'map' wird im' StatePlay'-Konstruktor initialisiert, er generiert eine Standard-500x500-Kachelkarte. Dann wird die Kamera auf das Zentrum gesetzt. (250 x Kachelgröße). Dies verwendet 'sf :: View :: move' und aktualisiert den Speicherort privat in der Kamera-Klasse. Im 'StatePlay :: draw' loopt es x und y bis <64, was die' chunkSize' ist. Dies sollte also die Kacheln 218 bis 282 sowohl auf x als auch auf y ziehen. Die 'newX' und' newY' erhalten lediglich den Standort der Kamera und stellen sicher, dass die erste Schleife bei dieser '218' beginnt. Sehen Sie das Bild in Frage. – nepp95

+0

haben Sie zuerst mit der Standardansicht versucht? –

Antwort

0

Ich habe das Problem behoben. Es war ein sehr dummer Fehler ...

Zuerst ohne Zeichnung, ist es normal, die Ansicht auf 0.5f * sf::View::getSize() zu zentrieren, um die Ansicht in Ihrem Fenster zentriert zu bekommen. Also war das Zentrum schon halb so groß wie meine Fenstergröße. Bei Verwendung von Camera::setLocation() habe ich die sf::View::move() verwendet, um die Ansicht entsprechend zu verschieben. Also, als ich versuchte, es auf der Karte zu zentrieren, fügte es die x und y korrekt hinzu, aber auch die Hälfte meiner Fenstergröße. Dies führte zu einem Offset, der falsch war. Das Subtrahieren oder Verlassen dieser Werte hat dieses dumme Problem behoben.

Vielen Dank für die Hilfe.

+1

Sie sollten diese Antwort als akzeptiert markieren, damit die Leute wissen, dass die Frage eine Antwort hat, die das Problem gelöst hat. – Chringo

+0

Wird, ist aber in den ersten 24 Stunden nicht möglich. – nepp95

Verwandte Themen