informatykos Temat założony przez niniejszego użytkownika |
» 2014-09-08 14:30:18 Zauważyłem coś nowego, kiedy zmniejszę wielkość kafli z 40x40 na 20x20 to praktycznie nie tnie. Czyli to zależy od wielkości kafli rysowanych na scenie a nie ich ilości O_o. Wziąłem kod ze strony domowej SFML'a z Tile map i dorobiłem tylko poruszającą się postać. przy takich ustawieniach jak podam to mi tnie. Czy mógłby ktoś przekompilować i sprawdzić czy jemu też? Bo już nie wiem co robić... Parametry mojego laptopa to: intel i3 2x2.50, radeon 7600M, 6GB RAM, wg. mnie nie powinno ciąć :( Jak ktoś to odpali i mu nie będzie cięło na słabszym komputerze to normalnie czarodziej jest :) Jako tekstury używałem: http://opengameart.org/sites/default/files/player-move.png http://opengameart.org/content/ground-bush-and-stone-tiles W tym drugim linku jest paczka a w paczce prev_all.png Podaje cały kod: Main: #include <SFML/Graphics.hpp> #include "TileMap.h"
int main() { sf::RenderWindow window( sf::VideoMode( 1280, 760 ), "Tilemap" ); sf::Texture texture; sf::Sprite sprite; texture.loadFromFile( "player.png" ); sprite.setTexture( texture ); sprite.setPosition( sf::Vector2f( 100, 100 ) ); sprite.setTextureRect( sf::IntRect( 0, 0, 64, 64 ) ); const int level[] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, }; TileMap map; if( !map.load( "tileset.png", sf::Vector2u( 40, 40 ), level, 32, 18 ) ) return - 1; sf::Clock clock; sf::Time time; float delta_t = 0.0f; while( window.isOpen() ) { if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { sprite.move( 0, - 50 * delta_t ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) { sprite.move( 50 * delta_t, 0 ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) { sprite.move( 0, 50 * delta_t ); } if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) { sprite.move( - 50 * delta_t, 0 ); } sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) window.close(); } window.clear(); window.draw( map ); window.draw( sprite ); window.display(); time = clock.getElapsedTime(); delta_t = time.asSeconds(); clock.restart(); } return 0; } TileMap.h : #pragma once #include <SFML/Graphics.hpp> class TileMap : public sf::Drawable , public sf::Transformable { public: bool load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height ); private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const; sf::VertexArray m_vertices; sf::Texture m_tileset; }; TileMap.cpp : #include "TileMap.h" #include <SFML/Graphics.hpp>
bool TileMap::load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height ) { if( !m_tileset.loadFromFile( tileset ) ) return false; m_vertices.setPrimitiveType( sf::Quads ); m_vertices.resize( width * height * 4 ); for( unsigned int i = 0; i < width; ++i ) for( unsigned int j = 0; j < height; ++j ) { int tileNumber = tiles[ i + j * width ]; int tu = tileNumber %( m_tileset.getSize().x / tileSize.x ); int tv = tileNumber /( m_tileset.getSize().x / tileSize.x ); sf::Vertex * quad = & m_vertices[( i + j * width ) * 4 ]; quad[ 0 ].position = sf::Vector2f( i * tileSize.x, j * tileSize.y ); quad[ 1 ].position = sf::Vector2f(( i + 1 ) * tileSize.x, j * tileSize.y ); quad[ 2 ].position = sf::Vector2f(( i + 1 ) * tileSize.x,( j + 1 ) * tileSize.y ); quad[ 3 ].position = sf::Vector2f( i * tileSize.x,( j + 1 ) * tileSize.y ); quad[ 0 ].texCoords = sf::Vector2f( tu * tileSize.x, tv * tileSize.y ); quad[ 1 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x, tv * tileSize.y ); quad[ 2 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x,( tv + 1 ) * tileSize.y ); quad[ 3 ].texCoords = sf::Vector2f( tu * tileSize.x,( tv + 1 ) * tileSize.y ); } return true; } void TileMap::draw( sf::RenderTarget & target, sf::RenderStates states ) const { states.transform *= getTransform(); states.texture = & m_tileset; target.draw( m_vertices, states ); } |