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

  • Tutorial

В предыдущем посте я рассказал как рисовать картинки и, вроде как, объяснил, что к чему в 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


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

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

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

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 16

    0
    Простите конечно за сленг, но MOAR LUA ON HABR!!1
      0
      В каком виде и зачем? (:
        0
        Классный же язык, ведь, красивый. А проектов вроде love2d достаточно много, самому осилить — лень, а статью прочитал бы с восторгом
          0
          Можно изучать и без «проектов» же. Я использую Lua как «расширение» для С. Для обработки сложных текстов, к примеру. Когда парсеры все во внешнем файле — очень удобно дебажить без пересборки всего приложения.
        0
        Вижу вы любите ЛУА, скиньте плз в личку для начинающего, планирую писать на ЛУА под андройд используя фреймворк.
        +1
        Оффтоп
        Луа — нашка, отлично интегрируется в проект на с, чуть сложнее на с++. Отлично контролируется через C-API, очень гибкий.
          +2
          кажется, яблоко может случайно появиться внутри змейки!
            0
            Это не важно, суть статьи не в этом.
              +1
              Суть статьи — показать возможности фреимворка, а не змейки (:
                +1
                Змейка будет довольна
                  +1
                  Змеи не любят яблоки!
                0
                Вышла ж версия 0.9, самая главная фишка — нативная сеть! :) Теку от предчувствия!
                  +1
                  >> math.random() % width

                  функции math.random можно передать аргументы «от» и «до»
                  www.lua.org/manual/5.1/manual.html#pdf-math.random
                    0
                    Я знаю, в исходниках поменял, а тут чего-то паскаль нахлынул…
                      0
                      На скрине хорошо видно (:
                      0
                      Давно тема, но узнал о библиотеке только сегодня. В принципе для моих целей самое то.
                      Но вот проблема, при запуске на Linux Mint 17.2 у меня приложения тормозят.

                      Запускал как исходник так и откомпилированную версию.

                      Ни кто не подскажет, в чем может быть проблема. Может кто сталкивался. На офф. форуме поискал, не нашел ничего на эту тему. Карта NVidia дрова стоят.

                      Позже попробую попробую ещё под виндой.

                      Only users with full accounts can post comments. Log in, please.