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.
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.
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? –
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
haben Sie zuerst mit der Standardansicht versucht? –