pekfos |
» 2014-09-07 21:27:05 Mało. |
|
informatykos Temat założony przez niniejszego użytkownika |
» 2014-09-07 21:49:57 Tutaj jest jeszcze klasa do rysowania mapy. Z tego co patrzyłem to właśnie engine i TileMap są istotne bo gdy wyrzucimy target.draw(m_vertices, states); - z jednej z funkcji TileMap lub oknoAplikacji.draw( map ); - Enginu. To zaczyna wtedy postać chodzić gładko. #pragma once #include <SFML\Graphics.hpp> #include <string> #include <vector>
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 ) { 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; } private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const { states.transform *= getTransform(); states.texture = & m_tileset; target.draw( m_vertices, states ); } sf::VertexArray m_vertices; sf::Texture m_tileset; }; |
|
pekfos |
» 2014-09-07 22:05:47 if( zegar.getElapsedTime() > sf::seconds( 0.1 ) ) { player.update(); zegar.restart(); }
|
Na pewno powinien być tu ten warunek? Próbuj też wywalić wywołanie setFramerateLimit(). |
|
informatykos Temat założony przez niniejszego użytkownika |
» 2014-09-07 22:09:17 Nawet jak wyrzucę ten warunek i setFramerateLimit() to dalej tnie. A właśnie, SFML powinien obsłużyć na spokojnie tyle kafelków prawda? |
|
pekfos |
» 2014-09-07 22:12:29 A właśnie, SFML powinien obsłużyć na spokojnie tyle kafelków prawda? |
Powinien. Co rozumiesz przez 'tnie'? Mało fps? Jakiś konkretny element nie działa płynnie? |
|
informatykos Temat założony przez niniejszego użytkownika |
» 2014-09-07 22:20:32 hm.. to jest właśnie chyba za mało FPS'ów. Kiedy ruszam postacią na mapie zapełnionej kafelkami to postać nie porusza się płynnie. Kiedy ruszam nią w bok i kamera (View) rusza się wraz z postacią to widać że gdy jest np 3/4 kafli jeszcze na scenie to te kafle też nie "uciekają" na bok płynnie jak i postać. Kiedy na scenie zostaje 1/4 kafelków (3/4 jest już poza widokiem ekranu) to postać porusza się już płynnie, tak samo jak kafelki. |
|
pekfos |
» 2014-09-07 22:30:03 Pokaż kod klasy Player. |
|
informatykos Temat założony przez niniejszego użytkownika |
» 2014-09-07 22:45:58 Plik nagłówkowy: #pragma once #include <SFML\Graphics.hpp> #include <vector>
class Player : public sf::Drawable , public sf::Transformable { public: sf::Sprite sprite; sf::Texture texture; Player( void ); enum Status { IDZ, STOJ }; Status getStatus(); int x; int y; float pos_x; float pos_y; int zycie; int sila; void idz( float a, float b ); void update(); void stop(); protected: int klatka_animacji; private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const { target.draw( sprite ); } Status status; sf::Clock anim_clock; float speed; size_t frame; }; Plik cpp: #include "Player.h" #include <Windows.h> #include "Engine.h" #include <math.h> #include <iostream>
#define M_PI 3.14159265358979323846
Player::Player( void ) { texture.loadFromFile( "player.png" ); pos_x = 0; pos_y = 500; sprite.setTexture( texture ); sprite.setPosition( sf::Vector2f( pos_x, pos_y ) ); sprite.setTextureRect( sf::IntRect( 0, 0, 64, 64 ) ); status = STOJ; frame = 0; speed = 1.5; }
void Player::idz( float a, float b ) { status = IDZ; sprite.move( a, b ); pos_x += a; pos_y += b; }
void Player::update() { if( anim_clock.getElapsedTime() > sf::seconds( 0.09f ) ) { if( status == STOJ ) return; if( frame < 7 ) frame++; else frame = 0; sprite.setTextureRect( sf::IntRect( frame * 64, 0, 64, 64 ) ); anim_clock.restart(); } }
void Player::stop() { status = STOJ; frame = 0; } |
|
1 « 2 » 3 |