Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Проблема с позиционированием мыши (http://www.flasher.ru/forum/showthread.php?t=87137)

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

Цитата:

Сообщение от __etc
А вы не читали в справке, за что отвечает третий параметр в 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

Цитата:

Сообщение от Zmitrek
Подскажите кто-нить ресурс по 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

Цитата:

Сообщение от Zmitrek

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


Код:

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

Цитата:

Сообщение от miramax
А у меня таких книжек не было, ни Мука, ни Гурского, ни...

Аналогично :D

Хемуль 01.11.2006 16:39

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

Zmitrek 01.11.2006 19:33

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

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

Спасибо.

terbooter 02.11.2006 09:47

Вложений: 1
Ну я это представляю примерно вот так...

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

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

Zmitrek 03.11.2006 04:57

Цитата:

Сообщение от terbooter
Ну я это представляю примерно вот так...

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

Вложений: 1
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

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

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


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

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