![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 434
|
Есть битмапа(карта) она состоит из прямоугольников и квадратов, по ней движется картинка 50x50. Как можно ограничить движение картинки за пределы карты ?
Канечно можно прописать множество условий чтобы не дать картинке двигаться по x или y в том или ином случае, но дело в том что карта уж очень сложная, и условий огромное количество придётся прописывать. Есть ли другой способ ? |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Если "внутри" карты нет пустот, а снаружи – пустота, можно отрисовывать с карты в битмапдату ректангл, по размеру картинки. Затем проверяем ее на наличие прозрачных пикселей и вуаля.
Конечно, если простой математикой никак)))
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 434
|
Пустота к сожалению есть(
Тут у меня появилась идея создать объект (квадратной или прямоугольной формы) на который никак не может заехать картинка, ну и потом подобными экземплярами обложить всю карту... |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Хм.. то есть внутри карты "персонаж" может ходить по пустоте, а наружу выйти не может?
А Вы можете пустоту "внутри" закрасить одним цветом, сделать например красный с альфой ноль, а снаружи ничего не делать, будет прозрачный цвет битмапдаты по-умолчанию? Например, можно в каждом блоке делать фон с нулевой альфой – прямоугольник каких-то стандартных "блочьих" размеров. Тогда при анализе битмапдаты смотрим альфу 0 и цвет не красный а тот, который задали контрольной битмапдаде при создании.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 434
|
пустота необязательна может быть прямоугольной формы, а более сложной
да и заливать пустоту опять же нада самому(много работы), а я хотел процесс автоматизировать да и проверять пиксели на прозрачность думаю не лучший вариант, слишком много действий (при том что у меня 40 кадров в секунду) |
|
|||||
|
Регистрация: May 2009
Сообщений: 134
|
я может не правильно поняла - а наложить маску в виде самой этой карты нельзя?
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Объект не скрываться при выходе за границы должен, а не выходить за границы вообще))
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 434
|
У меня вот ещё появилась идея, на движущейся картинке расставить на каждой стороне по точке и проверять каждую точку.
Проверять на прозрачность пиксели карты (которые находятся под этими точками) вообщем получилось вот код только углами всё таки может заехать за пределы карты, сейчас уходить нада (потом разбираться буду) но если кто решит как дополнить код буду благодарен) Последний раз редактировалось ЗлОй ПрОграММер; 10.05.2012 в 11:11. |
|
|||||
|
На бокс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;
}
}
}
__________________
Гоночка |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 434
|
не выход, подключать движок ради такой задачи не хочу
|
![]() |
![]() |
Часовой пояс GMT +4, время: 02:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|