ИГРОДЕЛ
Войдите на сайт или зарегистрируйтесь!!!

Описание создания игры ("змейка")

Перейти вниз

Описание создания игры ("змейка")

Сообщение автор Admin в Вс Фев 21, 2010 4:36 am

Описание создания игры ("змейка")
Дата: 2 июня 2009 Категория: Уроки по Flash Просмотров: 634 Коментариев: 0

Все мы наверное играли в игру "змейка", но для тех, кто не играл в нее - опишу кратко смысл игры. По полю бегает змейка и поедает ягодки и растет в длину. Цель игры - накормить змейку до максимальной длинны. Если змейка съедает кусочек своего хвоста - игра заканчивается.


скачать исходник


вот что должно получиться в конце урока





Как это будет работать:

Координаты(X и Y) всех сегментов тела змейки будут храниться в 2х массивах, соответственно для X и Y. Змейка будет бегать по полю с размерами клетки 20*20. При перемещении головы змейки в новую клетку - записываем массив ее старое положение и присваиваем эти координаты первому сегменту тела змейки, а следующему за ним сегменту, присваиваем положение сегмента который стоит в массиве перед ним, и так по цепочке всему телу змейки.После каждого движения проверяем не столкнулась ли голова змейки с одним из сегментов своего тела. Также проверяем после каждого хода не столкнулась ли змейка с едой, если столкнулась - прибавляем новые сегменты в координаты последнего сегмента в теле змейки.

Используемые функции:



duplicateMovieClip(target, newname, depth)
Эта функция создает на сцене копию указанного мувика.
target – мувик который мы будем дублировать
newname – имя которое будет присвоено дублированному мувику
depth – глубина дублированного мувика

target1.hitTest(target2)
Эта функция проверяет столкнулся ли объект target1 с объектом target2.
target1.hitTest (target2.x, target2.y)
Эта функция проверяет столкновение объекта target1 с объектом target2, в координатаx x,y.

for(i=0;i<10;i++){
trace(i)
}


Оператор for – выполняет цикл, пока переменная i<10. Меняя значение “i<N” можно установить любую длину цикла.

Слои:



actions; snake; bonus;







Объекты:



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

snake_head - голова змейки.

snake_body - сегмент тела змейки.

bonus - бонус который змейка будет кушать.







Для начала создаем объекты указанные выше и слои для их размещения. При рисовании сегмента тела змейки и головы важно чтобы их размеры не превышали одну клетку сетки, иначе возможны ошибки при проверки столкновений. Для удобства следует включить сетку (Ctrl+Al+G) затем поставить голочку на "Show grind" и установить ее размер на 20*20. Можно также включить режим "прилипания" объектов к сетке (Snap to grid).







Затем присваиваем объектам одноименные имена (actions -actions, snake_head - snake_head и т.д. ). Лучше всего разметить все обекты в линию, в верхнем левом углу, за границей кадра.







КОД объекта actions:



//**//Для начала в объекта actions установим голову змейки в центр поля. Потом создаем 2 массива в которых будут храниться координаты //**//сегментов змейки.

//**// Действия которые выполняются при загрузке объекта
onClipEvent (load) {
//**//Переменная в которой храниться количество сегментов тела змейки
body_count = 0;
//**//Переменная необходимая для паузы в движении змейки
move_timer=getTimer();
//**//Переменная необходимая для паузы при создании бонусов
bonus_timer=getTimer();
//**//Переменная которая указывает создан ли бонус или нет.
bonus_exist = 0;
//**//Устанавливаем голову змейки в центр игрового поля
_root.snake_head._x = 290;
_root.snake_head._y = 250;
//**//Создаем массивы в которых будем хранить координаты тела змейки
var cell_x:Array = new Array();
var cell_y:Array = new Array();

//**// Затем методом дубликации создадим начальный хвост для змейки, и вписываем координаты каждого сегмента в массивы.

//**//Создание хвоста змейки циклом от 1 до 7
for (i=1; i<7; i++) {
duplicateMovieClip(_root.snake_body, 'snake_body'+i, i);
//**//Расстановка сегментов хвоста на поле, снизу головы змейки
_root['snake_body'+i]._x = _root.snake_head._x;
_root['snake_body'+i]._y = _root.snake_head._y+(i*20);
//**//Вписываем в массив новые переменные
cell_x[i+1] = _root['snake_body'+i]._x;
cell_y[i+1] = _root['snake_body'+i]._y;
//**//Записываем в переменной количество сегментов тела
body_count++;
}}

//**//Затем добавим код, который будет управлять движением змейки, он очень прост, при нажатии на кнопку управления - голова змейки //**//меняет свое направление.

//**//Блок управления движением змейки при нажатии кнопки - змейка меняет направление
on (keyPress "<Left>") {
_root.snake_head._rotation = -90;
}
on (keyPress "<Right>") {
_root.snake_head._rotation = 90;
}
on (keyPress "<Up>") {
_root.snake_head._rotation = 0;
}
on (keyPress "<Down>") {
_root.snake_head._rotation = 180;
}

//**//Для движения змейки, появления бонусов, проверки столкновений, испольуем событие которое будет проверяться каждый кадр //**//мувика(onClipEvent (enterFrame)). Напишем код который будет дублировать мувик бонуса и размещать его в случайном месте на сцене, //**//перед дубликацией мувика проверяется тайме и переменная которая указывает создан бонус или нет, это нужно для того чтобы на //**//сцене размещался только 1 бонус.

onClipEvent (enterFrame) {
//**//Создание бонусов.
//**//Проверяем, если таймер меньше и переменная указывает что бонуса не создано - создаем бонус.
if (getTimer()-bonus_timer>500 && !bonus_exist) {
//**//Дублируем клип, присваиваем ему имя
duplicateMovieClip(_root.bonus, 'bonus_real', 1000);
//**//Устанавливаем случайные координаты для дублированного бонуса
_root.bonus_real._x = random(30)*20+10;
_root.bonus_real._y = random(25)*20+10;
//**//Ставим в переменной что бонус создан.
bonus_exist = 1;
}

//**//Движение тела змейки по клеткам с проверкой таймера, для создания задержки и вписывание новых данных в массивы


//**//Движение змейки
//**//Проверяем таймер, для движения с задержкой.
if (getTimer()-move_timer>170) {
//**//Обновление таймера движения.
move_timer = getTimer();
//**//вписываем в массив координаты головы змейки
cell_x[1] = _root.snake_head._x;
cell_y[1] = _root.snake_head._y;
//**//Движение головы змейки в клетку по направлению(_rotation)
_root.snake_head._x += 20*Math.sin(_root.snake_head._rotation*(Math.PI/180));
_root.snake_head._y -= 20*Math.cos(_root.snake_head._rotation*(Math.PI/180));
//**//Запись циклом сегментов тела змейки в массивы
for (i=1; i<body_count+1; i++) {
_root['snake_body'+i]._x = cell_x[i];
_root['snake_body'+i]._y = cell_y[i];
}
//**//Передвижение циклом всех сегментов тела змейки в вышестоящую ячейку массива.
for (i=1; i<body_count+1; i++) {
cell_x[i+1] = _root['snake_body'+i]._x;
cell_y[i+1] = _root['snake_body'+i]._y;
}

//**//Проверку столкновения головы змейки с бонусом, осуществяется встроенной функцией Flash - hitTest(), если столкновение произошло //**//- дублируем для тела змейки новые сегменты и устанавливаем им позицию в хвосте змейки на место последнего сегмента, при //**//последующем движении змейки - они будут следовать за ней, и вписывать свои координаты в массивы.


//**//Проверка столкновения головы змейки с бонусом методом HitTest`а и добавление новых сегментов к телу змейки
if (_root.snake_head.hitTest(_root.bonus_real._x, _root.bonus_real._y)) {
trace('Bonus eat, you grow!');
removeMovieClip(_root.bonus_real);
//**//Устанавливаем переменную, что бонус съеден и обновляем таймер для создания нового бонуса
bonus_exist = 0;
bonus_timer = getTimer();
//**//Добавляем циклом новые сегменты тела к змейке на последний сегмент тела и увеличиваем переменную отвечающую за длину тела.
for (i=0; i<4; i++) {
duplicateMovieClip(_root.snake_body, 'snake_body'+body_count, body_count);
body_count++;
_root['snake_body'+body_count]._x = _root['snake_body'+(body_count-1)]._x;
_root['snake_body'+body_count]._y = _root['snake_body'+(body_count-1)]._y;
cell_x[body_count] = _root['snake_body'+body_count]._x;
cell_y[body_count] = _root['snake_body'+body_count]._y;
}
}

//**//Проверка столкновения головы змейки с телом осуществляется циклом с функцией hitTest(), циклом проверяются все сегменты змейки //**//на столкновение с головой. Если столкновение произошло - функцией fscommand осуществляется закрытие мувика.

//Проверка столкновения головы с сегментами тела HitTest`ом
for (i=0; i<body_count+1; i++) {
//**//Если столкновение произошло - выводим сообщение и закрываем мувик.
if (_root.snake_head.hitTest(_root['snake_body'+i]._x, _root['snake_body'+i]._y, 0)) {
trace('You eat your body. Cannibal !');
fscommand('quit', true);
}
}
}
}




Вы можете просто скопировать данный код и вставить его в объект actions.
avatar
Admin
Admin

Сообщения : 92
Очки : 280
Репутация : 36
Дата регистрации : 2010-02-20

Посмотреть профиль http://game-dll.mirbb.net

Вернуться к началу Перейти вниз

Re: Описание создания игры ("змейка")

Сообщение автор Wonder127 в Сб Апр 14, 2012 7:22 pm

а как исходник то скачать?

Wonder127

Сообщения : 1
Очки : 1
Репутация : 0
Дата регистрации : 2012-04-11

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Описание создания игры ("змейка")

Сообщение автор romanza21 в Пн Июл 16, 2012 12:22 am

Прикольно получается.
А как сделать так, чтоб после съедания бонуса, к змейке прибавлялся один сегмент тела, у меня получалось максимум 2 или один, а хотелось бы чтоб всегда один?

romanza21

Сообщения : 2
Очки : 2
Репутация : 0
Дата регистрации : 2012-07-15

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Описание создания игры ("змейка")

Сообщение автор romanza21 в Пн Июл 16, 2012 2:01 pm

И кстати, в конце, в fscommand('quit', true); - должно быть "quit" , а не 'quit' .Иначе работать не будет!

romanza21

Сообщения : 2
Очки : 2
Репутация : 0
Дата регистрации : 2012-07-15

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Описание создания игры ("змейка")

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения