Показать сообщение отдельно
Старый 11.01.2011, 00:49
BLOOD585 вне форума Посмотреть профиль Отправить личное сообщение для BLOOD585 Найти все сообщения от BLOOD585
  № 7  
Ответить с цитированием
BLOOD585

Регистрация: May 2009
Сообщений: 33
Нашел хороший исходник по столкновению мячей, но там изначально сталкиваются 4 мяча уже выложенные на сцену. Попытался переделать чтобы мячи появлялись при нажатии мыши и любое количество, но мячи просто стоят теперь.
Первоначальный код:
Код AS1/AS2:
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;
 
}
Мои попытки
Код AS1/AS2:
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; 11.01.2011 в 01:20.