Продолжаем изучать Love2d

от автора


В предыдущем посте я рассказал как рисовать картинки и, вроде как, объяснил, что к чему в love2d. Сегодня я решил написать змейку, всем, кому интересно, прошу под кат. Запускаем Sublime Text 2, как его настроить для love я говорил в прошлый раз, но сегодня мы будем использовать дебаг, но для этого нужно написать три лишних строки, а именно: Рядом с main.lua, в корне каталога проекта, создаем файл и называем его conf.lua. Этот файл предназначен для настроек игры. В нем пишем такой вот код:

function love.conf(t)--Функция которую вызывает love перед стартом приложения     io.stdout:setvbuf("no")--Из-за особенностей Sublime Text, точнее его консольки нужно вызывать эту функцию,                             --иначе все что мы выводим с помощью print(str) будет выведено после закрытия игры. end 

Подробнее об этой функции можно почитать здесь, и здесь.

Ну а теперь код

Подготовим переменные:

local apple, snake, direction, width, height, delay  function love.load() 	width = love.graphics.getWidth() / 10			--функция возвращает длину окна на данный момент 	print("Width " .. width)          				--дебаг вывод 	height = love.graphics.getHeight() /10			--тоже самое но с высотой 	print("Height " .. height) 	apple = { x = math.random() % width;			--теперь нам нужно яблоко генерируем X-координату 			  y = math.random() % height; } 		        --и Y.. 	snake = { } 						--инициализируем таблицу с координатами змейки 	for i = 1, 10 do 						--первые 10 клеток надо с чего-то начинать 		point = { x = 10;					--и снова X.. 				  y = 10 + i; }					--и Y.. 		table.insert(snake, point)				--вписываем в таблицу 	end 	direction = "up"						--змейка должна куда-то ползти 	delay = 0							--змейка не должна быть нервной end 

Вроде бы все объяснил, для тех кто хоть раз писал змейку должно быть понятно все.

Теперь нам нужно рисовать змейку (Пока что без яблока);

function love.draw() 	love.graphics.setBackgroundColor(0, 0, 0)		        --чистим экран 	for k, v in pairs(snake) do 			        --отрисовываем каждую клетку 		love.graphics.rectangle("fill", v.x * 10, v.y * 10, 10, 10) 	end end 

А теперь должны возникнуть вопросы, а именно:
1) А какого цвета будет змейка
2) (Менее интересный) Что это за функция love.graphics.rectangle?

Ответы:

1) Она будет рисоваться белым, этот цвет ставиться внутри сишного кода перед вызовом love.draw(). Если вам этот цвет можно поставить вот таким вот методом:

love.graphics.setColor(0, 0, 255)				--змея будет синей 

У этой функции четыре аргумента, но четвертый не является обязательным — это альфа цвета. Подробное описание вот здесь.
2) Как можно догадаться из названия, эта функция рисует четырехугольник цвета заданным этой функции. Первый аргумент — режим рисования, может быть «fine» или «line». Второй и третий аргумент координаты, Четвертый и пятый — размеры, подробно вот тут.

Можем продолжить

Ура! У нас есть неподвижная змейка, давайте потыкаем ее исправим это, напишем Update функцию:

function love.update(dt) 	if delay % 2 == 0 then						--лечим нервы 		table.remove(snake, table.getn(snake)) 				--убираем последний элемент и добавляем его в начало  		if direction == "up" then					--ну тут вроде все ясно, обрабатываем направление 			table.insert(snake, 1, { x = snake[1].x; 									 y = (snake[1].y - 1) % height; }) 		elseif direction == "down" then 			table.insert(snake, 1, { x = snake[1].x; 									 y = (snake[1].y + 1) % height; }) 		elseif direction == "left" then 			table.insert(snake, 1, { x = (snake[1].x - 1) % width; 									 y = snake[1].y; }) 		else 			table.insert(snake, 1, { x = (snake[1].x + 1) % width; 									 y = snake[1].y; }) 		end 	end 	delay = delay + 1 end 

Теперь у нас неуправляемая змейка, это тоже не то, чего мы добиваемся, так добавим власти:

function love.keypressed(key)						--здесь мы будем смотреть какая кнопка была нажата 																		--выглядит стремно, но правильно 	if key == "up" then 		direction = "up" 	elseif key == "down" then 		direction = "down" 	elseif key == "left" then 		direction = "left" 	elseif key == "right" then 		direction = "right" 	elseif key == "escape" then 		love.event.quit() 	end end 

Теперь мы управляем происходящим, но где цель? Добавим-же яблок:
Во-первых, яблоко у нас есть, но мы его не рисуем, добавим прорисовку в love.draw():

love.graphics.setColor(255, 255, 0)					--мне нравиться голд love.graphics.rectangle("fill", apple.x * 10, apple.y * 10, 10, 10) 

А теперь нам надо рости:

if delay % 2 == 0 then							--лечим нервы 	if apple.x == snake[1].x and 		apple.y == snake[1].y then 		apple = { x = math.random(width);		                --вот и поели, генерируем X-координату 				  y = math.random(height); } 	                        --и Y.. 	else 								--не сразу ясно, но понятно 		table.remove(snake, table.getn(snake)) 				--убираем последний элемент и добавляем его в начало 	end  	if direction == "up" then						--ну тут вроде все ясно, обрабатываем направление 		table.insert(snake, 1, { x = snake[1].x; 								 y = (snake[1].y - 1) % height; }) 	elseif direction == "down" then 		table.insert(snake, 1, { x = snake[1].x; 								 y = (snake[1].y + 1) % height; }) 	elseif direction == "left" then 		table.insert(snake, 1, { x = (snake[1].x - 1) % width; 								 y = snake[1].y; }) 	else 		table.insert(snake, 1, { x = (snake[1].x + 1) % width; 								 y = snake[1].y; }) 	end end delay = delay + 1 

Ползаем, контролируем, поедаем, все готово!

Спасибо, за прочтение.
Исходники, с небольшим аддономом.

Буду благодарен за любые отзывы (:

ссылка на оригинал статьи http://habrahabr.ru/post/203082/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *