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

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

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

Регистрация: Dec 2011
Сообщений: 7
Cool Взаимодействие персонажа и элементов массива

Всем привет! Подскажите пожалуйста решение проблемы.
Учусь делать платформер, сделал персонажа, научил его двигаться от нажатия игроком клавиш, теперь хочу сделать вот что:
сделать мувиклип из обычного прямоугольника, который мог бы быть основой для карты, то есть платформой, кирпичиком, добавляя который на стол в нужном количестве можно было бы составить уровень - "землю", платформы, далее при загрузке кадра нужно, чтобы все копии этого мувиклипа загружались в массив, а после этого я бы сделал такую проверку: если хиттест персонажа с элементами массива с платформами отрицательный, то к y-координате игрока плюсуется такое-то число, то есть персонаж как бы падает вниз.
я новичек во флеше, пытался сделать описанное выше по разным урокам, но получается такая проблема:
(изначально персонаж находится, допустим, в середине экрана, а платформа/платформы в самом низу экрана)
когда на экране присутствует только одна платформа, персонаж спокойно "приземляется" на нее и стоит на ней, а когда я добавляю в кадр еще одну или больше платформ из библиотеки - персонаж пролетает вниз сквозь платформы, не реагируя на них, причем чем больше платформ в кадре - тем быстрее скорость падения.
Работаю в Флэш Макромедиа 8, какой экшн скрипт не знаю, учусь по урокам, настройки в программе не менял и использую то, что работает и соответствует описанию из урока.
Вот что я делал:
1) в первый кадр мувиклипа snowblock (это платформа) добавлял строку
Код AS1/AS2:
_parent.addBox(this);
2) в кадре игры, в самом начале написал:
Код AS1/AS2:
var boxes = [];
addBox = function (obj) {
	boxes.push(obj);
}
3) в кадре игры написал:
Код AS1/AS2:
function checkHitPlatform() {
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (!curB.hitTest(human.p4)) {
			human._y += 15;
		}
	}
}
где human - инстенс нэйм персонажа, а p4 - инстенс нейм мувиклипа для проверки столкновения снизу, находящийся в мувиклипе персонажа.
P.S.: оформил куски кода наугад, так как не знаю версию экшн скрипта, не ругайтесь.

Старый 29.12.2011, 17:08
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Интересный способ постройки уровня, первый раз такое вижу.

Используйте лучше у себя переменную для гравитаций:
Код AS1/AS2:
function checkHitPlatform() {
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(human.p4)) {
			gravity = 0;
			break;
		}
	}
}
function gravitiPlayer() {
	human._y += gravity;
	gravity ++;
}
Там где вы запускаете фун. checkHitPlatform():
Код AS1/AS2:
 
checkHitPlatform();
gravitiPlayer();
И описание переменной в начале:
Код AS1/AS2:
var gravity = 0;
А косяк у вас в том, что вы прибавляете _y персонажу столько раз, сколько у вас блоков на сцене. Баг с "проходом через землю" тоже от сюда.
__________________
Дети не должны знать о своих родителях

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

Регистрация: Dec 2011
Сообщений: 7
Спасибо, оба варианта работают! Как убрать следующий баг? Он заключается в том, что персонаж приземляется:
а) в Вашем варианте ногами ниже верхней границы платформы, чем больше высота падения и ускорение - тем глубже он проходит в платформу ногами:
Код AS1/AS2:
var gravity = 0;
humanstep = 15;
var boxes = [];
addBox = function (obj) {
	boxes.push(obj);
};
//счетчик времени полета
jumptime = 0;
humanjump = false;
jumppick = false;
function Movement() {
	if (Key.isDown(key.RIGHT)) {
		human._x += humanstep;
		human._xscale = 40;
		human.gotoAndPlay(1);
	} else if (Key.isDown(key.LEFT)) {
		human._x -= humanstep;
		human._xscale = -40;
		human.gotoAndPlay(1);
	} else if (Key.isDown(key.UP)) {
		humanjump = true;
	} else {
		human.gotoAndPlay(3);
	}
}
checkHitPlatform = function () {
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(human.p4)) {
			gravity = 0;
 
			jumptime = 0;
			if (humanjump == true) {
				humanjump = false;
			}
		}
	}
};
function gravitiPlayer() {
	human._y += gravity;
	gravity++;
}
onEnterFrame = function () {
	gravitiPlayer();
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(human.p4)) {
			gravity = 0;
 
			jumptime = 0;
			if (humanjump == true) {
				humanjump = false;
			}
		}
	}
	Movement();
	//-----------
	if (humanjump == true && jumptime<5) {
		human.gotoAndPlay(2);
		human._y -= 30;
		jumptime += 1;
	}
	//-----------     
};
б) в моем варианте он приземляется выше платформы или ровно на ее поверхность по очереди при прыжках:

Код AS1/AS2:
humanstep = 15;
var boxes = [];
addBox = function (obj) {
	boxes.push(obj);
};
//счетчик времени полета
jumptime = 0;
humanjump = false;
jumppick = false;
function Movement() {
	if (Key.isDown(key.RIGHT)) {
		human._x += humanstep;
		human._xscale = 40;
		human.gotoAndPlay(1);
	} else if (Key.isDown(key.LEFT)) {
		human._x -= humanstep;
		human._xscale = -40;
		human.gotoAndPlay(1);
	} else if (Key.isDown(key.UP)) {
		humanjump = true;
			} else {
		human.gotoAndPlay(3);
	}
}
checkHitPlatform = function () {
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(human.p4)) {
			//контакт сверху
			human._y -= 20;
			jumptime = 0;
			if (humanjump == true) {humanjump = false;}
		}
	}
};
onEnterFrame = function () {
	human._y += 20;
	checkHitPlatform();
	Movement();
	//-----------
	if (humanjump == true && jumptime<5) {
		human.gotoAndPlay(2);
		human._y -= 30;
		jumptime += 1;
	}
 
	//-----------    
};


Последний раз редактировалось Обломов; 31.12.2011 в 00:22. Причина: ошибка в предложении
Старый 31.12.2011, 12:01
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Код AS1/AS2:
var gravity = 0;
humanstep = 15;
var boxes = [];
addBox = function (obj) {
	boxes.push(obj);
};
//счетчик времени полета
jumptime = 0;
humanjump = false;
jumppick = false;
function Movement() {
	if (Key.isDown(key.RIGHT)) {
		human._x += humanstep;
		human._xscale = 40;
		human.gotoAndPlay(1);
	} else if (Key.isDown(key.LEFT)) {
		human._x -= humanstep;
		human._xscale = -40;
		human.gotoAndPlay(1);
	} else if (Key.isDown(key.UP)) {
		humanjump = true;
	} else {
		human.gotoAndPlay(3);
	}
}
checkHitPlatform = function () {
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(human.p4)) {
			gravity = 0;
 
			jumptime = 0;
			if (humanjump == true) {
				humanjump = false;
			}
		}
	}
};
function gravitiPlayer() {
	human._y += gravity;
	gravity++;
}
onEnterFrame = function () {
	gravitiPlayer();
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(human.p4)) {
			gravity = 0;
			// Если утонул в блоке, вытаскиваем: <<<------------------------ изменение
			while(curB.hitTest(human.p4)){
				human._y-=0.1;
			}
 
 
			jumptime = 0;
			if (humanjump == true) {
				humanjump = false;
			}
		}
	}
	Movement();
	//-----------
	if (humanjump == true && jumptime<5) {
		human.gotoAndPlay(2);
		human._y -= 30;
		jumptime += 1;
	}
	//-----------     
};
__________________
Дети не должны знать о своих родителях

Старый 02.01.2012, 21:29
Обломов вне форума Посмотреть профиль Отправить личное сообщение для Обломов Найти все сообщения от Обломов
  № 5  
Ответить с цитированием
Обломов

Регистрация: Dec 2011
Сообщений: 7
Сделал, работает отлично! После этого сделал столкновение справа и слева, все гуд, но не получается нормально сделать столкновение с платформой сверху, при прыжке - прыжок тормозится, но персонаж всё равно головой проходит сквозь платформу, пробовал исправить тем же приемом, что Вы посоветовали выше - не помогает. Что можете подсказать?
Вот код на данный момент:
Код AS1/AS2:
var boxes = [];
addBox = function (obj) {
	boxes.push(obj);
};
prityazhenie = 20;
humanstep = 15;
grav = 3; //замедление скорости прыжка, направленной вверх
jumptime = 0;
humanjump = false;
humanreversed = false;
jumpstep = 25;
//движение вправо и влево
function Movement() {
	if (Key.isDown(key.RIGHT)) {
		human._x += humanstep;
		human._xscale = 40;
		human.gotoAndPlay(1);
		humanreversed = false;
	} else if (Key.isDown(key.LEFT)) {
		human._x -= humanstep;
		human._xscale = -40;
		human.gotoAndPlay(1);
		humanreversed = true;
	} else {
		human.gotoAndPlay(3);
	}
}
checkHitPlatform = function () {
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(human.p4)) {
			//контакт ног персонажа с платформой
			prityazhenie = 0;
			upact = false;
			jumptime = 0;
			jumpstep = 40;
			if (humanjump == true) {
				humanjump = false;
			}
			if (!curB.hitTest(human.p4)) {
				while (!curB.hitTest(human.p4)) {
					human._y += 0.1;
				}
			}
			if (curB.hitTest(human.p4)) {
				while (curB.hitTest(human.p4)) {
					human._y -= 0.1;
				}
			}
		} else {
			prityazhenie = 20;
		}
		if (curB.hitTest(human.p3)) {
			//контакт c платформой справа
			human._x -= humanstep;
		}
		if (curB.hitTest(human.p3) && humanreversed == true) {
			//контакт с платформой слева
			human._x += humanstep*2;
		}
		if (curB.hitTest(human.p2)) {
			//контакт головы персонажа с платформой
			upact = true;
			hero._y = curB._y-curB._height/2-hhy;
		}
	}
};
onEnterFrame = function () {
	human._y += prityazhenie; //притяжение вниз
	checkHitPlatform();
	Movement();
	//----------- прыжок
	if (((Key.isDown(key.UP) && Key.isDown(key.RIGHT)) || (Key.isDown(key.LEFT) && Key.isDown(key.UP)) || (Key.isDown(key.UP))) && upact == false) {
		humanjump = true;
	} else {
		humanjump = false;
	}
	if (humanjump == true && jumptime<5) {
		human.gotoAndPlay(2);
		human._y -= jumpstep;
		jumptime += 1;
		jumpstep -= grav;
	}
	//-----------                  
};


Последний раз редактировалось Обломов; 02.01.2012 в 21:32. Причина: удалил неиспользуемые переменные
Старый 02.01.2012, 21:45
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 6  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
У вас внутри human есть p4 как я понял - ноги, на которые и проверяеться столкновение с блоками. Создайте внутри human ещё такой-же регион только для головы.
__________________
Дети не должны знать о своих родителях

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

Регистрация: Dec 2011
Сообщений: 7
Он есть, это p2 в коде, а p3 для столкновений сбоку, вот скрин размещения платформ, но в принципе он особой информации для решения проблемы не несет - хиттест проходит нормально - проверял переменной, состояние которой отображалось в специальном текстовом поле. p1 пока не использую.
Изображения
 

Старый 03.01.2012, 01:01
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 8  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Может как-то так:
Код AS1/AS2:
//движение вправо и влево
function Movement() {
	if (Key.isDown(key.RIGHT)) {
		human._x += humanstep;
		human._xscale = 40;
		human.gotoAndPlay(1);
		humanreversed = false;
	} else if (Key.isDown(key.LEFT)) {
		human._x -= humanstep;
		human._xscale = -40;
		human.gotoAndPlay(1);
		humanreversed = true;
	} else {
		human.gotoAndPlay(3);
	}
}
checkHitPlatform = function () {
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
 
 
		if(curB.hitTest(human.p2)) {
			while (curB.hitTest(human.p2)) {
				human._y += 0.1;
				prityazhenie = 0;
				jumptime = 0;
				humanjump = false;
				jumpstep = 0;
			}
		}
 
		if (curB.hitTest(human.p4)) {
			//контакт ног персонажа с платформой
			prityazhenie = 0;
			upact = false;
			jumptime = 0;
			jumpstep = 40;
			if (humanjump == true) {
				humanjump = false;
			}
			if (curB.hitTest(human.p4)) {
				while (curB.hitTest(human.p4)) {
					human._y -= 0.1;
				}
			}
		} else {
			prityazhenie = 20;
		}
		if (curB.hitTest(human.p3)) {
			//контакт c платформой справа
			human._x -= humanstep;
		}
		if (curB.hitTest(human.p3) && humanreversed == true) {
			//контакт с платформой слева
			human._x += humanstep*2;
		}
		if (curB.hitTest(human.p2)) {
			//контакт головы персонажа с платформой
			upact = true;
			hero._y = curB._y-curB._height/2-hhy;
		}
	}
};
onEnterFrame = function () {
 
	checkHitPlatform();
	human._y += prityazhenie; //притяжение вниз
 
	Movement();
	//----------- прыжок
	if (((Key.isDown(key.UP) && Key.isDown(key.RIGHT)) || (Key.isDown(key.LEFT) && Key.isDown(key.UP)) || (Key.isDown(key.UP))) && upact == false) {
		humanjump = true;
	} else {
		humanjump = false;
	}
	if (humanjump == true && jumptime<5) {
		human.gotoAndPlay(2);
		human._y -= jumpstep;
		jumptime += 1;
		jumpstep -= grav;
	}
	//-----------                  
};
Для временной проверки переменных и прочего удобнее использовать:
Код AS1/AS2:
trace(переменная);
trace(human._y);
__________________
Дети не должны знать о своих родителях

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

Регистрация: Dec 2011
Сообщений: 7
Персонаж стал дергаться, пока находится сверху от платформы, а при прыжке всё равно головой проходит сквозь платформу сверху. Метод трэйс и правда удобный, особенно для проверки состояния массива.

Старый 05.01.2012, 11:04
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 10  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Попробуйте p2 и p4 пошире сделать
__________________
Дети не должны знать о своих родителях

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

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

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


 


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


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