Описание создания игры ("змейка")
Участников: 3
Страница 1 из 1
Описание создания игры ("змейка")
Описание создания игры ("змейка")
Дата: 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.
Дата: 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.
Re: Описание создания игры ("змейка")
а как исходник то скачать?
Wonder127- Сообщения : 1
Очки : 1
Репутация : 0
Дата регистрации : 2012-04-11
Re: Описание создания игры ("змейка")
Прикольно получается.
А как сделать так, чтоб после съедания бонуса, к змейке прибавлялся один сегмент тела, у меня получалось максимум 2 или один, а хотелось бы чтоб всегда один?
А как сделать так, чтоб после съедания бонуса, к змейке прибавлялся один сегмент тела, у меня получалось максимум 2 или один, а хотелось бы чтоб всегда один?
romanza21- Сообщения : 2
Очки : 2
Репутация : 0
Дата регистрации : 2012-07-15
Re: Описание создания игры ("змейка")
И кстати, в конце, в fscommand('quit', true); - должно быть "quit" , а не 'quit' .Иначе работать не будет!
romanza21- Сообщения : 2
Очки : 2
Репутация : 0
Дата регистрации : 2012-07-15
Похожие темы
» создания шаблона сайта с нуля
» ActionScript 3.0. Урок 7-5. Пример создания динамических объектов
» Урок 4 Руководство по созданию AS3 Flash игры – часть 2: монеты
» Урок 5 Новая тайловая основа движка игры – часть 2
» Урок 6 Руководство по созданию AS3 Flash игры – часть 3: стены
» ActionScript 3.0. Урок 7-5. Пример создания динамических объектов
» Урок 4 Руководство по созданию AS3 Flash игры – часть 2: монеты
» Урок 5 Новая тайловая основа движка игры – часть 2
» Урок 6 Руководство по созданию AS3 Flash игры – часть 3: стены
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|