PDA

Просмотр полной версии : Проблема с позиционированием мыши


Zmitrek
30.10.2006, 03:01
Пишу игру, где нужно проводить курсор мышки по всяким замысловатым лабиринтом и на первых парах столкнулся с проблемой позиционирования курсора.

требуеться, чтобы курсор был в одной и той же позиции , что и мой нарисованный курсор (то бижь символ, который я перетаскиваю по стартДрагу)

пытался так, но не получаеться :
startDrag(clash);
Mouse.hide();

onEnterFrame = function():Void {
_xmouse=clash._x;
_ymouse=clash._y;
}

где clash и есть тот самый символ

очень надеюсь на вашу помощь:bb:

Kikasso
30.10.2006, 03:08
И не получится. Оставь в покое мышку!

terbooter
30.10.2006, 08:56
_xmouse (Button._xmouse property)
public _xmouse : Number [read-only]

BigDan
30.10.2006, 11:25
Вобщем проблема в том что свойства _xmouse _ymouse изменять програмно нельзя.

etc
30.10.2006, 13:33
BigDan, двумя постами выше об этом уже сказали.

Neosano
30.10.2006, 17:23
так что нужно? переместить мышку в какуюто точку? можно заставить юзера нажать на кнопку в этом месте к примеру...

Хемуль
30.10.2006, 17:40
2 Neosano:
Я вижу только один способ заставить пользователя щёлкнуть в каком-то месте -нарисовать большую красную стрелку с надписью: "Щёлкни сюда". Свойства _xmouse и _ymouse только для чтения. Их никак поменять нельзя. Необходимо искать другие решения.

Zmitrek
30.10.2006, 21:33
Всем спасибо, немного огорчен, но все равно нашел альтернативу решению

if(_xmouse<32 && _ymouse<32) {
Mouse.hide();
clash._x=_xmouse;
clash._y=_ymouse;
startDrag(clash);
}

Но до сих пор думаю о том ,чтобы управление перенести на клаву...

Только вот назрел вопрос, как програмно определить пересечение двух объектов?

У меня есть символ clash (это персонаж) и символ level1 (это уровень)
и мне надо каким-то образом определять, когда они пересекаються друг с другом...

если бы это была мышка, томожно было б и по RollOut , но как быть, если управление будет с клавы?

etc
30.10.2006, 21:49
hitTest

Zmitrek
30.10.2006, 22:57
Не подходить


В идеале факт пересечения двух клипов нужно считать состоявшимся, если у них есть хотя бы по
одной заполненной точке, которые имеют одинаковые глобальные координаты. Увы, но проверить
коллизию с такой точностью можно далеко не всегда. Для этого пришлось бы последовательно
перебрать значительное число точек, что недопустимо с позиции времени выполнения кода. По-
этому метод hitTest() сравнивает не положения заполненных точек двух клипов, а лишь их гра-
ничные координаты (получить которые можно, используя метод getBounds()). Это означает, что
факт коллизии будет подтвержден не тогда, когда объекты внутренней структуры двух клипов
действительно перекрывают друг друга, а тогда, когда пересекаются области, ограниченные опи-
санными вокруг них прямоугольными рамками.

А уровень у меня далеко не прямоугольник, скорее что-то напоминающее тонкую кишку =)
Поэтому получаться ложные данные

Zmitrek
30.10.2006, 23:53
я вот тут подумал, может есть способ сравнения по пересечению цветов, то есть у меня clash черного цвета, и бэкграунд черного, может можно как-нить заюзать момент их сопрекосновения?

wvxvw
31.10.2006, 00:22
Вариант номер 1: Построить "кишку" из небольших прямоугольных участков, тогда хиттест будет нормально работать.
Вариант номер 2: Если карта существует в виде массива координат - хиттестить не 2 клипа, а клип и координаты из массива.

etc
31.10.2006, 00:27
А вы не читали в справке, за что отвечает третий параметр в hitTest?
Хотя, это к делу не относится =(

Zmitrek
31.10.2006, 01:41
А вы не читали в справке, за что отвечает третий параметр в hitTest?
Хотя, это к делу не относится =(

ну я нашел ,что там шейпфлаг есть, ссори, что сморозил
Но этот флаг точно дает возможность включать только действительно закрашенные точки?

И как мне узнать мои первые два параметра, у меня ж clash - это не точка и не пиксел?

etc
31.10.2006, 02:03
Попробуй заюзать hitTest у BitmapData, т.е. снимая битмап с ролика и с целевого объекта, проверять полученные битмапы на хиттест. Я не пробовал, поэтому это только теория.

iNils
31.10.2006, 02:03
Zmitrek, оформлять код в теги нужно всегда, а не только по настроению.

Zmitrek
31.10.2006, 02:33
iNils, прости...

Подскажите кто-нить ресурс по BitmapData на русском и доступно.
К сожелению в моих источниках об этом ничего не написано, а хелп дает слишком скудную инфу.
Есть вариант декомпилить и поковырять чей-нить чужой swf ,но это крайность, надеюсь решить проблему без декомпилера и плогиата

iNils
31.10.2006, 02:37
Подскажите кто-нить ресурс по BitmapData на русском и доступно.Ссылка на часть переведенного хелпа есть в моей подписи.

Zmitrek
31.10.2006, 02:51
Угу, самое прикольное ,что там про хитТест не написано, не подсвечено, не переведено =(

iNils
31.10.2006, 03:03
Сейчас переведу.

Zmitrek
31.10.2006, 03:21
Сенкс, респект!
Отпишись по завершению!

iNils
01.11.2006, 02:09
Перевел.

Zmitrek
01.11.2006, 02:50
Спасиб, ток я все равно мало чего понял, пустая моя башка =(

Пойду застрелюсь. (или типа Гурского почитаю)

miramax
01.11.2006, 03:22
Пойду застрелюсь. (или типа Гурского почитаю)
А у меня таких книжек не было, ни Мука, ни Гурского, ни... ((
хнык-хнык ((
Всё что познано, было добыто потом и кровью, методом проб и ошибок (((
хнык-хнык
Я стрелялся :)
И по сей лень спотыкаюсь, из-за незнания некоторых основных вещей, которым в книжках учат.

udaaff
01.11.2006, 05:27
требуеться, чтобы курсор был в одной и той же позиции , что и мой нарисованный курсор (то бижь символ, который я перетаскиваю по стартДрагу)


startDrag(clash, true);// c параметром true усе будет нормально;

Zmitrek
01.11.2006, 05:42
не, я уже передумал юзать мышу, поскольку _xmouse & _ymouse только ридбл, то мне уже не интерестно, я хочу навернуть геймплей, а то не очень получаеться с курсором.
Поэтому переношу гаму на клавиатурное управление.

Вопрос про hitTest остаеться открытым.

terbooter
01.11.2006, 14:30
Может у мувика clash есть несколько граничных
четко выраженных
точек (например, верхняя часть головы одна, ноги -- две других точки-) )

а далее использовать метод hitTest в варианте
коллизия "содержимое мувика - точка"
по каждой точке мувика clash.

etc
01.11.2006, 14:40
А у меня таких книжек не было, ни Мука, ни Гурского, ни...
Аналогично :D

Хемуль
01.11.2006, 16:39
А я как-то купил какую-то небольшую книжку на раскладках, посмотрел, что там нет ничего интересного, дал кому-то почитать и забыл уже, кому. Это была первая и последняя книга по Флешу, которую я купил. ^_^ И хоть я не Бог Флеша, но всё же что-то да умею, что говорит в пользу самообучения. Кстати, без лишней лести, надо заметить, что с тех пор, как я пришёл на этот форум, мой уровень владения Флешем значительно повысился. ^_^

Zmitrek
01.11.2006, 19:33
да, у меня есть 4 граничные точки у clash , как мне зарелизить hitTest

terbooter, прости, но я не очень понял релиз коллизии, буду примного благодарен, если напишешь пример для двух (типа любых), граничных верхних точек.

Спасибо.

terbooter
02.11.2006, 09:47
Ну я это представляю примерно вот так...

x1 и y1 это координаты точки
по которой проверяется столкновение с фоном.
Начало координат клипа clash в левом верхнем углу

Далее можно добавить сколько нужно точек

Zmitrek
03.11.2006, 04:57
Ну я это представляю примерно вот так...

x1 и y1 это координаты точки
по которой проверяется столкновение с фоном.
Начало координат клипа clash в левом верхнем углу

Далее можно добавить сколько нужно точек

ОООоо!!!! Беспредельная уважуха!!!
Чел ,ты спас меня !
Огромное спасибо!Спасибо за аттач (*.fla)

:drinks:

Zmitrek
03.11.2006, 06:16
Еще один вопросик, можно ли заставить clash двигаться по диагонали, когда зажаты две клавиши (вверх и влево например)?

примерно с этим хендлером:

on(keyPress "<Left>")

...или подскажите альтернативный путь (биндить на отдельные клавиши эти действия не предлагать)

terbooter
03.11.2006, 08:16
так вроде двигается мувик по диагонали при одновременно нажатых
двух кнопках

Zmitrek
03.11.2006, 20:15
не-а, вот так пишу в clash и не получаеться


on(keyPress "<Left>") {
this._x-=4;
}
on(keyPress "<Right>") {
this._x+=4;
}

on(keyPress "<Up>") {
this._y-=4;
}
on(keyPress "<Down>") {
this._y+=4;
}

Хемуль
04.11.2006, 02:01
2 Zmitrek:
Опрашивать клавиши на onEnterFrame.
Например, вставьте этот код просто в пустой кадр новой флешки:

var left:Number = Stage.width / 2;
var top:Number = Stage.height / 2;
var radius:Number = 40;
var speed:Number = 5;
var fillColor:Number = 0xff0000;
var fillAlpha:Number = 100;
var lineColor:Number = 0x000000;
var lineAlpha:Number = 100;
var lineWidth:Number = 1;
var circleClipName:String = "circle";
var circleClip:MovieClip = createCircleMovieClip(circleClipName, this, this, left, top, radius, fillColor, fillAlpha, lineColor, lineAlpha, lineWidth);

this.onEnterFrame = function()
{
if (Key.isDown(Key.RIGHT))
{
circleClip._x += speed;
}
if (Key.isDown(Key.LEFT))
{
circleClip._x -= speed;
}
if (Key.isDown(Key.UP))
{
circleClip._y -= speed;
}
if (Key.isDown(Key.DOWN))
{
circleClip._y += speed;
}
}

function createCircleMovieClip(circleName:String, parentClip:MovieClip, parentClipDepth:Number, circleX:Number, circleY:Number, circleRadius:Number, circleFillColor:Number, circleFillAlpha:Number, circleLineColor:Number, circleLineAlpha:Number, circleLineWidth:Number):MovieClip
{
var newCircleClip:MovieClip = parentClip.createEmptyMovieClip(circleName, parentClipDepth);
newCircleClip._x = circleX - circleRadius;
newCircleClip._y = circleY - circleRadius;
newCircleClip.lineStyle(circleLineWidth, circleLineColor, circleLineAlpha);
newCircleClip.beginFill(circleFillColor, circleFillAlpha);
var tanPI8:Number = Math.tan(Math.PI / 8);
var sinPI4:Number = Math.sin(Math.PI / 4);
newCircleClip.moveTo(2 * circleRadius, circleRadius);
newCircleClip.curveTo(2 * circleRadius, (tanPI8 + 1) * circleRadius, (sinPI4 + 1) * circleRadius, (sinPI4 + 1) * circleRadius);
newCircleClip.curveTo((tanPI8 + 1) * circleRadius, 2 * circleRadius, circleRadius, 2 * circleRadius);
newCircleClip.curveTo((1 - tanPI8) * circleRadius, 2 * circleRadius, (1 - sinPI4) * circleRadius, (sinPI4 + 1) * circleRadius);
newCircleClip.curveTo(0, (tanPI8 + 1) * circleRadius, 0, circleRadius);
newCircleClip.curveTo(0, (1 - tanPI8) * circleRadius, (1 - sinPI4) * circleRadius, (1 - sinPI4) * circleRadius);
newCircleClip.curveTo((1 - tanPI8) * circleRadius, 0, circleRadius, 0);
newCircleClip.curveTo((tanPI8 + 1) * circleRadius, 0, (sinPI4 + 1) * circleRadius, (1 - sinPI4) * circleRadius);
newCircleClip.curveTo(2 * circleRadius, (1 - tanPI8) * circleRadius, 2 * circleRadius, circleRadius);
newCircleClip.endFill();
return newCircleClip;
}

Исходник прикрепляю...

Zmitrek
04.11.2006, 04:04
Ух ты! Здорово!
Огромное спасибо, Хемуль!
Очень выручил, рад до бесподобства, продолжаю созидание геймы!

РЕСПЕКТ! Форум и здешние обитатели - ПРОСТО СУПЕР!