Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2013, 17:29   #1
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию Игра на C++

Ребята, подскажите в чём проблема? Программирую в Visual Studio Express 2012 для Windows Desktop. Работала нормально программа, персонаж бегал вперёд и назад. Когда дописал текстуры, почему-то перестала работать и вылазит такая ошибка.

Вот код:
Код:
#include <SFML/Graphics.hpp>

using namespace sf;

float offsetX=0, offsetY=0;

int ground =400;

const int H=12;
const int W=40;

String TileMap[H] = {
	"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
	"B						B			    B",
	"B						B			    B",
	"B						B			    B",
	"B						B			    B",
	"B					BBBBB			    B",
	"B	0000				B		  	    B",
	"B						B			    B",
	"B		BBB	           BBB			    B",
	"BBB			BBB						B",
	"B				BBB			BB		    B",
	"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
};

class Player
{
public:
	float dx,dy;
	FloatRect rect;
	bool onGround;
	Sprite sprite;
	float currentFrame;

	Player(Texture &Image)
	{
		sprite.setTexture(Image);
		rect = FloatRect(0,0,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.005*time;
		if (currentFrame > 6) currentFrame -=6;
		if (dx>0) sprite.setTextureRect(IntRect(42*int(currentFrame),0,42,51));
		if (dx<0) sprite.setTextureRect(IntRect(42*int(currentFrame)+42,0,-42,51));

		sprite.setPosition(rect.left-offsetX, rect.top-offsetY);
		dx=0;
}

void Collision(int dir)
{
for (int i=rect.top/32; i<(rect.top+rect.height)/32; i++)
for (int j=rect.left/32; j<(rect.left+rect.width)/32; j++)
		{
		if (TileMap[i][j] == 'B')
			{
				if ((dx>0) && (dir==0)) rect.left = j*32 - rect.width;
				if ((dx<0) && (dir==0)) rect.left = j*32 +32;
				if ((dy>0) && (dir==1)) {rect.top = i*32 - rect.height; dx=0; onGround=true;}
				if ((dy<0) && (dir==1)) {rect.top = i*32 +32; dy=0;}
			}

				if (TileMap[i][j]=='0')
				{
					TileMap[i][j]=' ';
				}

		}
}
};


int main()
{
	RenderWindow window(VideoMode(640, 480), "Test");//название окна и его размер

	Texture t; //создаём текстуру
	t.loadFromFile("anim.png"); //загружаем картинку

	float currentFrame=0; //переменная в которой хранится номер текущего кадра

	Player p(t);

	Clock clock;

	RectangleShape rectangle;

	while (window.isOpen())//пока окно открыто
	{
		float time = clock.getElapsedTime().asMicroseconds();
		clock.restart();

		time=time/800;

		Event event;
		while (window.pollEvent(event))
		{
			if (event.type == 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);

		offsetX=p.rect.left - 640/2;
		offsetY=p.rect.top - 480/2;

		window.clear(Color::White);

		for (int i=0; i<H; i++)
			for (int j=0; j<W; j++)
			{
				if (TileMap[i][j] =='B') rectangle.setFillColor(Color::Black);
				if (TileMap[i][j] =='0') rectangle.setFillColor(Color::Red);
				if (TileMap[i][j] ==' ') continue;

				rectangle.setPosition(j*32-offsetX, i*32-offsetY);
				window.draw(rectangle);

			}

		window.draw(p.sprite);
		window.display();
	}

	return 0;
}
Изображения
Тип файла: jpg NoName.jpg (32.2 Кб, 90 просмотров)
Это вам не это

Последний раз редактировалось Stilet; 21.10.2013 в 17:42.
25-й кадр вне форума Ответить с цитированием
Старый 21.10.2013, 17:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Где-то у тебя для TileMap[i][j] переменные i j выводят за пределы строки.
Ставь там условия, которые не дадут обращаться к этому массиву, если эти переменки слишком большие для него
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2013, 17:54   #3
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

По ходу, я Вас не понял, голова не варит, не можете подробнее объяснить где и что? Самое странное, что писал по видео код, там всё работает, а у меня, почему-то, ошибка вылезла, хотя повторил всё, кроме размера экрана (640х480) и размер картинки на пару пикселей другой. Но, это не должно сути то сыграть...
Это вам не это
25-й кадр вне форума Ответить с цитированием
Старый 21.10.2013, 19:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Эх-ма... Вот что я имею ввиду:
Опиши функцию, которая будет проверять выброс за пределы линии лабиринта:
Код:
bool MapCheck(int i,int j,char c) {
  if(i>=0 && i<h && strlen(TileMap[i])>j) return TileMap[i][j] == c;
  else {
    Выводим на экран гневное сообщение о том что координаты i или j выпадают за пределы строки, в которой проверяется символ
  }
}
И дальше применяй ее так:
Код:
			for (int j=0; j<W; j++)
			{
				if (MapCheck(i,j,'B')) rectangle.setFillColor(Color::Black);
				if (MapCheck(i,j,'0')) rectangle.setFillColor(Color::Red);
				if (MapCheck(i,j,' ')) continue;

				rectangle.setPosition(j*32-offsetX, i*32-offsetY);
				window.draw(rectangle);

			}
А все потому что у тебя размеры строк в матрице лабиринта не одинаковы, а их ты не проверяешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2013, 12:15   #5
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

Не сообразил с Вашим примером, ну да ладно.

Вот код:

Код:
include <SFML\Graphics.hpp>


using namespace sf;

int ground = 150;

const int H=12;
const int W=12;

String TileMap[H] = {
	"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
	"B                                     BB",
	"B                                     BB",
	"BB                                     B",
	"BB                                     B",
	"B                           BBBBB      B",
	"B    0000                 BBB          B",
	"BB                                     B",
	"BBB                      BBBB          B",
	"BBB                            BBB     B",
	"B                           BBBBB      B",
	"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
};

class Player
{
public:
	float dx,dy;
	FloatRect rect;
	bool onGround;
	Sprite sprite;
	float currentFrame;

	Player(Texture &image)
	{
		sprite.setTexture(image);
		rect = FloatRect(0,0,40,50);

		dx=dy=0;
		currentFrame=0;
	}



void update(float time)
{
		rect.left += dx*time;
		

		if (!onGround) dy=dy+0.0005*time;
		rect.top +=dy*time;
		onGround=false;

		

		if (rect.top > ground) {rect.top = ground; dy=0; onGround = true;}


		currentFrame += 0.005*time;
			if (currentFrame > 6) currentFrame -=6;

		
		if (dx>0) sprite.setTextureRect(IntRect(40*int(currentFrame),0,40,50));
		if (dx<0) sprite.setTextureRect(IntRect(40*int(currentFrame)+40,0,-40,50));

		sprite.setPosition(rect.left, rect.top);

		dx=0;
}

};

int main()
{
	RenderWindow window( VideoMode(600, 400), "Test!");


	Texture t;
	t.loadFromFile("maybe.png");

	float currentFrame=0;

	Player p(t);


	Clock clock;

	RectangleShape rectangle(Vector2f(32,32));
	

	while (window.isOpen())
	{

		float time=clock.getElapsedTime().asMicroseconds();
		clock.restart();
		time=time/800;

		Event event;
		while (window.pollEvent(event))
		{
			if (event.type == 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(Color::White);

		for (int i=0; i<W; i++)
			for (int j=0; j<H; j++)
			{
				if (TileMap[i][j] =='B') rectangle.setFillColor(Color::Blue);
				if (TileMap[i][j] =='0') rectangle.setFillColor(Color::Red);
				if (TileMap[i][j] ==' ') continue;

				rectangle.setPosition(j,i);
				window.draw(rectangle);
			}



		window.draw(p.sprite);
		window.display();

	}

	return 0;

}


Вот когда H и W делаю по 12, то отображается синий квадратик. Если делаю W=13, то уже ошибка, как будто координаты отсчитываются из другого места, а, как я помню, начало координат(x=0, y=0), это левый верхний угол монитора. x положительный, y отрицательный считается.



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.
Изображения
Тип файла: jpg NoName1.jpg (96.3 Кб, 115 просмотров)
Это вам не это

Последний раз редактировалось Serge_Bliznykov; 23.10.2013 в 12:40.
25-й кадр вне форума Ответить с цитированием
Старый 23.10.2013, 12:20   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,371
По умолчанию

Когда делаете W == 13 то в массив TileMap добавляется последний элемент, который будет пустой строкой.
waleri вне форума Ответить с цитированием
Старый 23.10.2013, 12:39   #7
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

Разобрался, начал рисовать. Но прикол в том, что H он читает как длину, а W, как высоту, хотя должно быть наоборот.
Это вам не это
25-й кадр вне форума Ответить с цитированием
Старый 23.10.2013, 13:48   #8
25-й кадр
Человек
Форумчанин
 
Регистрация: 04.04.2011
Сообщений: 178
По умолчанию

Всё заработало, всем спасибо!
Это вам не это
25-й кадр вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра apelsun Общие вопросы Delphi 2 16.11.2012 09:12
Игра Шайен Помощь студентам 4 24.05.2011 16:47
Игра Кристинка89 C++ Builder 2 17.03.2011 01:39
Игра 37 Kanibalus Фриланс 2 17.01.2010 23:04
Игра DimR Фриланс 5 19.11.2009 19:12