PDA

Просмотр полной версии : Свободно плавающий мувик


grun
07.01.2008, 12:05
Я не очень то шарю в action script'е, поэтому люди добрые помогите!

Задача такова - есть мувик(логотип), он должен произвольно ездить по странице стукаясь о края, при этом издавать звук, при наведении на него он должен останавливаться и увеличиваться.

Вообщем аналогично http://wacom.com/index.html

Очень нужно ребят! Выручайте!

MrPoma
07.01.2008, 12:14
var w:Number =Stage.width;
var h:Number = Stage.height;

var dx:Number = 5;
var dy:Number = 5;

mc.onRollOver = function(){
delete this.onEnterFrame;
_xscale = _yscale = 110;
}

mc.onRollOut = function(){
_xscale = _yscale = 100;
move();
}

function move():Void{
mc.onEnterFrame = function(){
if(_x>(w-_width/2) || _x<_width/2){
dx *= -1;
//проиграть звук
}

if(_y>(h-_height/2) || _y<_height/2){
dy *= -1;
//проиграть звук
}
_x += dx;
_y += dy;
}
}

move();

screamge
07.01.2008, 12:38
grun, не нужно множить темы в разных разделах, достаточно в одном один раз написать.

grun
07.01.2008, 13:28
MrPoma, спасибо большое за ответ, но не мог бы ты более полно скрипт написать, ато вроде опробовал а мувик тупо дергается на месте вверх вниз. я в АС почти нуль. Заранее большое спасибо!

MrPoma
07.01.2008, 13:35
дык проверьте. вытаскиваете логотип на сцену, обзываете его mc и вставляете код в кадр.

зы. возможно он не работает. не проверял

grun
07.01.2008, 13:38
Проверил, дергается на месте

MrPoma
07.01.2008, 13:59
что у вас стоит в настройках публикации?

grun
07.01.2008, 14:17
MrPoma, AS2 - если про это, флеш cs3
ВОт это нашел в исходниках здесь(bukvaM - трехмерная буква вращается), мб отсюда можно как то выдернуть что мне нужно
gCorners = new Array();
gCorners[0] = [-50, -50, -20];
gCorners[1] = [-16, -50, -20];
gCorners[2] = [0.5, 16, -20];
gCorners[3] = [16, -50, -20];
gCorners[4] = [50, -50, -20];
gCorners[5] = [50, 50, -20];
gCorners[6] = [27, 50, -20];
gCorners[7] = [27, -27, -20];
gCorners[8] = [9, 50, -20];
gCorners[9] = [-9, 50, -20];
gCorners[10] = [-27, -27, -20];
gCorners[11] = [-27, 50, -20];
gCorners[12] = [-50, 50, -20];
//
for (i=13; i<26; i++) {
gCorners[i] = [gCorners[i-13][0], gCorners[i-13][1], 20];
}
gCorners[26] = [0.1, 0.1, 20];
gCorners[27] = [0.1, -20, 0.1];
gCorners[28] = [20, 0.1, 0.1];
gCorners[29] = [Math.cos(13.5*Math.PI/180)*20, -Math.sin(13.5*Math.PI/180)*20, 0.1];
gCorners[30] = [Math.cos(13.5*Math.PI/180)*20, Math.sin(13.5*Math.PI/180)*20, 0.1];
//
gRectList = new Array();
gRectList[0] = [0, 1, 14, 13, 1];
gRectList[1] = [1, 2, 15, 14, 3];
gRectList[2] = [2, 3, 16, 15, 4];
gRectList[3] = [3, 4, 17, 16, 1];
gRectList[4] = [4, 5, 18, 17, 2];
gRectList[5] = [5, 6, 19, 18, 1];
gRectList[6] = [6, 7, 20, 19, 2];
gRectList[7] = [7, 8, 21, 20, 4];
gRectList[8] = [8, 9, 22, 21, 1];
gRectList[9] = [9, 10, 23, 22, 3];
gRectList[10] = [10, 11, 24, 23, 2];
gRectList[11] = [11, 12, 25, 24, 1];
gRectList[12] = [12, 0, 13, 25, 2];
//
orden = new Array();
orden[0] = [4, 6, 3, 2, 1, 9, 0, 12];
orden[1] = [12, 10, 0, 1, 2, 7, 3, 4];
orden[2] = [5, 6, 7, 2, 8, 9, 11, 12];
orden[3] = [11, 10, 9, 1, 8, 7, 5, 4];
incremento1 = 2;
incremento2 = 2;
//
rojo = 255;
verde = 255;
azul = 0;
gCenter1 = 220;
gCenter2 = 180;
//
function plotPoint(objectInfo) {
x = objectInfo[0];
y = objectInfo[1];
z = objectInfo[2];
radius1 = Math.sqrt(x*x+y*y);
if (x == 0.0) {
angle = Math.atan(2000000);
} else {
angle = Math.atan(y/x);
}
if (x<0) {
angle = Math.PI+angle;
}
angle = angle+gRotate;
realX = radius1*Math.cos(angle);
realY = radius1*Math.sin(angle);
radius2 = Math.sqrt(realX*realX+z*z);
if (realX == 0) {
angle2 = Math.atan(2000000);
} else {
angle2 = (Math.atan(z/realX));
}
if (realX<0) {
angle2 = Math.PI+angle2;
}
angle2 = angle2-gPlane;
screenX = radius2*Math.cos(angle2);
screenY = realY;
screenZ = radius2*Math.sin(angle2);
puntox = screenX+gCenter1;
if (puntox<=0) {
incremento1 = Math.abs(incremento1);
}
if (puntox>=400) {
incremento1 = -Math.abs(incremento1);
}
puntoy = screenY+gCenter2;
if (puntoy<=0) {
incremento2 = Math.abs(incremento2);
}
if (puntoy>=400) {
incremento2 = -Math.abs(incremento2);
}
puntoz = screenZ;
point = [puntox, puntoy, puntoz];
return (point);
}
function frameScript() {
gRotate = gRotate-((_root._xmouse-gCenter1)/60)*Math.PI/180;
gPlane = gPlane-((_root._ymouse-gCenter2)/30)*Math.PI/180;
gCenter1 += incremento1;
gCenter2 += incremento2;
puntos = new Array();
for (i=0; i<gCorners.length; i++) {
temp = plotPoint(gCorners[i]);
puntos[i] = temp;
}
if (puntos[0][2]>puntos[4][2]) {
if (puntos[0][2]>puntos[12][2]) {
clave = 0;
} else {
clave = 2;
}
} else {
if (puntos[0][2]>puntos[12][2]) {
clave = 1;
} else {
clave = 3;
}
}
if (puntos[0][2]<puntos[13][2]) {
pos = 13;
} else {
pos = 0;
}
rojo = Math.abs(puntos[26][2])*10+50;
verde = Math.abs(puntos[26][2])*5+50;
rojo1 = Math.abs(puntos[27][2])*10+50;
verde1 = Math.abs(puntos[27][2])*5+50;
rojo2 = Math.abs(puntos[28][2])*10+50;
verde2 = Math.abs(puntos[28][2])*5+50;
rojo3 = Math.abs(puntos[29][2])*10+50;
verde3 = Math.abs(puntos[29][2])*5+50;
rojo4 = Math.abs(puntos[30][2])*10+50;
verde4 = Math.abs(puntos[30][2])*5+50;
_root.createEmptyMovieClip("eme", 10);
with (_root.eme) {
beginFill((rojo << 16 | verde << 8 | azul), 100);
moveTo(puntos[0+pos][0], puntos[0+pos][1]);
for (i=1; i<13; i++) {
lineTo(puntos[i+pos][0], puntos[i+pos][1]);
}
endFill();
}
for (i=0; i<orden[clave].length; i++) {
thisRect = gRectList[orden[clave][i]];
q = [puntos[thisRect[0]], puntos[thisRect[1]], puntos[thisRect[2]], puntos[thisRect[3]]];
_root.createEmptyMovieClip("cuadrado"+i, i+1);
with (_root["cuadrado"+i]) {
beginFill((_root["rojo"+gRectList[orden[clave][i]][4]] << 16 | _root["verde"+gRectList[orden[clave][i]][4]] << 8 | azul), 100);
moveTo(q[0][0], q[0][1]);
lineTo(q[1][0], q[1][1]);
lineTo(q[2][0], q[2][1]);
lineTo(q[3][0], q[3][1]);
endFill();
}
}
}
stop();

MrPoma
07.01.2008, 14:22
у-у-у.. даже разбираться неохото. попробуйте разобраться с кодом (пост №2). там ничего сложного. используйте trace()

grun
08.01.2008, 13:26
MrPoma, никак не работает!!! =( Помогите пожалуйста!

MrPoma
08.01.2008, 19:05
скройте часть кода комментаием/* */. работает? открывайте скрытую часть постепнно и исправляйте по мере нахождения ошибок

например:
var w:Number =Stage.width;
var h:Number = Stage.height;

var dx:Number = 5;
var dy:Number = 5;

mc.onRollOver = function(){
delete this.onEnterFrame;
_xscale = _yscale = 110;
}

mc.onRollOut = function(){
_xscale = _yscale = 100;
move();
}

function move():Void{
mc.onEnterFrame = function(){
_x += dx;
_y += dy;
}
}

Maxipaladin
08.01.2008, 21:47
я не оч понял код... поясните мне плиз

var w:Number =Stage.width;
это создаётся переменная "w" которая имеет числовое значение, и оно равно ширине чего?

mc.onRollOver = function(){
delete this.onEnterFrame; // удаляется что?
_xscale = _yscale = 110; // что такое "scale"?
}

screamge
08.01.2008, 22:22
Maxipaladin, оформите код тэгами .

Ostgur
08.01.2008, 22:26
Stage.width — ширина экрана ролика;
delete this.onEnterFrame; — удаляется
mc.onEnterFrame = function(){
_x += dx;
_y += dy;
}

_xscale — размер чего-либо по х;

D12
09.01.2008, 01:42
var Go:Array = [3, 5, 7];
var __x:Number = Go[1];
var __y:Number = Go[1];
//
var __q:Number = 1;
var __a:Number = 1;
//
var controll_Go:Number = 0;
///
///
var ball:MovieClip = this.createEmptyMovieClip("ball", this.getNextHighestDepth());
with (ball) {
lineStyle(0.25, 0x000000);
beginFill(0x0099CC);
moveTo(-12, -12);
lineTo(-12, -12);
lineTo(12, -12);
lineTo(12, 12);
lineTo(-12, 12);
endFill();
}
ball._x = Stage.width/2;
ball._y = Stage.height/2;
///
///
ball.onEnterFrame = function() {
if (controll_Go == 0) {
this._x -= __x;
this._y -= __y;
if (this._y>=Stage.height-(this._height/2) || this._y<=this._height/2) {
__q = -__q;
__y = Go[random(Go.length)]*__q;
}
if (this._x>=Stage.width-(this._width/2) || this._x<=this._width/2) {
__a = -__a;
__x = Go[random(Go.length)]*__a;
}
}
};
///
///
ball.onRollOut = function() {
controll_Go = 0;
this._xscale = this._yscale=100;
};
//
ball.onRollOver = function() {
controll_Go = 1;
this._xscale = this._yscale=250;
};



Годится ?


Приятной ночи

__Des
09.01.2008, 07:30
/* при минимальных правках в первом приведенном коде:
в теле функции перед _x, _y, _width, _height ставим this.
в конце (предполагая, что таймлайн из одного фрейма) - stop();
*/
var dx:Number = 5;
var dy:Number = 5;

mc.onRollOver = function(){
delete this.onEnterFrame;
_xscale = _yscale = 110;
}

mc.onRollOut = function(){
_xscale = _yscale = 100;
move();
}

function move():Void{
mc.onEnterFrame = function(){
if(this._x>(w-this._width/2) || this._x<this._width/2){
dx *= -1;
//проиграть звук
}

if(this._y>(h-this._height/2) || this._y<this._height/2){
dy *= -1;
//проиграть звук
}
this._x += dx;
this._y += dy;
}
}

move();
stop();

MrPoma
09.01.2008, 08:27
зачем там stop(), если на таймлайне один кадр??

__Des
09.01.2008, 14:29
Хм. MrPoma, а интересный вопрос...
вы знаете, по привычке. Очевидно, дурной. Забыл уже, когда и по какой причине приобретенной - всегда тормозить ролик "вручную", если мне не нужно, чтобы он проигрывался, и всегда прописывать gotoAndPlay(), если нужно, чтобы циклился.
Вы сподвигли меня померять память/проц ресурсы в двух вариантах и FPS. Должен признать - ноль разницы.
Так что спасибо за корректуру - буду избавляться от дурной привычки :)

etc
09.01.2008, 14:30
__Des, отредактируйте свой пост и оформите код тегами .

grun
09.01.2008, 15:16
Спасибо большое всем! Теперь это уже работает... Буду изучать =\ Пора AS учить ато задачи начали возникать неразрешимые одной таймлайн анимацией =)

Огромнейшее спасибо D12!! Работает нормально =) Только вот, в зависимости от размера обькта почему то границы меняются, т.е. увеличиваю обьект и стукаться уже начинает не об стенки... Обьясните пожалуйста поподробнее... И еще нельзя ли сюда звучек приписать чтобы при стукании об эти самые стенки игрался =)

_Des, да теперь работает, вот только при наведении как то дергается все равно....

__Des
09.01.2008, 17:00
var ctrl:MovieClip = createEmptyMovieClip("ctr", _root.getNextHighestDepth());

и вместо _xscale = _yscale = 110 -

ctrl.onEnterFrame = function(){
if (mc._xscale < 110) {
mc._xscale+=1;
mc._yscale+=1;
} else {
delete ctrl.onEnterFrame;
}
}

а вместо _xscale = _yscale = 100 -

ctrl.onEnterFrame = function(){
if (mc._xscale > 100) {
mc._xscale-=1;
mc._yscale-=1;
} else {
delete ctrl.onEnterFrame;
}
}

grun
10.01.2008, 15:18
_Des, Спасибо большое! А на счет границ не проясните ситуацию? Т.е. сверху и справа не доходит до краев, а снизу и слева заходит за границу размера документа, как то можно это поброть?

Ostgur
10.01.2008, 15:24
var my_mc:MovieClip = this.createEmptyMovieClip("my_mc", this.getNextHighestDepth());
var movie_sound:Sound = new Sound(my_mc);
movie_sound.attachSound("lineage_name_from_library");


...
} else {
delete ctrl.onEnterFrame;
movie_sound.start();
}
...

D12
10.01.2008, 22:16
Вот держи всё изправил , теперь можешь смело менять размеры, и звук добавил :)

var Go:Array = [3, 5, 7];
var __x:Number = Go[1];
var __y:Number = Go[1];
//
var __q:Number = 1;
var __a:Number = 1;
//
var controll_Go:Number = 0;
//
var Soun:Sound = new Sound();
Soun.attachSound("click1");
var Soun1:Sound = new Sound();
Soun1.attachSound("Beep");
///
///
var ball:MovieClip = this.createEmptyMovieClip("ball", this.getNextHighestDepth());
with (ball) {
lineStyle(0.25, 0x000000);
beginFill(0x0099CC);
moveTo(-35, -12);
lineTo(-35, -12);
lineTo(35, -12);
lineTo(35, 12);
lineTo(-35, 12);
endFill();
}
ball._x = Stage.width/2;
ball._y = Stage.height/2;
///
///
ball.onEnterFrame = function() {
if (controll_Go == 0) {
this._x -= __x;
this._y -= __y;
if (this._y+(this._height/2)>=Stage.height) {
this._y = Stage.height-(this._height/2);
}
if (this._y-(this._height/2)<=0) {
this._y = 0+(this._height/2);
}
if (this._y == 0+(this._height/2) || this._y == Stage.height-(this._height/2)) {
__q = -__q;
__y = Go[random(Go.length)]*__q;
Soun.start(0, 1);
}
//
if (this._x+(this._width/2)>=Stage.width) {
this._x = Stage.width-(this._width/2);
}
if (this._x-(this._width/2)<=0) {
this._x = 0+(this._width/2);
}
if (this._x == 0+(this._width/2) || this._x == Stage.width-(this._width/2)) {
__a = -__a;
__x = Go[random(Go.length)]*__a;
Soun.start(0, 1);
}
}
};
///
///
ball.onRollOut = function() {
controll_Go = 0;
this._xscale = this._yscale=100;
Soun1.start(0, 1);
};
//
ball.onRollOver = function() {
controll_Go = 1;
this._xscale = this._yscale=250;
Soun1.start(0, 1);
};

grun
11.01.2008, 15:53
_D12, Спасибо Вам огромнейшее! Респект как говорится и уважуха.
Вот только есть у меня большая просьба к Вам! Пожалуйста выручайте!
Нужно:
3 отдельно аналогично движущихся кружка с заливкой прозрачностью 85%. При наведении так же увеличиваются, вот только надпись еще нужно чтобы появлялась при наведении. Они должны быть ссылками.
И возможно ли сюда сделать startdrag? т.е. чтобы пользователь мог их швырять?
Спасибо огромнейшее!
Выручите!

Aziz Zaynutdinoff
11.01.2008, 16:15
почему же вы сами не хотите этого сделать? за вас уже проделана немалая работа, а в ответ лишь «респект как говорится и уважуха». Сами-то, небось, за это деньги получаете. Сходите в вакансии... там вы быстро найдете отклик.

grun
11.01.2008, 17:05
Aziz Zaynutdinoff, нет за это денег я не получаю, и это лишь малая часть того что мне нужно сделать. Мне нужно сделать целый сайт. Я спрашиваю лишь то в чем действительно нуждаюсь и не понимаю. Я собираюсь изучать AS и обязательно буду это делать, но сейчас сроки очень сильно поджимают.
И в конце концов есть же добрые люди, которые готовы помочь... А не которые просто ищут возможности заработать...

Fernando Costa
11.01.2008, 17:13
Aziz Zaynutdinoff, нет за это денег я не получаю, и это лишь малая часть того что мне нужно сделать. Мне нужно сделать целый сайт. Я спрашиваю лишь то в чем действительно нуждаюсь и не понимаю. Я собираюсь изучать AS и обязательно буду это делать, но сейчас сроки очень сильно поджимают.
И в конце концов есть же добрые люди, которые готовы помочь... А не которые просто ищут возможности заработать...
вы уже нашли возможность заработать а терперь ищите добрых людей которые за вас все сделают ???

grun
11.01.2008, 17:40
Fernando Costa, я же написал что денег я не получаю. И какую же это я нашел возможность заработать?

Fernando Costa
11.01.2008, 17:55
"Мне нужно сделать целый сайт...", "...но сейчас сроки очень сильно поджимают."

Понимаете - у вас просто не вопросы программиста, а вопросы типа: помогите сделать так, сделали? спасибо, а сделайте еще так.

Ну как бы так не красиво...

D12
12.01.2008, 01:00
var i:Number = 0;
var __number:Number = 3;
var Go:Array = [3, 5, 7];
var Go_start:Array = [1, -1];
//
var Soun:Sound = new Sound();
Soun.attachSound("click1");
var Soun1:Sound = new Sound();
Soun1.attachSound("Beep");
//
function onEnterFrame():Void {
while (i<__number) {
var ball:MovieClip = this.createEmptyMovieClip("ball"+i, i);
ball.lineStyle(0.25, 0x000000);
ball.beginFill(0x0099CC);
ball.moveTo(-35, -12);
ball.lineTo(-35, -12);
ball.lineTo(35, -12);
ball.lineTo(35, 12);
ball.lineTo(-35, 12);
ball.endFill();
ball._x = Stage.width/2;
ball._y = Stage.height/2;
ball.__x = Go[random(Go.length)]*Go_start[random(Go_start.length)];
ball.__y = Go[random(Go.length)]*Go_start[random(Go_start.length)];
ball.__q = 1;
ball.__a = 1;
ball.__w = __number;
ball.controll_Go = 0;
ball.onEnterFrame = mx.utils.Delegate.create(ball, onBallEnterFrame);
i += 1;
}
}
function onBallEnterFrame():Void {
if (this.controll_Go == 0) {
this._x -= this.__x;
this._y -= this.__y;
if (this._y+(this._height/2)>=Stage.height) {
this._y = Stage.height-(this._height/2);
}
if (this._y-(this._height/2)<=0) {
this._y = 0+(this._height/2);
}
if (this._y == 0+(this._height/2) || this._y == Stage.height-(this._height/2)) {
this.__q = -this.__q;
this.__y = Go[random(Go.length)]*this.__q;
Soun.start(0, 1);
}
//
if (this._x+(this._width/2)>=Stage.width) {
this._x = Stage.width-(this._width/2);
}
if (this._x-(this._width/2)<=0) {
this._x = 0+(this._width/2);
}
if (this._x == 0+(this._width/2) || this._x == Stage.width-(this._width/2)) {
this.__a = -this.__a;
this.__x = Go[random(Go.length)]*this.__a;
Soun.start(0, 1);
}
}
//
this.onRollOut = function() {
this.controll_Go = 0;
this._xscale = this._yscale=100;
this.swapDepths(this.__w);
Soun1.start(0, 1);
};
this.onRollOver = function() {
this.controll_Go = 1;
this._xscale = this._yscale=250;
this.swapDepths(this.__w+1);
Soun1.start(0, 1);
};
}

где вам нужны ссылки ?

хваталку сделать можно но мне кажется это глупо и лишнее, сомневаюсь что ктото догадается без подсказки

grun
13.01.2008, 14:45
D12, Спасибо Вам огромнейшее!!!
Ссылки нужны на самих обьекта (прямоуголниках) при нажатии на них.
Я думаю тут обычный getUrl прописать?
А нельзя ли прямоугольники все же кружочками заменить с alpha 85%.
Ато что-то никак не могу нарисовать их =(
! А вот с хваталкой - ну оочень нужно! Если возможно помогите!

Fernando Costa, я итак не программист.

MrPoma
13.01.2008, 16:16
А нельзя ли прямоугольники все же кружочками заменить с alpha 85%.
Ато что-то никак не могу нарисовать их =(
я итак не программист.
а кто тогда?

D12
13.01.2008, 18:13
что должно быть на кружках ? что нужно написать ? как вы понимаете ссылку в чистом виде незатолкать

три кружка хначит три ссылки , какие ? и куда ?

grun
13.01.2008, 18:25
D12, написать то что угодно, я потом поправлю, надо чтобы надпись появлялась только при наведении, ну а ссылки будут на страницы html отделные, открывать нужно в этом же окне(не в новом)
Спасибо большое заранее!!!!!!