Просмотр полной версии : Проблема с позиционированием мыши
Пишу игру, где нужно проводить курсор мышки по всяким замысловатым лабиринтом и на первых парах столкнулся с проблемой позиционирования курсора.
требуеться, чтобы курсор был в одной и той же позиции , что и мой нарисованный курсор (то бижь символ, который я перетаскиваю по стартДрагу)
пытался так, но не получаеться :
startDrag(clash);
Mouse.hide();
onEnterFrame = function():Void {
_xmouse=clash._x;
_ymouse=clash._y;
}
где clash и есть тот самый символ
очень надеюсь на вашу помощь:bb:
И не получится. Оставь в покое мышку!
terbooter
30.10.2006, 08:56
_xmouse (Button._xmouse property)
public _xmouse : Number [read-only]
Вобщем проблема в том что свойства _xmouse _ymouse изменять програмно нельзя.
BigDan, двумя постами выше об этом уже сказали.
так что нужно? переместить мышку в какуюто точку? можно заставить юзера нажать на кнопку в этом месте к примеру...
2 Neosano:
Я вижу только один способ заставить пользователя щёлкнуть в каком-то месте -нарисовать большую красную стрелку с надписью: "Щёлкни сюда". Свойства _xmouse и _ymouse только для чтения. Их никак поменять нельзя. Необходимо искать другие решения.
Всем спасибо, немного огорчен, но все равно нашел альтернативу решению
if(_xmouse<32 && _ymouse<32) {
Mouse.hide();
clash._x=_xmouse;
clash._y=_ymouse;
startDrag(clash);
}
Но до сих пор думаю о том ,чтобы управление перенести на клаву...
Только вот назрел вопрос, как програмно определить пересечение двух объектов?
У меня есть символ clash (это персонаж) и символ level1 (это уровень)
и мне надо каким-то образом определять, когда они пересекаються друг с другом...
если бы это была мышка, томожно было б и по RollOut , но как быть, если управление будет с клавы?
Не подходить
В идеале факт пересечения двух клипов нужно считать состоявшимся, если у них есть хотя бы по
одной заполненной точке, которые имеют одинаковые глобальные координаты. Увы, но проверить
коллизию с такой точностью можно далеко не всегда. Для этого пришлось бы последовательно
перебрать значительное число точек, что недопустимо с позиции времени выполнения кода. По-
этому метод hitTest() сравнивает не положения заполненных точек двух клипов, а лишь их гра-
ничные координаты (получить которые можно, используя метод getBounds()). Это означает, что
факт коллизии будет подтвержден не тогда, когда объекты внутренней структуры двух клипов
действительно перекрывают друг друга, а тогда, когда пересекаются области, ограниченные опи-
санными вокруг них прямоугольными рамками.
А уровень у меня далеко не прямоугольник, скорее что-то напоминающее тонкую кишку =)
Поэтому получаться ложные данные
я вот тут подумал, может есть способ сравнения по пересечению цветов, то есть у меня clash черного цвета, и бэкграунд черного, может можно как-нить заюзать момент их сопрекосновения?
Вариант номер 1: Построить "кишку" из небольших прямоугольных участков, тогда хиттест будет нормально работать.
Вариант номер 2: Если карта существует в виде массива координат - хиттестить не 2 клипа, а клип и координаты из массива.
А вы не читали в справке, за что отвечает третий параметр в hitTest?
Хотя, это к делу не относится =(
А вы не читали в справке, за что отвечает третий параметр в hitTest?
Хотя, это к делу не относится =(
ну я нашел ,что там шейпфлаг есть, ссори, что сморозил
Но этот флаг точно дает возможность включать только действительно закрашенные точки?
И как мне узнать мои первые два параметра, у меня ж clash - это не точка и не пиксел?
Попробуй заюзать hitTest у BitmapData, т.е. снимая битмап с ролика и с целевого объекта, проверять полученные битмапы на хиттест. Я не пробовал, поэтому это только теория.
Zmitrek, оформлять код в теги нужно всегда, а не только по настроению.
iNils, прости...
Подскажите кто-нить ресурс по BitmapData на русском и доступно.
К сожелению в моих источниках об этом ничего не написано, а хелп дает слишком скудную инфу.
Есть вариант декомпилить и поковырять чей-нить чужой swf ,но это крайность, надеюсь решить проблему без декомпилера и плогиата
Подскажите кто-нить ресурс по BitmapData на русском и доступно.Ссылка на часть переведенного хелпа есть в моей подписи.
Угу, самое прикольное ,что там про хитТест не написано, не подсвечено, не переведено =(
Сенкс, респект!
Отпишись по завершению!
Спасиб, ток я все равно мало чего понял, пустая моя башка =(
Пойду застрелюсь. (или типа Гурского почитаю)
Пойду застрелюсь. (или типа Гурского почитаю)
А у меня таких книжек не было, ни Мука, ни Гурского, ни... ((
хнык-хнык ((
Всё что познано, было добыто потом и кровью, методом проб и ошибок (((
хнык-хнык
Я стрелялся :)
И по сей лень спотыкаюсь, из-за незнания некоторых основных вещей, которым в книжках учат.
требуеться, чтобы курсор был в одной и той же позиции , что и мой нарисованный курсор (то бижь символ, который я перетаскиваю по стартДрагу)
startDrag(clash, true);// c параметром true усе будет нормально;
не, я уже передумал юзать мышу, поскольку _xmouse & _ymouse только ридбл, то мне уже не интерестно, я хочу навернуть геймплей, а то не очень получаеться с курсором.
Поэтому переношу гаму на клавиатурное управление.
Вопрос про hitTest остаеться открытым.
terbooter
01.11.2006, 14:30
Может у мувика clash есть несколько граничных
четко выраженных
точек (например, верхняя часть головы одна, ноги -- две других точки-) )
а далее использовать метод hitTest в варианте
коллизия "содержимое мувика - точка"
по каждой точке мувика clash.
А у меня таких книжек не было, ни Мука, ни Гурского, ни...
Аналогично :D
А я как-то купил какую-то небольшую книжку на раскладках, посмотрел, что там нет ничего интересного, дал кому-то почитать и забыл уже, кому. Это была первая и последняя книга по Флешу, которую я купил. ^_^ И хоть я не Бог Флеша, но всё же что-то да умею, что говорит в пользу самообучения. Кстати, без лишней лести, надо заметить, что с тех пор, как я пришёл на этот форум, мой уровень владения Флешем значительно повысился. ^_^
да, у меня есть 4 граничные точки у clash , как мне зарелизить hitTest
terbooter, прости, но я не очень понял релиз коллизии, буду примного благодарен, если напишешь пример для двух (типа любых), граничных верхних точек.
Спасибо.
terbooter
02.11.2006, 09:47
Ну я это представляю примерно вот так...
x1 и y1 это координаты точки
по которой проверяется столкновение с фоном.
Начало координат клипа clash в левом верхнем углу
Далее можно добавить сколько нужно точек
Ну я это представляю примерно вот так...
x1 и y1 это координаты точки
по которой проверяется столкновение с фоном.
Начало координат клипа clash в левом верхнем углу
Далее можно добавить сколько нужно точек
ОООоо!!!! Беспредельная уважуха!!!
Чел ,ты спас меня !
Огромное спасибо!Спасибо за аттач (*.fla)
:drinks:
Еще один вопросик, можно ли заставить clash двигаться по диагонали, когда зажаты две клавиши (вверх и влево например)?
примерно с этим хендлером:
on(keyPress "<Left>")
...или подскажите альтернативный путь (биндить на отдельные клавиши эти действия не предлагать)
terbooter
03.11.2006, 08:16
так вроде двигается мувик по диагонали при одновременно нажатых
двух кнопках
не-а, вот так пишу в 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;
}
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;
}
Исходник прикрепляю...
Ух ты! Здорово!
Огромное спасибо, Хемуль!
Очень выручил, рад до бесподобства, продолжаю созидание геймы!
РЕСПЕКТ! Форум и здешние обитатели - ПРОСТО СУПЕР!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.