amoremio
member
ID 32666
11/16/2007
Nhạc Flash: Trống Cơm - Cách vẽ nhện bằng code
Trống cơm
Dân ca Quan Họ Bắc Ninh
Tình bằng có cái trống cơm
Khen ai khéo vỗ
Ố mấy bông mà nên bông
Ố mấy bông mà nên bông
Một đàn tang tình con nít
Một đàn tang tình con nít
Ố mấy lội, lội, lội sông
Ố mấy đi tìm, em nhớ thương ai
Đôi con mắt ố mấy lim dim
Đôi con mắt ố mấy lim dim
Một bầy tang tình con nhện
Ô ố ô ô mấy giăng tơ
Giăng tơ ô mấy đi tìm, em nhớ thương ai
Duyên nợ khách tang bồng
Duyên nợ khách tang bồng...
Xin chân thành cảm ơn các tác giả Robert Penner, Adam Bowman đã giúp Phượng Các học hỏi được cách thức vẽ hình bằng code
* Cách làm:
Trên Timeline, tạo layer mới và chọn frame thứ 6 của flash nhạc (hoặc frame nào khác tùy ý muốn cho xuất hiện nhện) và đưa code sau vào.
Math.easeInOutQuad = function (t, b, c, d){
if ((t/=d/2) <1) return c/2*t*t + b;
return -c/2 * ((--t)*(t-2)-1) + b;
};
Math.fixAngle = function (angle) {
angle %= 360;
return (angle < 0) ? angle + 360 : angle;
};
numWalkers=3;
stride=50;
legHeight=8;
buffer=50;
stepHeight=6;
//frames between steps
wait=2;
//make sure the number of legs is even
walkCycle=new Array({leg:"R2",length:35},{leg:"L1",length:25},{leg:"L3",length:30},{leg:"R4",length:25},{leg:"R1",length:25},{leg:"L2",length:35},{leg:"R3",length:30},{leg:"L4",length:25});
numLegs = walkCycle.length;
for(i=1;i<=_root.numWalkers;i++){
_root.createEmptyMovieClip("body"+i,depth++);
for(j=0;j<_root.numLegs;j++){
_root["body"+i].createEmptyMovieClip(_root.walkCycle[j].leg,depth++);
_root["body"+i][_root.walkCycle[j].leg].length=_root.walkCycle[j].length;
}
_root["body"+i]._x=Math.random()*Stage.width;
_root["body"+i]._y=Math.random()*Stage.height;
_root["body"+i].angle=_root["body"+i]._rotation=Math.random()*360;
_root["body"+i].resetMove=function(){
for(j=1;j<=(_root.numLegs/2);j++){
delete this["R"+j].onEnterFrame;
delete this["L"+j].onEnterFrame;
this["R"+j].beginX=false;
this["L"+j].beginX=false;
this["R"+j].time=0;
this["L"+j].time=0;
}
this.setLegs();
};
_root["body"+i].setLegs=function(){
var legAngle = 360/(2+_root.numLegs);
for(j=1;j<=(_root.numLegs/2);j++){
this["R"+j].shadow_x=this["R"+j].x=this._x-(Math.sin((this.angle-90+(legAngle*j))*(Math.PI/180))*this["R"+j].length);
this["R"+j].shadow_y=this["R"+j].y=this._y+(Math.cos((this.angle-90+(legAngle*j))*(Math.PI/180))*this["R"+j].length);
this["L"+j].shadow_x=this["L"+j].x=this._x+(Math.sin((this.angle+90-(legAngle*j))*(Math.PI/180))*this["L"+j].length);
this["L"+j].shadow_y=this["L"+j].y=this._y-(Math.cos((this.angle+90-(legAngle*j))*(Math.PI/180))*this["L"+j].length);
}
};
_root["body"+i].setLegs();
_root["body"+i].onEnterFrame = walk;
_root["body"+i].duration = 9+(int(Math.Random()*4));
_root["body"+i].angleSpeed = 20+(int(Math.Random()*10));
}
function move(){
if(!this.beginX){
this.beginX=this.shadow_x;
this.changeX=this.targetX-this.beginX;
this.beginY=this.shadow_y;
this.changeY=this.targetY-this.beginY;
}
this.shadow_x=Math.easeInOutQuad(this.time++,this.beginX,this.changeX,this._parent.duration);
this.shadow_y=Math.easeInOutQuad(this.time,this.beginY,this.changeY,this._parent.duration);
this.footHeight = _root.stepHeight*Math.sin((this.time/this._parent.duration)*Math.PI);
this.x = this.shadow_x;
this.y = this.shadow_y-this.footHeight;
if (this.time>this._parent.duration){
this.beginX=false;
this.time=0;
delete this.onEnterFrame;
}
};
function walk(){
if(this._x>(Stage.width+_root.buffer)){
this._x=-_root.buffer/1.5;
this.resetMove();
}
if(this._x<-_root.buffer){
this._x=Stage.width+(_root.buffer/1.5);
this.resetMove();
}
if(this._y>(Stage.height+_root.buffer)){
this._y=-(_root.buffer/1.5);
this.resetMove();
}
if(this._y<-_root.buffer){
this._y=Stage.height+(_root.buffer/1.5);
this.resetMove();
}
var totX;
var totY;
for(i=1;i<=(_root.numLegs/2);i++){
totX+=this["L"+i].shadow_x;
totY+=this["L"+i].shadow_y;
totX+=this["R"+i].shadow_x;
totY+=this["R"+i].shadow_y;
}
this._x=totX/_root.numLegs;
this._y=totY/_root.numLegs;
//rear coordinates
var aveX1 = (this.L4.shadow_x + this.R4.shadow_x)/2;
var aveY1 = (this.L4.shadow_y + this.R4.shadow_y)/2;
var bodyAngle=Math.atan2((this._y-aveY1),(this._x-aveX1))+Math.PI;
this.rear_x = this._x + 18/2*Math.cos(bodyAngle);
this.rear_y = this._y + 18/2.5*Math.sin(bodyAngle);
this.rear2_x = this._x + 25/2*Math.cos(bodyAngle);
this.rear2_y = this._y + 25/2.5*Math.sin(bodyAngle);
if (this.counter==_root.wait){
var currLeg=_root.walkCycle[this.leg].leg;
var legLength=_root.walkCycle[this.leg].length;
//randomly change direction
if ((int(Math.random()*8)+1 == 8)&&(currLeg.charAt(1)=="1")){
(Math.round(Math.random())) ? this.angle-=this.angleSpeed : this.angle+=this.angleSpeed;
this.angle = Math.fixAngle(this.angle);
}
(this.leg<(_root.numLegs-1)) ? this.leg++ : this.leg=0;
(currLeg.charAt(0)=="R") ? this.side=-1 : this.side=1;
var legStride = _root.stride - ((currLeg.charAt(1))-1)*(_root.stride/(_root.numLegs/3));
var dest_x=this._x+(Math.cos(this.angle*(Math.PI/180))*(legStride));
var dest_y=this._y+(Math.sin(this.angle*(Math.PI/180))*(legStride));
this[currLeg].targetX=dest_x+(this.side*(Math.sin(this.angle*(Math.PI/180))*legLength));
this[currLeg].targetY=dest_y-(this.side*(Math.cos(this.angle*(Math.PI/180))*legLength));
this[currLeg].onEnterFrame = move;
}
(this.counter<_root.wait) ? this.counter++ : this.counter = 0;
};
onEnterFrame = function(){
_root.clear();
var i=1;
for(i=1;i<=_root.numWalkers;i++){
//shadow
_root.lineStyle(8, 0x979698, 20);
_root.moveTo(_root["body"+i]._x, _root["body"+i]._y);
_root.lineTo(_root["body"+i]._x+.5, _root["body"+i]._y);
_root.lineStyle(13, 0x979698, 20);
_root.moveTo(_root["body"+i].rear_x, _root["body"+i].rear_y);
_root.lineTo(_root["body"+i].rear2_x, _root["body"+i].rear2_y);
_root.lineStyle(3, 0x979698, 25);
for(j=1;j<=(_root.numLegs/2);j++){
_root.moveTo(_root["body"+i]["R"+j].shadow_x, _root["body"+i]["R"+j].shadow_y);
_root.lineTo(_root["body"+i]._x, _root["body"+i]._y);
_root.moveTo(_root["body"+i]["L"+j].shadow_x, _root["body"+i]["L"+j].shadow_y);
_root.lineTo(_root["body"+i]._x,_root["body"+i]._y);
}
_root.lineStyle(1, 0x333333, 100);
for(j=1;j<=(_root.numLegs/2);j++){
_root.moveTo(_root["body"+i]["R"+j].x, _root["body"+i]["R"+j].y);
_root.curveTo(_root["body"+i]["R"+j].x, _root["body"+i]["R"+j].y-15, _root["body"+i]._x, _root["body"+i]._y-_root.legHeight);
_root.moveTo(_root["body"+i]["L"+j].x, _root["body"+i]["L"+j].y);
_root.curveTo(_root["body"+i]["L"+j].x, _root["body"+i]["L"+j].y-15, _root["body"+i]._x, _root["body"+i]._y-_root.legHeight);
}
_root.lineStyle(5, 0x333333, 100);
_root.moveTo(_root["body"+i]._x, _root["body"+i]._y-_root.legHeight);
_root.lineTo(_root["body"+i]._x+.5, _root["body"+i]._y-_root.legHeight);
_root.lineStyle(10, 0x6C020B, 100);
_root.moveTo(_root["body"+i].rear_x, _root["body"+i].rear_y-_root.legHeight);
_root.lineTo(_root["body"+i].rear2_x, _root["body"+i].rear2_y-_root.legHeight);
}
};
Nhắn Bimbim: nếu em muốn thử đoạn code, em có thể thay đổi giá trị các biến số sau để điều chỉnh số nhện (numWalkers), các thông số liên quan đến chân của nhện,v.v... (chị vẫn chưa thử hết vì có ít thời gian).
numWalkers=3;
stride=50;
legHeight=8;
buffer=50;
stepHeight=6;
PC cảm ơn Anh MN và Bimbim thật nhiều. Chúc hai anh em vui nhé.
Alert webmaster - Báo webmaster bài viết vi phạm nội quy
bimbim118
member
REF: 255737
11/16/2007
Wooa đẹp và hay quá chị PC ơi, hihi để bữa nào rảnh em học theo chị nhé!
Chị giỏi quá!
hihihiii
amoremio
member
REF: 255804
11/16/2007
Bimbim ơi, em còn trên net? Sáng nay công việc quay chị quá trời. Bi giờ lại đến giờ ăn trưa rồi, huhu...tại đói bụng đó :-)... chị sẽ ráng xem phần LOADING trong chiều nay, nếu không được sẽ gởi file qua mail yahoo cho em. Như vậy em so sánh từng frame và code thì sẽ rõ.
Chị thấy Bimbim rất chịu khó học, ngoài ra tính tình dễ thương dễ mến lắm. Chị hy vọng từ từ em sẽ quen flash dần dần và làm nhiều hoạt hình hay.
Vậy nhé, bi giờ chị đi kiếm gì bỏ bụng nha, hihi....
Thân
1
Kí hiệu :
:
trang cá nhân :chủ
để đã đăng
:
gởi thư
:
thay đổi bài
:ý kiến