Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.05.2006, 01:28
writerer вне форума Посмотреть профиль Отправить личное сообщение для writerer Найти все сообщения от writerer
  № 1  
Ответить с цитированием
writerer

Регистрация: May 2006
Сообщений: 41
Отправить сообщение для writerer с помощью ICQ
Thumbs up Изометрия и механизм определения столкновения в играх

Здравствуйте!
Каков принцип написания подобных вещей:
в изометрии представлено некое пространство и там клавишами курсора перевигаем объект, а из хмл грузится инфа о том, где есть какие стены или другие объекты, и этот наш объект знает что нельзя пройти сквозь стену и пр.
---------
хотелось бы хотябы в общих чертах. или может какие примеры есть или сырцы


Последний раз редактировалось writerer; 22.05.2006 в 22:36.
Старый 22.05.2006, 01:37
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
ну например так
Код:
this._y += 40;

{/* Шаблон пола */ 
	this.createEmptyMovieClip ("p", 0);
	p.createEmptyMovieClip ("p0", 0);
	p.p0._alpha = 25;
	p.p0.lineStyle (0, 0xCFCFCF);
	p.p0.beginFill (0x9F9F9F, 100);
		p.p0.moveTo (0, -20);
		p.p0.lineTo (40, 0);
		p.p0.lineTo (0, 20);
		p.p0.lineTo (-40, 0);
		p.p0.lineTo (0, -20);
	p.p0.endFill ();
}
{/* Шаблон стены */
	this.createEmptyMovieClip ("w", 2);
	w.createEmptyMovieClip ("w0", 0);
	w.w0._alpha = 50;
	w.w0.lineStyle (0, 0x666666);
	w.w0.beginFill (0xB6DADA, 100);
		w.w0.moveTo (0, -40);
		w.w0.lineTo (40, -20);
		w.w0.lineTo (0, 0);
		w.w0.lineTo (-40, -20);
		w.w0.lineTo (0, -40);
	w.w0.endFill ();
	
	w.w0.beginFill (0x7CBEBD, 100);
		w.w0.moveTo (0, 0);
		w.w0.lineTo (40, -20);
		w.w0.lineTo (40, 0);
		w.w0.lineTo (0, 20);
		w.w0.lineTo (0, 0);
	w.w0.endFill ();
	
	w.w0.beginFill (0x99CCCC, 100);
		w.w0.moveTo (0, 0);
		w.w0.lineTo (-40, -20);
		w.w0.lineTo (-40, 0);
		w.w0.lineTo (0, 20);
		w.w0.lineTo (0, 0);
	w.w0.endFill ();
	w.w0.duplicateMovieClip("m",1500);
	new Color (w.m).setTransform ({gb:-153, bb:-246});
	w.m._alpha = 100
}

a = []; gb = []
for (i = 0; i < 10; i++){
	a[i] = [];
	for (j = 0; j < 10; j++) {
		a[i][j] = 1;
		if (!(i == 0 and j == 0)) {
			p.p0.duplicateMovieClip ("p" + (i * 10 + j), i * 10 + j);
			bb = random (20);
			if ((i == 0 or j == 0 or i == 9 or j == 9 or bb < 3) and !(i == 1 and j == 1)) {
				a[i][j] = 1;
				w.w0.duplicateMovieClip ("w" + (i * 10 + j), j * 10 - i);
			} else if (bb == 5){
				p["p" + (i * 10 + j)]._alpha = 100;
				a[i][j] = 2;
			} else {
				gb[gb.length] = [40 + i * 40 + j * 40,200 - i * 20 + j * 20]
				a[i][j] = 0;
			}
		}
		p["p" + (i * 10 + j)]._x = w["w" + (i * 10 + j)]._x = 40 + i * 40 + j * 40;
		p["p" + (i * 10 + j)]._y = w["w" + (i * 10 + j)]._y = 200 - i * 20 + j * 20;
	}
}
k = [];
k[37] = [-40, 20];
k[38] = [-40, -20];
k[39] = [40, -20];
k[40] = [40, 20];
w.m._x = 120;
w.m._y = 200;
w.m.swapDepths ((2 * w.m._y + w.m._x - 440) / 8 - (2 * w.m._y + w.m._x - 440) / 80 + (w.m._y - 200) / 20);
w.m.onKeyUp = function () {
	if (k[Key.getCode ()] and a[(2 * (this._y + k[Key.getCode ()][1]) + (this._x + k[Key.getCode ()][0]) - 440) / 80 - ((this._y+ k[Key.getCode ()][1]) - 200) / 20][(2 * (this._y + k[Key.getCode ()][1]) + (this._x + k[Key.getCode ()][0]) - 440) / 80] != 1) {
		this._x += k[Key.getCode ()][0];
		this._y += k[Key.getCode ()][1];
		if (a[(2 * this._y + this._x - 440) / 80 - (this._y - 200) / 20][(2 * this._y + this._x - 440) / 80] == 2) {
			r = random (gb.length);
			this._x = gb[r][0];
			this._y = gb[r][1];
		}
		this.swapDepths ((2 * this._y + this._x - 440) / 8 - (2 * this._y + this._x - 440) / 80 + (this._y - 200) / 20);
	}
	
}
Key.addListener (w.m);
по скольку данный код был адаптирован под конкурс swf<1024 байта, то сжимал все что только можно было
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 22.05.2006, 14:52
Cvazimodo вне форума Посмотреть профиль Отправить личное сообщение для Cvazimodo Найти все сообщения от Cvazimodo
  № 3  
Ответить с цитированием
Cvazimodo

Регистрация: Jan 2003
Сообщений: 365
http://vl.nn.ru/graf/test_graf.html
Вчера только повернул карту (изометрия).

Старый 22.05.2006, 22:35
writerer вне форума Посмотреть профиль Отправить личное сообщение для writerer Найти все сообщения от writerer
  № 4  
Ответить с цитированием
writerer

Регистрация: May 2006
Сообщений: 41
Отправить сообщение для writerer с помощью ICQ
to iNils:
Спасиба. буду разбираться....
если можно хотябы немножко коментариев добавьте ))

to Cvazimodo:
красива...
а может кто-нибудь ещё набросает алгоритм ... вкратце так .. ))

Старый 22.05.2006, 23:03
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 5  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от writerer
если можно хотябы немножко коментариев добавьте ))
http://www.flasher.ru/forum/showthre...ghlight=offset
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 22.05.2006, 23:59
Cvazimodo вне форума Посмотреть профиль Отправить личное сообщение для Cvazimodo Найти все сообщения от Cvazimodo
  № 6  
Ответить с цитированием
Cvazimodo

Регистрация: Jan 2003
Сообщений: 365
Я делаю так (в моём примере):
есть админка для рисования карт, там каждой клетке соответствуют 8 клеток соседей (это максимум; для крайних клеток, естественно, меньше). Сохраняется в виде XML (как не буду говорить, это понятно).
Для тех клеток, на которых есть препятствие я не ставлю ссылки на "соседей" и от "соседей", соответственно, на эту клетку тоже не ставлю ссылку.
Это всё идёт в клиентскую часть. Есть массив (одномерный) объектов, типа:

var Relations:Array = new Array();
Relations[0].id = "cell_10"; // уникальное имя для ячейки. зачем делал - не помню
Relations[0].children = new Array(); // массив "соседей" - клеток, на которые я могу перейти.
Relations[0].children[0].id // уникальное имя для ячейки-соседа

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

Старый 23.05.2006, 00:04
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 7  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Не понятно зачем хранить ссылки на соседей, они и так ясны.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 23.05.2006, 12:00
Cvazimodo вне форума Посмотреть профиль Отправить личное сообщение для Cvazimodo Найти все сообщения от Cvazimodo
  № 8  
Ответить с цитированием
Cvazimodo

Регистрация: Jan 2003
Сообщений: 365
Цитата:
Сообщение от iNils
Не понятно зачем хранить ссылки на соседей, они и так ясны.
Если рядом стоит стена, то ссылки на неё нет, соответственно эта ячейка и не проверяется. Примерно 35% ячеек заставлены (в моём примере), соответственно во всех циклах меньшее количество клеток идёт на проверку. Якобы быстрее... (не факт).
К тому же, у меня одномерный массив, в нём тяжело определить ряд и колонку Все координаты этих ячеек формируются один раз в админке (при рисовании карты) и в клиенте просто подгружаются в указанные места без дополнительных расчетов.
К тому же, используя систему "ячейка-сосед" можно делать большие переходы (ака телепортация)...

В общем, мне так захотелось, это моя первая работа в подобном направлении, возможно и не самая правильная.

Старый 23.05.2006, 12:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 9  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от Cvazimodo
Если рядом стоит стена, то ссылки на неё нет, соответственно эта ячейка и не проверяется. Примерно 35% ячеек заставлены (в моём примере), соответственно во всех циклах меньшее количество клеток идёт на проверку. Якобы быстрее... (не факт).
К тому же, у меня одномерный массив, в нём тяжело определить ряд и колонку Все координаты этих ячеек формируются один раз в админке (при рисовании карты) и в клиенте просто подгружаются в указанные места без дополнительных расчетов.
К тому же, используя систему "ячейка-сосед" можно делать большие переходы (ака телепортация)...

В общем, мне так захотелось, это моя первая работа в подобном направлении, возможно и не самая правильная.
Посмотри мой пример в посте 2, при минимуме кода, там даже телепорты есть и проверки на стены.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 23.05.2006, 14:09
Cvazimodo вне форума Посмотреть профиль Отправить личное сообщение для Cvazimodo Найти все сообщения от Cvazimodo
  № 10  
Ответить с цитированием
Cvazimodo

Регистрация: Jan 2003
Сообщений: 365
Действительно, очень хороший пример. Спорить глупо
Если не возражаете, некоторые вещи позаимствую (может быть). Я, правда, до конца не разобрался, на работе тяжело отвлекаться. Дома вот попробую "разобрать" этот код по частям.

Нет предела оптимизации

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:37.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 16:37.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.