Помогите пожалуйста!
Начал изучать графическую библиотеку SFML по видео уроку,но у меня неправильно отресовывается массив.
В чем может быть ошибка?
Вот код:
Код
#include <SFML/Graphics.hpp>//подключаем модуль graphics
using namespace sf;
int ground=500;
const int H=12;
const int W=40;
String TileMap[H]=
{
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
"BOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOB",
"B O B",
"B O B",
"B O B",
"B O B",
"B O B",
"B B",
"B B",
"B BB BBBBBB B",
"B BB BBBBBB B",
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
};
class PLAYER{
public:
float dx,dy;
FloatRect rect;
bool onGround;
Sprite sprite;
float currentFrame;
PLAYER(Texture &image)
{
sprite.setTexture(image);
rect=FloatRect(32,32,40,50);
dx=dy=0;
currentFrame=0;
}
void update(float time)
{
rect.left+=dx*time;
Collision(0);
if(!onGround) dy=dy+0.0005*time;
rect.top+=dy*time;
onGround=false;
Collision(1);
currentFrame+=0.0005*time;
if(currentFrame>6) currentFrame-=6;
if(dx>0) sprite.setTextureRect(IntRect(40*int(currentFrame),244,40,50));
if(dx<0) sprite.setTextureRect(IntRect(40*int(currentFrame)+40,244,-40,50));
sprite.setPosition(rect.left,rect.top);
dx=0;
}
void Collision(int dir)
{
for(int i=rect.top/16;i<(rect.top+rect.height)/16;i++)
for(int j=rect.left/16;j<(rect.left+rect.width)/16;j++)
{
if(TileMap[i][j] =='B')
{
if((dx>0) && (dir==0))rect.left=j*16-rect.width;
if((dx<0) && (dir==0))rect.left=j*16+16;
if((dy>0) && (dir==1)) {rect.top=i*16-rect.height;dy=0;onGround=true;}
if((dy<0) && (dir==1)) {rect.top=i*16+16;dy=0;}
}
if(TileMap[i][j]=='O')
{
TileMap[i][j]=' ';
}
}
}
};
int main()
{
RenderWindow window(sf::VideoMode(600,400), "Tect");//Создаем окно размером 200х200 с заголовком "Тест"
Texture t;//создаем техстуру
t.loadFromFile("fff.png");//загружаем картинку
float currentFrame=0;
PLAYER p(t);
Clock clock;
RectangleShape rectangle(Vector2f(16.0,16.0));
while (window.isOpen())//главный цикл программы, работает, пока окно открыто
{
float time = clock.getElapsedTime().asMicroseconds();
clock.restart();
time=time/800;
sf::Event event;//создаем очередь событий
while (window.pollEvent(event))//цикл работает, пока очередь событий не пуста
{
if (event.type == sf::Event::Closed)//если жмем крестик
window.close();//то окно закрывается
}
if(Keyboard::isKeyPressed(Keyboard::Left))
{
p.dx=-0.1;
}
if(Keyboard::isKeyPressed(Keyboard::Right))
{
p.dx=0.1;
}
if(Keyboard::isKeyPressed(Keyboard::Up))
{
if(p.onGround) {p.dy=-0.4; p.onGround=false;}
}
p.update(time);
window.clear();//очистка экрана
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
{
if(TileMap[i][j] =='B') rectangle.setFillColor(Color::Blue);
if(TileMap[i][j] =='O') rectangle.setFillColor(Color::Red);
if(TileMap[i][j] ==' ') continue;
rectangle.setPosition(i*16,j*16);
rectangle.setSize(Vector2f(16.0,16.0));
window.draw(rectangle);//отрисовка квадрата
}
window.draw(p.sprite);//отрисовка спрайта
window.display();//отрисовка окна
}
return 0;
}
Вот что получается:
ссылка
Пишу в VC 2010C++ Express
Хотя спрайт взаимодействует с картой правильно