2017-06-07 21 views
0

私は最終的に正しい方法で画面上に描画されたタイルを得ることができました。場所はちょっと離れていますが、私は理由を理解できないようですが...タイルが間違った場所に描画されています

私は描画にSFMLを使用しています。

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

​​

今より関連部分:

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)); 
} 

を描画結果は私だけ〜10を参照してくださいということです私の画面の左下隅にあるタイルの四角形は、約3/4を覆っています。画面に収まる限り、(X 32PXそれぞれ)のタイルを

Example

適切なタイルが選択されていますが、ドロー場所は、それは64×64の中心を描く必要があります...間違っています。

+0

newXとnewYとは何ですか? あなたのスプライトで何を描こうとしていますか、位置を決めています...テクスチャも色もありません。そして、間違っていることだけを書き留めてください。 –

+0

それはあまりにも多くのコードだったので、私はそれを残しました。ステップバイステップのプロセス: 'map'は' StatePlay'コンストラクタで初期化され、デフォルトの500x500タイルマップを生成します。次に、カメラはこの中心に設定されます。 (250×タイルサイズ)。これは 'sf :: View :: move'を使用し、カメラクラス内のプライベート場所を更新します。 'StatePlay :: draw'では、xとyを nepp95

+0

最初にデフォルトビューで試してみましたか? –

答えて

0

問題を修正しました。非常に愚かな間違いでした...

最初に何も描画せずに、0.5f * sf::View::getSize()にビューを中央に置くと、ウィンドウが中央に表示されます。だからセンターはすでに私のウィンドウサイズの半分になっていた。 Camera::setLocation()を使用しているときは、sf::View::move()を使用してビューを適切に移動しました。だから、マップ上でそれを中心にしようとすると、xとyがウィンドウサイズの半分だけ正しく追加されました。その結果、オフセットが正しくないことがありました。サブ抽象化またはそれらの値を残すことは、この愚かな問題を解決しました。

ありがとうございました。

+1

問題を解決した回答があることを人々が理解できるように、この回答には合格とマークする必要があります。 – Chringo

+0

最初の24時間では可能ですが、不可能です。 – nepp95

関連する問題