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

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

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

Регистрация: Nov 2010
Сообщений: 434
По умолчанию Не допустить выхода картинки за границы

Есть битмапа(карта) она состоит из прямоугольников и квадратов, по ней движется картинка 50x50. Как можно ограничить движение картинки за пределы карты ?
Канечно можно прописать множество условий чтобы не дать картинке двигаться по x или y в том или ином случае, но дело в том что карта уж очень сложная, и условий огромное количество придётся прописывать. Есть ли другой способ ?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Если "внутри" карты нет пустот, а снаружи – пустота, можно отрисовывать с карты в битмапдату ректангл, по размеру картинки. Затем проверяем ее на наличие прозрачных пикселей и вуаля.
Конечно, если простой математикой никак)))
__________________
Reality.getBounds(this);

Старый 09.05.2012, 15:20
ЗлОй ПрОграММер вне форума Посмотреть профиль Отправить личное сообщение для ЗлОй ПрОграММер Найти все сообщения от ЗлОй ПрОграММер
  № 3  
Ответить с цитированием
ЗлОй ПрОграММер

Регистрация: Nov 2010
Сообщений: 434
Пустота к сожалению есть(
Тут у меня появилась идея создать объект (квадратной или прямоугольной формы) на который никак не может заехать картинка, ну и потом подобными экземплярами обложить всю карту...

Старый 09.05.2012, 16:23
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Хм.. то есть внутри карты "персонаж" может ходить по пустоте, а наружу выйти не может?
А Вы можете пустоту "внутри" закрасить одним цветом, сделать например красный с альфой ноль, а снаружи ничего не делать, будет прозрачный цвет битмапдаты по-умолчанию? Например, можно в каждом блоке делать фон с нулевой альфой – прямоугольник каких-то стандартных "блочьих" размеров. Тогда при анализе битмапдаты смотрим альфу 0 и цвет не красный а тот, который задали контрольной битмапдаде при создании.
__________________
Reality.getBounds(this);

Старый 09.05.2012, 18:07
ЗлОй ПрОграММер вне форума Посмотреть профиль Отправить личное сообщение для ЗлОй ПрОграММер Найти все сообщения от ЗлОй ПрОграММер
  № 5  
Ответить с цитированием
ЗлОй ПрОграММер

Регистрация: Nov 2010
Сообщений: 434
пустота необязательна может быть прямоугольной формы, а более сложной
да и заливать пустоту опять же нада самому(много работы), а я хотел процесс автоматизировать

да и проверять пиксели на прозрачность думаю не лучший вариант, слишком много действий (при том что у меня 40 кадров в секунду)

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

Регистрация: May 2009
Сообщений: 134
я может не правильно поняла - а наложить маску в виде самой этой карты нельзя?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Объект не скрываться при выходе за границы должен, а не выходить за границы вообще))
__________________
Reality.getBounds(this);

Старый 10.05.2012, 10:02
ЗлОй ПрОграММер вне форума Посмотреть профиль Отправить личное сообщение для ЗлОй ПрОграММер Найти все сообщения от ЗлОй ПрОграММер
  № 8  
Ответить с цитированием
ЗлОй ПрОграММер

Регистрация: Nov 2010
Сообщений: 434
У меня вот ещё появилась идея, на движущейся картинке расставить на каждой стороне по точке и проверять каждую точку.
Проверять на прозрачность пиксели карты (которые находятся под этими точками)

вообщем получилось
вот код
Код AS3:
var point1: Point;
var point2: Point;
var point3: Point;
point1 = new Point(player.x, player.y + playerHalfHeight + 2);
point2 = localToGlobal(point1);
point3 = levelBitmap.globalToLocal(point2);
if (levelBitmap.bitmapData.getPixel(point3.x, point3.y) != 0) player.y += playerSpeed;
только углами всё таки может заехать за пределы карты, сейчас уходить нада (потом разбираться буду) но если кто решит как дополнить код буду благодарен)


Последний раз редактировалось ЗлОй ПрОграММер; 10.05.2012 в 11:11.
Старый 10.05.2012, 12:03
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 9  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Цитата:
Сообщение от ЗлОй ПрОграММер Посмотреть сообщение
но если кто решит как дополнить код буду благодарен)
На бокс2Д сделать, пример
Код:
package  
{
	import flash.display.*;import flash.events.*;import flash.ui.*;
	
	// Classes used in this example
	import Box2D.Dynamics.*;import Box2D.Collision.*;import Box2D.Collision.Shapes.*;
	import Box2D.Dynamics.Joints.*;import Box2D.Dynamics.Contacts.*;import Box2D.Common.*;
	import Box2D.Common.Math.*;
	
	/**
	 * ...
	 * @author Lexcuk
	 * 
https://sites.google.com/site/murmadillo/content/TopViewDocBox2_1.swf (в IE че-то не открывается, в опере работает)
	 */
	public class TopViewDocBox2_1 extends Sprite
	{
		private var move:Boolean, revers:Boolean, right:Boolean, left:Boolean;
		
		public var world:b2World;
		
		public var sharaBody:b2Body;
		
		
		public function TopViewDocBox2_1() {
			init();
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler);
			stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler);
			addEventListener(Event.ENTER_FRAME, Update);
		}
		

		private function init():void{
			// Creat world AABB
			var sprite:Sprite = new Sprite();
			addChild(sprite);
			
			world = new b2World(new b2Vec2(0,0), false);
			
			var debugDraw:b2DebugDraw = new b2DebugDraw();
			debugDraw.SetSprite(sprite);
			debugDraw.SetDrawScale(1);
			debugDraw.SetFillAlpha(0.3);
			debugDraw.SetLineThickness(1.0);
			debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
			world.SetDebugDraw(debugDraw);
			
			//начало рамка уровня
			var sD:b2BodyDef = new b2BodyDef();
			var sB:b2PolygonShape = new b2PolygonShape();
			var w:Number = 800, h:Number = 600;
			var wall:Array = [w/2, 0, w/2, 5, w/2, h, w/2, 5, 0, h/2, 5, h/2, w, h/2, 5, h/2];
			var i:int, c:int;
			
			for (i = 0; i < 4;i++){
				sD.position.Set(wall[c++], wall[c++]); sB.SetAsBox(wall[c++], wall[c++]);
				world.CreateBody(sD).CreateFixture2(sB,1);
			}
			//конец рамка уровня
			
			//начало препятствия уровня (рандомно разбросанные квадраты
			for (i = 0; i < 100; i++) {
				sD.position.Set(int(5+Math.random()*75)*10, int(5+Math.random()*55)*10); sB.SetAsBox(5, 5);
				world.CreateBody(sD).CreateFixture2(sB,1);
			}
			//конец прапятствия уровня
			world.DrawDebugData();
			
			
			//начало создание персоонажа
			sD.position.Set(100, 100); sB.SetAsBox(10, 15);
			
			sD.type = b2Body.b2_dynamicBody;
			sD.linearDamping = 1;
			sD.angularDamping = 1;
			
			sharaBody = world.CreateBody(sD);
			
			sharaBody.CreateFixture2(sB, 0);
			sB.SetAsOrientedBox(3, 3, new b2Vec2(0, 6));
			sharaBody.CreateFixture2(sB, 0);
			
			var b2Mass:b2MassData = new b2MassData();
			b2Mass.mass = 1;
			b2Mass.I = 1;
			b2Mass.center = new b2Vec2(0,0);
			sharaBody.SetMassData(b2Mass);
			
			sharaBody.SetSleepingAllowed(false);
			
			//конец создание персоонажа
			
			
		}

		public function Update(e:Event):void {
			world.ClearForces();
			//trace(move);
			var axis:b2Vec2 = sharaBody.GetTransform().R.col2.Copy();
			if (move) axis.Multiply(40)
			if (revers) axis.Multiply(-40)
			if (!move&&!revers) axis.Multiply(0);
			sharaBody.SetLinearVelocity(axis);
			
			if (left) sharaBody.SetAngularVelocity(1);
			if (right) sharaBody.SetAngularVelocity(-1);
			if (!left&&!right) sharaBody.SetAngularVelocity(0);
			
			//if (revers) sharaBody.SetLinearVelocity(new b2Vec2(-1000000000, -1000000));
			
			world.Step ( 1/30, 10, 10 );
			world.DrawDebugData();
			
		}

		private function keyHandler(e:KeyboardEvent):void {
			//trace(e.keyCode); //w - 87 a - 65 d - 68 s - 83
			if (e.type==KeyboardEvent.KEY_DOWN) keyFunc(e.keyCode, true);
			if (e.type==KeyboardEvent.KEY_UP) keyFunc(e.keyCode, false);
		}
 
		private function keyFunc(k:int, t:Boolean):void {
			if (k == Keyboard.UP || k == 87) move = t;
			if (k == Keyboard.DOWN || k == 83) revers = t;
			if (k == Keyboard.RIGHT || k == 68) right = t;
			if (k == Keyboard.LEFT || k == 65) left = t;
		}



	}

}
__________________
Гоночка

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

Регистрация: Nov 2010
Сообщений: 434
не выход, подключать движок ради такой задачи не хочу

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

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

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


 


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


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