PDA

Просмотр полной версии : Перетаскивание по окружности...


designer
04.11.2003, 13:20
Есть шарик, вот с таким кодом:

onClipEvent (mouseMove) {
a=this._parent._xmouse;
b=this._parent._ymouse;
if ((a>9) && (a<80) && (b>11) && (b<82))
{this._x = this._parent._xmouse;
this._y = this._parent._ymouse;}
}

Соответственно движется за мышой в заданном квадрате... А надо, чтобы все было точно так, но чтобы он двигался по окружности в тех же границах... Воотсетственно, нужно координату x не трогать, а y как определить в зависимости от х?

Вроде как по логике - из уравнения окружности:
(x-xx)*(x-xx)+(y-yy)*(y-yy)=R*R

Соответственно хх и уу - координаты центра...
R - радиус...

А как это все во флеш загнать? Какой формулой?

dee2
04.11.2003, 13:33
есть такие замечательные функции, как sin и cos

designer
04.11.2003, 13:34
А поподробнее можно, как с их помощью записать? И куда девать координаты центра?

Techmaker
04.11.2003, 14:11
хе-хе, триганометрия :) вот самый простой пример :) теорема Пифагора
/* функция рисования nuran'а
уже 3'тий раз на форуме пишу, использую для рисования окружности, чтобы было видно границы */
MovieClip.prototype.circle = function(x, y, r) {
var mas = new Array();
var step = 16;
var angle = 360/step;
var rad = Math.PI/180;
for (var i = 0; i<=step; i++) {
mas[i] = new Object();
mas[i].x = Math.cos(angle*rad*i)*r+x;
mas[i].y = Math.sin(angle*rad*i)*r+y;
}
this.moveTo(mas[0].x, mas[0].y);
for (var i = 0; i<step; i += 2) {
// curveThreeTo
var cx = 2*mas[i+1].x-0.5*(mas[i].x+mas[i+2].x);
var cy = 2*mas[i+1].y-0.5*(mas[i].y+mas[i+2].y);
this.curveTo(cx, cy, mas[i+2].x, mas[i+2].y);
}
};

this.createEmptyMovieClip("circle1",500)
with(circle1){
lineStyle(5,0x000000,100)
circle(0,0,100)
_x=Stage.width/2
_y=Stage.height/2
}

with(this.createEmptyMovieClip("mc",1)){
lineStyle(5,0xFF0000,100)
lineTo(.5,.5)
_x=Stage.width/2
_y=Stage.height/2
}

mc.onEnterFrame=function(){
this.delta_x=Stage.width/2-_xmouse
this.delta_y=Stage.height/2-_ymouse
if(Math.sqrt(this.delta_x*this.delta_x+this.delta_y*this.delta_y)<95){
this._x=_xmouse
this._y=_ymouse
}else{
this.a=180+(Math.atan2(this.delta_y,this.delta_x)*180)/Math.PI
this.r=95
this._x=Math.cos(this.a*(Math.PI/180))*this.r+Stage.width/2
this._y=Math.sin(this.a*(Math.PI/180))*this.r+Stage.height/2
}
}
// by Techmaker (newtech@front.ru)
:) ;)

dee2
04.11.2003, 14:13
типа этого
решено с помошью уравнения пифагора

dee2
04.11.2003, 14:21
2 Techmaker:

у меня код значительно попроще...
это я тупее или круче получаюсь? :D :D :D

Techmaker
04.11.2003, 15:14
Оригинал написал(а) dee2
у меня код значительно попроще...
это я тупее или круче получаюсь? :D :D :D
что то у тебя двигается как то рывками да и стопорится при переходе на 360...
а у меня всё плавно, к тому же у меня ещё код не относящийся к теме, добавлен просто для нагляности границ:
/* функция рисования nuran'а
уже 3'тий раз на форуме пишу, использую для рисования окружности, чтобы было видно границы */
MovieClip.prototype.circle = function(x, y, r) {
var mas = new Array();
var step = 16;
var angle = 360/step;
var rad = Math.PI/180;
for (var i = 0; i<=step; i++) {
mas[i] = new Object();
mas[i].x = Math.cos(angle*rad*i)*r+x;
mas[i].y = Math.sin(angle*rad*i)*r+y;
}
this.moveTo(mas[0].x, mas[0].y);
for (var i = 0; i<step; i += 2) {
// curveThreeTo
var cx = 2*mas[i+1].x-0.5*(mas[i].x+mas[i+2].x);
var cy = 2*mas[i+1].y-0.5*(mas[i].y+mas[i+2].y);
this.curveTo(cx, cy, mas[i+2].x, mas[i+2].y);
}
};

this.createEmptyMovieClip("circle1",500)
with(circle1){
lineStyle(5,0x000000,100)
circle(0,0,100)
_x=Stage.width/2
_y=Stage.height/2
}
и возможность движения внутри окружности с проверкой:
mc.onEnterFrame=function(){
this.delta_x=Stage.width/2-_xmouse
this.delta_y=Stage.height/2-_ymouse
if(Math.sqrt(this.delta_x*this.delta_x+this.delta_y*this.delta_y)<95){
this._x=_xmouse
this._y=_ymouse
}/*...*/
}

итого, без этого всего, остаётся код по теме:
with(this.createEmptyMovieClip("mc",1)){
lineStyle(5,0xFF0000,100)
lineTo(.5,.5)
}

mc.onEnterFrame=function(){
this.delta_x=Stage.width/2-_xmouse
this.delta_y=Stage.height/2-_ymouse
this.a=180+(Math.atan2(this.delta_y,this.delta_x)*180)/Math.PI
this.r=95
this._x=Math.cos(this.a*(Math.PI/180))*this.r+Stage.width/2
this._y=Math.sin(this.a*(Math.PI/180))*this.r+Stage.height/2
}
// by Techmaker (newtech@front.ru) так у кого проще, у кого короче, у кого правильнее? :)

2K WebStudio
04.11.2003, 16:04
Techmarker!
Я твой код ещё не стал разбирать, но. кажется, окружность ты строишь по определённым координатам, а границы движения проводишь взависимости от Stage!
Просто разверни окашко нра весь экран:)

dee2
04.11.2003, 16:08
а так? :)

Techmaker
04.11.2003, 16:15
Оригинал написал(а) 2K WebStudio
Techmarker!
Я твой код ещё не стал разбирать, но. кажется, окружность ты строишь по определённым координатам, а границы движения проводишь взависимости от Stage!
Просто разверни окашко нра весь экран:)
это не так уж и важно, я просто сделал движок :) координаты указываёте свои :)

Techmaker
04.11.2003, 16:17
Оригинал написал(а) dee2
а так? :)
номана :)

Techmaker
06.11.2003, 03:27
Оригинал написал(а) 2K WebStudio
Techmarker!
Я твой код ещё не стал разбирать, но. кажется, окружность ты строишь по определённым координатам, а границы движения проводишь взависимости от Stage!
Просто разверни окашко нра весь экран:)
ха, а ты проверь вне редактора флэш :) ну что кто не прав? :) :D

старина смерть
06.11.2003, 09:37
MovieClip.prototype.circle = function(x, y, r) {
var mas = new Array();
var step = 16;
var angle = 360/step;
var rad = Math.PI/180;
for (var i = 0; i<=step; i++) {
mas[i] = new Object();
mas[i].x = Math.cos(angle*rad*i)*r+x;
mas[i].y = Math.sin(angle*rad*i)*r+y;
}
this.moveTo(mas[0].x, mas[0].y);
for (var i = 0; i<step; i += 2) {
// curveThreeTo
var cx = 2*mas[i+1].x-0.5*(mas[i].x+mas[i+2].x);
var cy = 2*mas[i+1].y-0.5*(mas[i].y+mas[i+2].y);
this.curveTo(cx, cy, mas[i+2].x, mas[i+2].y);
}
};

_root.onLoad = function() {
fscommand("allowscale", false);
cnx = Stage.width/2;
cny = Stage.height/2;
// precalculations
rad = Math.PI/180;
radius = 100;
dot_radius = 20;
preRadius = radius-dot_radius;
preRad = 180*rad;
// axises
_root.createEmptyMovieClip("back", 1);
back.lineStyle(0, 0xFF0000, 100);
back.moveTo(cnx, cny-cny/1.1);
back.lineTo(cnx, cny+cny/1.1);
back.lineStyle(0, 0x00FF00, 100);
back.moveTo(cnx-cnx/1.1, cny);
back.lineTo(cnx+cnx/1.1, cny);
// back circle
_root.createEmptyMovieClip("bg", 2);
bg.lineStyle(0, 0xFFFFFF, 100);
bg.circle(0, 0, 100);
bg._x = cnx;
bg._y = cny;
// dot
_root.createEmptyMovieClip("dot", 3);
dot.beginFill(0x0000FF, 100);
dot.circle(0, 0, dot_radius);
dot._x = cnx;
dot._y = cny;
dot.endFill();
// text
_root.createTextField("text", 4, cnx+5, cny, 300, 20);
format = new TextFormat();
format.color = 0xFFFFFF;
format.font = "Verdana";
format.size = 14;
text.text = "click and move your mouse";
text.setTextFormat(format);
};

// ######################################################
// -- © 2003 Grigory A. Ryabov.
// -- http://www.flash.plux.ru
// -- Techmaker: Aleksey Shreider 8=)
// ######################################################

_root.onMouseDown = function() {
start = 1;
};

_root.onMouseUp = function() {
start = 0;
};

_root.onEnterFrame = function() {
var dx = cnx-_xmouse;
var dy = cny-_ymouse;
if (Math.sqrt(dx*dx+dy*dy)<=preRadius) {
dot._x = _xmouse;
dot._y = _ymouse;
} else {
angle = Math.atan2(dy, dx)-preRad;
dot._x = Math.cos(angle)*preRadius+cnx;
dot._y = Math.sin(angle)*preRadius+cny;
}
if (start) {
var dx = cnx-_xmouse;
var dy = cny-_ymouse;
radius = Math.sqrt(dx*dx+dy*dy);
preRadius = radius-dot_radius;
bg._xscale = bg._yscale=radius;
}
};

По ошибке этот же код кинул в другой топ, уже не помню где...