Просмотр полной версии : Работа с экземплярами
BLOOD585
28.12.2010, 16:47
Всем день добрый! В общем есть некий экземпляр ball в библиотеке и каждый раз при нажатии мышки он аттачицца на сцену с именем "ball"+i. У каждого шарика есть ряд свойств: скорость, эластичность итд.
В каждом кадре необходимо проделывать с каждым шариком определенные действия в зависимости от его свойств. Каким образом удобнее это оргинизовать? Получается с одним делать но их может быть любое количество.
Добавлено через 2 часа 6 минут
Может классами как в АС3
rainbowrussia
28.12.2010, 23:56
В каждом кадре необходимо проделывать с каждым шариком определенные действия в зависимости от его свойств. Каким образом удобнее это оргинизовать?
Циклом for (j=1; j<=maxi; j++) { this["ball"+j]._alpha = ...; } например. Или _root[..], смотря где и как пишете и куда аттачите.
BLOOD585
31.12.2010, 21:49
А каким образом лучше организовать хранение параметров каждого нового объекта и соответственно обращение к ним при выполнении действий над объектом?
rainbowrussia
31.12.2010, 23:26
Можно хранить прямо в каждом мувиклипе, например this["ball"+j].myParam1.
BLOOD585
10.01.2011, 17:03
Подскажите пожалуйста значение this.ball3.vx?0:2
for( var i=0;i<4;i++) this['ball'+i].vx=this['ball'+i].vy=this.ball3.vx?0:2;
rainbowrussia
10.01.2011, 19:03
this.ball3.vx?0:2 это "если this.ball3.vx истина, то 0 иначе 2". Другими словами
for( var i=0;i<4;i++) {
if (this.ball3.vx) {
this['ball'+i].vx = 0;
this['ball'+i].vy = 0;
} else {
this['ball'+i].vx = 2;
this['ball'+i].vy = 2;
}
}
BLOOD585
11.01.2011, 00:49
Нашел хороший исходник по столкновению мячей, но там изначально сталкиваются 4 мяча уже выложенные на сцену. Попытался переделать чтобы мячи появлялись при нажатии мыши и любое количество, но мячи просто стоят теперь.
Первоначальный код:
var col:Number=4;//Количество мячей
MovieClip.prototype.kick=function(ball){
var fi=Math.atan2(ball.y-this.y,ball.x-this.x);
var adir=Math.atan2(this.vy,this.vx);
var bdir=Math.atan2(ball.vy,ball.vx);
var av=Math.sqrt(this.vx*this.vx+this.vy*this.vy);
var bv=Math.sqrt(ball.vx*ball.vx+ball.vy*ball.vy);
var vn=av*Math.sin(adir-fi+Math.PI/2)-bv*Math.sin(bdir-fi+Math.PI/2);
var dv1=-2*ball.m/(this.m+ball.m)*vn;
var dv2=2*this.m/(this.m+ball.m)*vn;
this.vx+=dv1*Math.cos(fi);
this.vy+=dv1*Math.sin(fi);
ball.vx+=dv2*Math.cos(fi);
ball.vy+=dv2*Math.sin(fi);
}
MovieClip.prototype.ballMove=function(){
for(var j=this.id+1;j<col;j++){
var other=balls[j];
var dx=this.x+this.vx-other.x-other.vx;
var dy=this.y+this.vy-other.y-other.vy;
if(Math.abs(dx)+Math.abs(dy)<this.r+other.r){
var fi=Math.atan2(dy,dx);
other._x=this.x-(this.r+other.r+1)*Math.cos(fi);
other._y=this.y-(this.r+other.r+1)*Math.sin(fi);
this.kick(other);
}
}
if(this.x+this.r+this.vx>200 || this.x-this.r+this.vx<0) this.vx*=-1
if(this.y+this.r+this.vy>80 || this.y+this.vy-this.r<0) this.vy*=-1
if(this.x+this.r>200)this._x=199-this.r;
if(this.x-this.r<0)this._x=this.r+1;
if(this.y+this.r>80)this._y=79-this.r;
if(this.y-this.r<0)this._y=this.r+1;
this.x=this._x+=this.vx;
this.y=this._y+=this.vy;
}
_root.onMouseUp=function(){
for( var i=0;i<col;i++) this['ball'+i].vx=this['ball'+i].vy=this["ball"+col].vx?0:2;
}
for(var i=0,balls=[];i<col;i++){
var b=this['ball'+i];
balls.push(b);
b.r=b._height/2;//Радиус
b.m=b.r//масса (условно)
b.id=i;
b.vx=b.vy=0;
b.x=b._x;
b.y=b._y;
b.onEnterFrame=ballMove;
}
Мои попытки
var col:Number=0;//количество шаров
MovieClip.prototype.kick=function(ball){
//То же самое
}
MovieClip.prototype.ballMove=function(){
for(var j=this.id+1;j<col;j++){
//То же самое
}
_root.onMouseDown = function(){
col+=1;
this.attachMovie("ball","ball"+col,col);
this["ball"+col]._height=Math.random()*20+15;
this["ball"+col]._width=this["ball"+col]._height;
this["ball"+col]._y=_ymouse;
this["ball"+col]._x=_xmouse;
}
_root.onMouseUp = function(){
for( var i=0;i<4;i++) this['ball'+i].vx=this['ball'+i].vy=this["ball"+col].vx?0:2;
}
_root.onEnterFrame=function(){
for(var i=0,balls=[];i<col;i++){
var b=this['ball'+i];
balls.push(b);
b.r=b._height/2;//Радиус
b.m=b.r//масса (условно)
b.id=i;
b.vx=0;
b.vy=0;
b.x=b._x;
b.y=b._y;
b.ballMove;
}
}
BLOOD585, вы что трафик на пробелах экономите? Бинарные операторы хотя-бы отделяли от операндов, иначе ваш код читать невозможно. За табуляцию хоть спасибо.
BLOOD585
11.01.2011, 01:17
Здесь сами функции читать не надо они готовые без изменений остались, над чтобы шарики при нажатии появлялись)) Моя только функция при нажати
BLOOD585
11.01.2011, 11:59
Вот исходник
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.