Khi quyết định nếu cuốn sách trong tay bạn sẽ là tài nguyên tốt cho thư viện của bạn. Nó có
thể giúp bạn biết tại sao chúng tôi, những tác giả đã viết ra cuốn sách đặc biệt này. Chúng tôi
là hai lập trình viên sử dụng Flash trong toàn bộ mọi ngày làm việc của chúng tôi, nhưng
chúng tôi cũng là những giáo viên. Kết hợp, chúng tôi đã dạy hàng nghìn sinh viên ở nhiều
trường đại học, dễ dàng quá trình đào tạo, các hội nghị, và lúc đó chúng tôi đã chia sẻ một số
king nghiệm quan trọng. Chúng tôi đã nhất quán nói rằng nhiều đặc trưng cuốn sách
ActionScript phù hợp với nhóm người bắt đầu.
Trước tiên chúng tôi đã rất ngạc nhiên thực sự đã vượt quá quan điểm, nhưng sau đó chúng
tôi đã nhận thức rõ rằng chúng tôi không đủ thông tin để tạo thành các đánh giá. Chúng tôi
không sử dụng tài nguyên người mới bắt đầu trong công việc của chúng tôi và chỉ có chương
trình giảng dạy cá nhân để dựa vào. Nên, chúng tôi bắt đầu nghiên cứu làm thế nào chúng tôi
có thể lấp đầy sự thiếu hụt này và cung cấp một cuốn sách cho sinh viên của chúng tôi để
thực sự giúp họ bên ngoài lớp học. Chúng tôi đã nói với rất nhiều sinh viên, các nhóm người
sử dụng, và những người dạy và đã bắt đầu phác thảo ra một cuốn sách mà chúng tôi nghĩ
đưa ra những gì chúng tôi đã học được trong thựctiễn.
137 trang |
Chia sẻ: Mr Hưng | Lượt xem: 887 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Thực hành Actionscript, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
py-ta-go). Vấn đề là khi nó di chuyển xong
thì sẽ như thế nào, cái này tùy vào mã lệnh đang được đặt ở đâu, nếu trong timeline chính thì
sau khi di chuyển xong nó sẽ dừng lại. Nếu đặt trong một hàm nào đó có EventListener là
ENTER_FRAME thì nó sẽ di chuyển mãi mãi.
VD:
var ball:MovieClip = new Ball();
ball.x = ball.y = 100;
addChild(ball);
var xVel:Number = 4;
var yVel:Number = 4;
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
ball.x += xVel;
ball.y += yVel;
}
Khi quả banh đi quá màn hình, bạn sẽ thấy nó biến mất không phải vì nó không chuyển động
nữa mà nó đang chuyển động ở vùng mà chúng ta không thể thấy được (và sẽ không thể thấy
được nữa).
Bạn cần hiểu một số khái niệm về vật lý, đó là tọa độ (x,y) cái này nói roài, tốc độ được tính
bằng (quãng đường đi được)/(thời gian đi hết quãng đường đó) thực tế vận tốc trong cuộc
sống đo bằng m/s
VD: Cứ cho sau 1 giây thì mã lệnh sau được lặp lại khi rơi vào sự kiện ENTER_FRAME:
ball.x += 10;
vậy tốc độ ở đây là 10pixel/giây. Người ta thường coi vận tốc là một đại lượng vectơ có
hướng và độ lớn. độ lớn của vân tốc chính là 10pixel/giây còn hướng mình đã nói roài, nếu
ngược chiều dương trục Ox (hoặc Oy) thì tốc độ có giá trị âm, ta nói độ lớn của vận tốc (tốc
độ) là một đại lượng đại số - có thể âm và dương.
Chúng ta xem xét đến 1 khái niệm vật lý nữa, đó là gia tốc, một con tàu vũ trụ muốn bay vào
không gian thì không cần một vận tóc lớn, chỉ cần một gia tốc đủ mạnh để thắng gia tốc
hướng tâm của trái đất là được (g = 9.8 m/s2), vậy gia tốc là cái gì và vì sao nó có đơn vị
m/s2. tọa độ là 1 hàm bậc nhất theo thời gian tăng theo vận tốc, tương tự vận tốc cũng là 1
hàm bậc nhất theo thời gian tăng theo giá trị của gia tốc
VD:
var ball:MovieClip = new Ball();
ball.x = ball.y = 100;
addChild(ball);
var xVel:Number = 4;
var yVel:Number = 4;
var xAcc:Number = 1;
var yAcc:Number = 1;
//khai báo 2 giá trị gia tốc theo trục Ox và Oy
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
ball.x += xVel;
ball.y += yVel;
xVel += xAcc;
yVel += yAcc;
//Gia tốc sẽ tăng vận tốc lên (+ thêm xVel và yVel đơn vị) mỗi khi câu lệnh được gọi, do
//đó vận tốc sẽ tăng theo một hàm bậc nhất có Hệ số góc là xAcc (hoặc là yAcc). Các bạn
đọc sách toán lớp 9 có nói đến Hs góc :D
}
Mã lệnh không khác nhiều, những chữ in nghiêng là mã lệnh được thêm vào.
Công thức tính gia tốc (vận tốc sau – vân tốc trước)/(thời gian thực hiện việc tăng tốc đó).
Vận tốc có đơn vị m/s --> gia tốc có đơn vị (m/s)/s = m/s2.
VD: sau một khoảng 5s một vật có v = 10 m/s tăng lên 20m/s hỏi gia tốc vật đó trong khoảng
thời gian 5s nói trên là bao nhiêu?
a (ký hiệu phổ biến của gia tốc) = (20-10)/5 = 2 m/s2 tức là cứ 1 giây thì vận tốc tăng thêm 2.
Giống như vận tốc người ta có thể biểu diễn gia tốc theo một vectơ có hướng và độ lớn, và
nó cũng là một đại lượng đại số.
VD mã lệnh trên gia tốc chính là xVel và yVel. Bạn có thể sử dụng quy tắc cộng 2 vectơ trên
để cho ra vectơ gia tốc chính xác (có độ lớn = căn bậc 2 của xVel2 + yVel2, hướng thì mình
đã trình bày roài).
2. Geometry and Trigonometry (Hình học và lượng giác)
Distance (khoảng cách)
Đầu tiên, hãy nói về việc giả sử bạn đang lập trình 1 game, trong game sẽ có kẻ thù truy đuổi
bạn và bạn phải tìm mọi cách để trốn thoát. Khi kẻ thù ở quá gần, bạn buộc phải chọn một
đường thoát hiểm gần nhất trong 2 đường. Người chơi điều khiển nhân vật và bạn phải tạo đủ
thử thách để kẻ thù có thể bắt được người chơi nếu anh ta có một tính toán sai lầm, để tạo
được điều đó, kẻ thù của chúng ta cũng phải cho kẻ thù biết được nơi thoát hiểm gần nhất của
người chơi.
Vấn đề của chúng ta là làm sao để kẻ thù của người chơi biết trong 2 lối thoát, lối nào gần
hơn? và định lý Py-ta-go sẽ cho chúng ta câu trả lời. Định lý này nói rằng: chiều dài của cạnh
dài nhất của một tam giác vuông bằng căn bậc 2 của tổng bình phương 2 cạnh còn lại theo
chiều ngang và chiều dọc
Rightangle: góc vuông
Hypotenuse: cạnh huyền
Hình 7-3 cho chúng ta cách tính khoảng cách giữa 2 điểm bất kỳ theo tọa độ của chúng bằng
định lý Py-ta-go.
Sau đây là một chương trình thực tế về cách tính khoảng cách này, các bạn nên xem file mẫu
để biết chúng tôi hoàn thành dự án như thế nào, trong đó có toàn bộ tài nguyên cần thiết mà
việc tạo ra chúng nằm ngoài phạm vi nội dung của cuốn sách:
Hàm tính khoảng cách:
function getDistance(x1:Number, y1:Number, x2:Number, y2:Number):Number {
var dx:Number = x1-x2;
var dy:Number = y1-y2;
return Math.sqrt(dx * dx + dy * dy);
}
Đây là một vd về cách sử dụng hàm getDistance() kèm theo file nguồn, nó là 1 sự so sánh
khoảng cách giữa ball1 và ball0 và giữa ball2 và ball0
var dist1 = getDistance(ball0.x, ball0.y, ball1.x, ball1.y);
var dist2 = getDistance(ball0.x, ball0.y, ball2.x, ball2.y);
if (dist1 < dist2) {
trace("ball1 is closest to ball0");
} else {
trace("ball2 is closest to ball0");
}
Movement Along an Angle (Chuyển động theo một góc)
Phần này mình khá rành. Do đó mình vừa dịch vừa tự phổ biến kiến thức mà mình biết để
các bạn dễ hiểu.
Chúng ta thấy trên hình 7-4 là các góc trong flash của một đối tượng bất kỳ, VD: bạn có 1
movieclip mc có góc là 00 ==> nó sẽ hướng về phía bên phải theo chiều trục Ox, nếu mc có
góc là 2700 nó sẽ hướng lên trên, ngược chiều của trục Oy.
Thuộc tính góc của đối tượng chúng ta có thể sử dụng thuộc tính rotation để thay đổi một
cách dễ dàng.
Điều thứ 2 chúng ta bàn luận là đơn vị sử dụng góc. Phổ biến nhất là độ và radian. Flash sử
dụng đơn vị là radian trong tính toán (dùng trong hàm sin, cos, tan, atan ...) và chúng ta cần
phải biết chuyển đổi qua lại giữa 2 đơn vị này một cách thành thục để tiện cho công việc lập
trình.
1π Radian = 1800
Mặc dù điều này đúng trên thực nghiệm nhưng nguyên tắc thì lại không ổn vì dấu đẳng thúc
xảy ra với 2 đai lượng có đơn vị khác nhau
Tuy nhiên chúng ta có thể sử dụng CT sau 1(Radian) = 180(đơn vị là độ)/π , gần đúng là 57
độ. Trong AS chúng ta viết như sau:
Var degrees:Number = 180;
Var radian:Number;
radian = (degrees*Math.PI)/180;
//radian = π
Từ degrees (đơn vị là độ), chúng ta tạo ra radian (đơn vị là radian).
Tương tự để chuyển một đơn vị từ radian sang độ, chúng ta có CT sau:
1 (độ) = 1π (radian)/180;
Var degrees:Number ;
Var radian:Number= Math.PI;
degrees = radian * 180 / Math.PI;
//degrees = 180
2 VD trên là mình tự thêm vô cho các bạn dễ dàng khi lập trình, có trong sách nhưng nó
không rõ ràng lắm .
Hình mà các bạn thấy ở trên là vòng tròn lượng giác biểu diễn các giá trị của sin và cos trong
lượng giác.
Cho 1 tam giác vuông bất kỳ thì:
sin (góc nào đó) = Cạnh đối của góc/Cạnh huyền
cos (góc nào đó) = Cạnh kề của góc/Cạnh huyền
Mình chú ý một tí là đường tròn lượng giác của học sinh phổ thông thì cạnh huyền chính là
hypotenuse = 1 do đó y = sin(angle) hay trục Oy thường được gọi là trục sin, tượng tự trục
Ox được gọi là trục cos).
Chúng ta bàn luận một tí về vectơ cái đã, cái này trong sách không nói đâu, phần trước
mình có nói qua roài. Vectơ là một đại lượng có hướng, nó có độ lớn nhất định (là bằng chiều
dài của vectơ khi biểu diễn trên mặt phẳng bằng một mũi tên). Một vectơ luôn chỉ rõ điểu đầu
(xuất phát) và điểm cuối (mũi của mũi tên)
VD: (độ lớn a)
(đầu) (cuối)
(độ lớn 2a có chiều dài gấp đôi cái trên)
(đầu) (cuối)
Chúng ta có thể tổng hợp 2 vectơ bằng nhiều quy tắc và các trường hợp khác nhau
1. Quy tắc hình bình hành:
Những đường gạch đứt không phải là vectơ mà là minh họa cho cái hình bình hành. :D
Để tổng hợp 2 vectơ bất kỳ (màu đỏ và đen) và vectơ tổng hợp là màu xanh, chúng ta thấy
rằng vectơ tổng hợp chính là hình chéo của hình bình hành, có 2 cạnh có độ lớn là bằng độ
lớn của 2 vectơ cần tổng hợp.
Công thức này dành cho HS lớp 10 vật lý thoai, mình đưa ra công thức sau để tính độ dài
của vectơ xanh.
Độ lớn vectơ: Xanh2 = Đỏ2+Đen2-2*Đỏ*Đen*Cos α
(α = góc giữa vectơ đỏ không đứt đoạn và đen đứt đoạn)
Lấy căn bậc 2 chúng ta có độ lớn vectơ xanh tổng hợp.
Các bạn có thể tính hướng của vectơ tổng hợp
2. Công thức tính 2 vectơ vuông góc với nhau
Thực tế góc giữa 2 vectơ trong flash theo Ox và Oy là 900 chúng ta tổng hợp vectơ theo Công
thức sau:
Xanh2 = Đỏ2+Đen2
(trường hợp này α = 90 => cos α = 0=> 2*Đỏ*Đen*Cos α = 0)
Vì sao phải học cách tổng hợp vectơ? – là vì tốc độ (hoặc tương tự các bạn có thể biểu diễn
gia tốc) trong flash thực ra chính là tổng hợp của 2 vectơ vận tốc của 2 trục Ox và Oy, nếu
bạn chuyển động qua phải 2 pixel và xuống dưới 2 pixel thì chính là bạn đang di chuyển theo
hướng đông nam và với vận tốc căn bậc 2 của tổng (22 + 22)
Để minh họa, chúng ta sẽ nghiên cứu VD sau: cho một vật có một vận tốc nhất định, hãy biểu
diễn chuyển động của nó trên màn hình.
Đầu tiên, vận tốc là một đại lượng vectơ, đề cho vận tốc tức là cho chúng ta hướng (góc của
nó) và độ dài – độ lớn (là tốc độ của vận tốc).
Để biểu diễn chuyển động trong flash, chúng ta cần biết các giá trị xVel và yVel, để vật có
thể chuyển động được (trong phần trước có nói roài). Chúng ta sử dụng mã lệnh sau:
var ball:MovieClip = new Ball();
ball.x = ball.y = 100;
addChild(ball);
var speed:Number = 12;
var angle:Number = 45;
//các đặc tính cơ bản của vectơ vận tốc
var radians:Number = deg2rad(angle);
//chuyển đổi từ angle (đơn vị là độ) sang radian
var xVel:Number = Math.cos(radians) * speed;
//xVel phải nhân cho speed để biết độ dài của vectơ vận tốc theo trục Ox, nếu không nhân thì
//chúng ta chỉ có vận tốc của vectơ vận tốc cơ bản (cạnh huyền của tam giác trong đường tròn
//lượng giác = 1 đơn vị) có độ dài là 1*radians
var yVel:Number = Math.sin(radians) * speed;
//yVel phải nhân cho speed để biết độ dài của vectơ vận tốc theo trục Oy, nếu không nhân thì
//chúng ta chỉ có vận tốc của vectơ vận tốc cơ bản (cạnh huyền của tam giác trong đường tròn
//lượng giác = 1 đơn vị) có độ dài là 1*radians
//các giá trị vectơ theo 2 trục Ox và Oy (tổng hợp lại chính là vectơ vận tốc) để vật di chuyển
//theo 2 trục tọa độ
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
ball.x += xVel;
ball.y += yVel;
//ball di chuyển.
}
function deg2rad(deg:Number):Number {
return deg * (Math.PI/180);
//trả về giá trị của radian
}
Circular Movement (sự di chuyển theo đường tròn)
Phần này khá khó, sử dụng lượng giác đau đầu lắm
Cái hình này bỏ vào cho sinh động thôi, chứ nó khó hiểu lắm
Bốn chuyển động quay những góc khác nhau xung quanh một vòng tròn, biểu thị cả
hai, một trong những “độ” của góc và hai là tọa độ X và Y chỉ trên về một vòng tròn với
một bán kính 150 pixel
Bạn đã biết cách xác định trên trục x và y thông qua giá trị của vectơ vận tốc (độ lớn (speed),
hướng (angle)), chúng ta có cơ sở để phát triển lên chuyển động tròn.
Lấy VD đơn giản như trái đất chuyển động tròn quanh mặt trời, và mặt trăng chuyển động
tròn quanh trái đất (tròn ở đây có tính tương đối, thực tế thì nó chuyển động hình elip)
Chúng ta không quan tâm đến độ lớn của vận tốc hay hướng của nó vì chúng ta không sử
dụng 1 vectơ để biểu diễn chuyển động, một vectơ chỉ biểu diễn 1 hướng trong khi chuyển
động tròn thì hướng chuyển động của vật là biến thiên, thay vào đó chúng ta sẽ tính toán các
giá trị x và y liên tiếp trong những góc khác nhau, bằng cách sử dụng hàm sin và cos, bạn có
thể di chuyển một vật theo hình tròn.
Kỹ thuật chúng tôi trình bày không quá khó hiểu, nếu bạn vận dụng đúng các hàm sin và cos
trong những góc khác nhau, giá trị của sin hay cos thuộc [-1;1]. Vòng tròn lượng giác có bán
kính là 1, tại (0;1), chúng ta có sin = 0 và cos = 1, mô tả điểm nằm ngoài cùng bên phải,
tương tự với các điểm khác nhau.
Câu lệnh sau chính là trái tim của chương trình:
satellite.x = centerX + radius * Math.cos(radian);
satellite.y = centerY + radius * Math.sin(radian);
các kiến thức lượng giác cho chúng ta thấy rằng, bán kính đường tròn chuyển
động*cos(góc của vật đó) chiếu lên trục cos trong đường tròn lượng giác chính là tọa độ x
(mình đã nói truc Ox còn gọi là trục cos đúng không nào ?) + tọa độ của trung tâm là một
hằng số, sở dĩ cần cộng thêm vì nếu không cộng, vật chỉ chuyển động xung quanh đường tròn
lượng giác cơ bản có tâm là gốc tọa độ (0;0) mà thôi, chính xác hơn thì đây là phép tịnh tiến
gốc tọa độ theo vectơ (centerX;centerY), các bạn thông cảm, cứ hiểu vậy thôi, nếu bây giờ
mình trình bày thêm về phép tính tiến vectơ thì vừa mất thời gian mà không đúng trọng tâm
bài học.
Giải thích tương tự cho dòng lệnh thứ 2.
Mã lệnh để một vật chuyển động là đây, các bạn tham khảo file mẫu để biết dự án được xây
dựng như thế nào
var angle:Number = 0;
//góc ban đầu của vật
var radius:Number = 150;
//bán kính của chuyển động tròn.
var angleChange:Number = 10;
//góc thay đổi giúp vật thay đổi góc quay và nó có thể quay tròn
var centerX:Number = stage.stageWidth/2;
var centerY:Number = stage.stageHeight/2;
//tọa độ trung tâm mà vật sẽ “bay” xung quanh
var satellite:MovieClip = new Asteroid();
satellite.x = satellite.y = -200;
//tọa độ của vật khi bắt đầu đưa vào flash
addChild(satellite);
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void{
var radian:Number = deg2rad(angle);
//chuyển giá trị của góc “độ” sang radian
satellite.x = centerX + radius * Math.cos(radian);
satellite.y = centerY + radius * Math.sin(radian);
//tọa độ mới của vật
angle += angleChange;
//tăng góc
angle %= 360;
//khi angle tăng lên đến 360 nó sẽ chuyển về 0 (đảm bảo góc quay sẽ không +∞)
}
function deg2rad(deg:Number):Number {
return deg * (Math.PI/180)
}
Rotation Toward an Object (làm quay về một phía nhất định của đối tượng)
Chúng ta sử dụng tọa độ của một vật để định hướng góc và độ lớn.
Dự án của chúng ta sẽ trông như sau:
Một bàn tay quay theo con chuột và luôn xoay về phía con chuột.
Chúng ta sử dụng hàm atan2(), chúng ta sẽ có nó vì nó là một phương pháp sẵn có của lớp
Math. Dựa vào một chức năng cho lớp Math của Flash. Chúng ta xác định góc giữa 2 điểm,
2 điểm trong 1 mặt phẳng tạo cho chúng ta 1 đoạn thẳng mà góc chúng ta vừa nói ở trên tức
là góc hợp bởi đoạn thẳng và trục Ox, vì sao là trục Ox? Đơn giản vì nếu đoạn thẳng với trục
Ox thì góc hợp bởi chúng là 0 độ, điều này phù hợp với hệ góc của flash.(xem lại hình 7-4).
Bạn cần chắc chắn rằng cánh tay đang chỉ sang bên trái, trục Ox để nó chỉ đúng 0 độ trong
flash, cánh tay chưa hoạt động và dĩ nhiên thuộc tính rotation của nó cần là 0.
Câu lệnh trong chương trình này mà chúng ta cần chú ý là:
var radians:Number = Math.atan2(y1-y2, x1-x2);
bởi lẽ Math.atan2() cho chúng ta 1 hàm tan ngược, đơn giản là tan 450 = 1 ==> tan-1 (gọi là
tan ngược) 1 = 450.
Tan một góc là tỉ số của cạnh đối của góc đó trên cạnh kề của góc đó trong 1 tam giác vuông
(góc ở đây không phải là góc vuông của tam giác)
Trục Oy hướng xuống và trục Ox hướng ngang sang phảỉ, mà góc nằm ở tâm của gốc tọa độ
(ở trường hợp này góc ở tâm tọa độ được hiểu là tâm của cánh tay), y1-y2 chiếu lên trục Oy
là cạnh đối còn x1-x2 chiếu lên trục Ox là cạnh kề.
var hand:MovieClip = new Hand();
hand.x = stage.stageWidth/2;
hand.y = stage.stageHeight/2;
//đặt bàn tay ở trung tâm màn hình
addChild(hand);
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
hand.rotation = getAngle(hand.x, hand.y, mouseX, mouseY);
//góc của bàn tay được quy định bởi hàm getAngle()
}
function getAngle(x1:Number, y1:Number, x2:Number, y2:Number):Number {
var radians:Number = Math.atan2(y1-y2, x1-x2);
//tính tan ngược dựa trên tọa độ 2 điểm. đơn vị radian
return rad2deg(radians);
//đổi đơn vị sang độ để thuộc tính rotation có thể sử dụng
}
function rad2deg(rad:Number):Number {
//chuyển từ đơn vị radian sang độ
return rad * (180/Math.PI);
}
Chúng ta sử dụng VD này cho một MovieClip đơn giản, nhưng ứng dụng của nó rất lớn, bạn
có thể làm cho mọi thứ xoay quanh một đối tượng, tạo ra tính trực quan và tương tác rất có
hiệu quả trong chương trình.
X1 X2
Y1
Y2
3. Physics (Vật lý)
Yếu tố vật lý xuất hiện trong game, hoạt hình, hoặc trong những thí nghiệm đơn giản, tuy
nhiên vật lý có thể nâng những thứ kể trên lên một tầm cao mới, tạo ra một sự thích thú mạnh
mẽ với người sử dụng. Thậm chí với những người giàu kinh nghiệm, những đoạn mã nhỏ đến
đáng ngạc nhiên cũng có thể tạo ra một hiệu ứng vật lý đáng kể.
Chúng ta thảo luận về vật lý không có nghĩa là chúng ta đang học môn vật lý, chính xác thì
chúng ta chỉ sử dụng những KQ vật lý đã biết để áp dụng vào chương trình của chúng ta.
Các nhà khoa học phát hiện ra các hiện tượng và quy về các công thức, chúng ta chỉ sử dụng
công thức đó một cách đơn giản nhất. Cái gì cũng liên quan đến thực tế, chúng ta nên nhìn
nhận vấn đề này một cách tích cực, nếu chúng ta lập trình mà xa rời thực tế thì cũng chẳng để
làm gì.
Ngắn gọn nhưng thật có ích. Trước hết hãy đóng vai quỹ đạo đơn giản của một hành tinh
trước khi xem xét trạng thái quay vòng của một hành tinh trên quỹ đạo, sự hấp dẫn của lực
hấp dẫn từ những thiên thể khác, vân vân.
Gravity (trọng lực)
Chuyển động của một vật chịu tác dụng của trọng lực
Chúng ta bắt đầu với hiện tượng vật lý quen thuộc, đó là trọng lực. Trọng lực thì hướng
xuống, điều này ai cũng biết, Flash cho phép chúng ta giả hiệu ứng của trọng lực một cách
tuyệt vời, bằng cách thêm một lực kéo nhỏ ở trục Oy (thêm tức là cộng thêm vào trục Oy một
vectơ gia tốc trọng trường mới của trọng lực), trục Ox giữ nguyên đơn giản vì trọng lực
không tác dụng theo phương ngang :D.
var ball:MovieClip = new Ball();
ball.x = ball.y = 100;
addChild(ball);
var xVel:Number = 4;
var yVel:Number = -10;
var yAcc:Number = 1;
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
ball.x += xVel;
ball.y += yVel;
yVel += yAcc;
}
Chúng ta đã nói đến gia tốc ở phần trước, mỗi hành tinh đều có một gia tốc trọng trường nhất
định và nó là một hằng số. VD ở trái đất là 9,8 m/s2.Chúng ta tạo ra sự khác biệt giữa các
hành tinh với nhau thông qua trọng lực
Mã này có hiệu quả cho việc tung lên một quả bóng vào trong không khí. Ban đầu quả bóng
di chuyển chậm dần đều vì chịu gia tốc ngược, đang hướng lên khi gia tốc trọng trường
hướng xuống. Sau khi đạt vị trí cao nhất nó di chuyển nhanh dần đều vì cùng hướng với
chiều của gia tốc. Điều này phù hợp với các quy luật của vật lý.
Hãy tham gia trên website của quyển sách này để thấy dự án wall_bounce.fla, chúng ta sẽ
thay đổi nhiều điều như ranh giới, giai đoạn, kết cấu, thời gian nảy v.v... được bổ sung vào
chương trình.
Friction (ma sát)
Khi bạn đi trên đường, trượt trên sân băng... tất cả những hoạt động đó đều tạo ra ma
sát.người ta có thể làm cho Ma sát đường tăng cường ở trên đường nhằm mục đích làm cho
các xe tham gia giao thông có thể dừng lại một cách dễ dàng, ma sát được giảm đi trên các
máy móc, thiết bị để bảo đảm tuổi thọ cho chúng. Một đơn giản cách để thêm ma sát vào một
hoạt cảnh là tạo ra một hệ số ma sát mà dần dần giảm bớt vận tốc trong cả thời gian mà vật
chịu ma sát đang chuyển động. Chúng ta sẽ bắt đầu từ ví dụ của phần: “Movement Along an
Angle”. Để thêm ma sát bạn chỉ cần làm 2 việc. Đầu tiên tạo ra một hệ số ma sát (lớn hơn 0,
bé hơn 1), sau đó nhân hệ số này với giá trị của vận tốc ==> giá trị của vận tốc sẽ giảm dần
theo thời gian, đó là điều chúng ta chờ đợi.
var ball:MovieClip = new Ball();
ball.x = ball.y = 100;
addChild(ball);
var speed:Number = 12;
var angle:Number = 45;
var radians:Number = deg2rad(angle);
var xVel:Number = Math.cos(radians) * speed;
var yVel:Number = Math.sin(radians) * speed;
var frCooef:Number = .95;
//thêm hệ số ma sát
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
xVel *= frCooef;
yVel *= frCooef;
//vận tốc giảm do bị ma sát
ball.x += xVel;
ball.y += yVel;
}
function deg2rad(deg:Number):Number {
return deg * (Math.PI/180);
//chuyển đơn vị từ độ sang radian
}
Zeno’s Paradox (nghịch lý của zeno)
Cách khác để thêm ma sát vào sự chuyển động đối tượng sẽ sử dụng nghịch lý Zeno, mà nói
điều này, khi di chuyển từ điểm này sang điểm khác, bạn không bao giờ thật sự đạt đến nơi
đến tận cùng điểm sẽ đến của bạn bởi vì bạn sẽ chia cắt đường đi còn lại (khoảng cách) với
mỗi sự chuyển động có ma sát.
Sách nó viết vậy thoai, có nghĩa là bước đầu tiên để đi từ a => b cần 100 cm chúng ta bớt lại
còn 50cm, tiếp theo muốn đi đến b cần 50 cm nữa, chúng ta bớt lại để nó chỉ đi được 25 cm
và cứ thế, nó có thể sẽ không đến đươc nơi cần đến, dưới khái niệm của toán học thì giới hạn
của việc giảm bớt này cuối cùng vẫn là đến đích thành công, tuy nhiên điều này xảy ra khi số
bước di chuyển là ∞, tức là số bước di chuyển rất nhiều, tuy nhiên đó là toán học còn thực tế
trong flash thì nó lại khác, vì số lần lặp lại trong EventListener của ENTER_FRAME là rất
lớn nên bước di chuyển của quả bóng là rất lớn, mặt khác do kick thước quả bóng to và
khoảng cách di chuyển hẹp nên ta không thấy rõ điều này.
Nếu bạn chia khoảng cách từ điểm a đến điểm b bằng một nửa bước bạn sẽ không bao giờ
đến được điểm b. Ý tưởng này có thể sử dụng để làm chậm một đối tượng trong khi nó tiếp
cận nơi đến đích của nó, như được minh họa trong Hình 7 9
Mã lệnh của chương trình như sau:
var ball:MovieClip = new Ball();
ball.x = ball.y = 100;
addChild(ball);
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
ball.x += velFriction(ball.x, mouseX, 8);
ball.y += velFriction(ball.y, mouseY, 8);
}
function velFriction(orig:Number, dest:Number, coeff:Number):Number {
//nguyên lý mình đã trình bày, cái khác là chương trình này nó chia cho 8 chứ không phải 2
return (dest-orig)/coeff;
}
VD: khoảng cách giữa ball và MOUSE là 512 --> tọa độ sau bước đầu tiên của bóng là x +
64, => khoảng cách còn lại gữa MOUSE và bóng là 512 – 64, bước tiếp theo ball di chuyển
một bước là (512 -64)/8 khoảng cách lại gần lại và cứ thế ...
Có thể xem coeff như là một dạng hệ số ma sát, khi coeff càng cao thì chuyển động càng
chậm, mất nhiều thời gian hơn và ngược lại.
Elasticity (sự đàn hồi)
Một đặc tính khác của vật lý có thể ứng dụng vào hoạt cảnh là sự đàn hồi, thuộc tính này có
thể áp dụng cho các mô hình chuyển động khác nhau và có thể có nhiều cách khác nhau để
biểu diễn nó. Lực đàn hồi xuất hiện khi có một vật chịu tác dụng từ 1 lực nào đó bị biến dạng
và lực đàn hồi xuất hiện để kéo vật trở lại vị trí , trạng thái ban đầu chống lại nguyên nhân
biến dạng đó
Dưới góc độ của các công thức vật lý thì lực đàn hồi tính bằng F = -kx
F: độ lớn của lực
k = độ biến dạng của vật
Lực ngược chiều với độ biên dạng cuả vật nên có dấu “-”.
VD trên nhằm sử dụng lực đàn hồi để giải quyết một MovieClip trong những vị trí ở những
khu vực khác nhau. Hình vẽ miêu tả 1 quả bóng, chuyển động về phía con chuột (có dấu +),
ban đầu nó chuyển động quanh chuột, sau đó nó cân bằng tại vị trí con chuột.
var ball:MovieClip = new Ball();
ball.x = ball.y = 100;
addChild(ball);
var xVel:Number = 0;
var yVel:Number = 0;
addEventListener(Event.ENTER_FRAME, onLoop, false, 0, true);
function onLoop(evt:Event):void {
xVel = velElastic(ball.x, mouseX, .14, .85, xVel);
yVel = velElastic(ball.y, mouseY, .14, .85, yVel);
ball.x += xVel;
ball.y += yVel;
}
//Chúng ta xem xét tiếp hàm velElastic()
Function velElastic(orig:Number, dest:Number, springConst:Number,damp:Number,
elas:Number):Number {
elas += -springConst * (orig - dest);
return elas *= damp;
}
Thứ còn lại chính là việc đi tính lực đàn hồi, biến springConst được xem như hệ số k (càng
cao thì lực đàn hồi càng mạnh) còn (orig - dest) được xem như khoảng cách của vật trước và
sau khi di chuyển, dấu trừ để tốc độ chuyển động có thể đảo ngược khi vật chuyển động quá
giới hạn đàn hồi, cụ thể ban đầu orig < dest (tọa độ vật bé hơn tọa độ mà nó sẽ chuyển tới)
=> orig – dest -springConst * (orig - dest) > 0 => vật tiến lên trước, sau đó vật vượt
qua vị trí tới tức là orig > dest => -springConst * (orig - dest) < 0 vật chuyển động lui.
elas += -springConst * (orig - dest);
câu lệnh này tạo cho vật chuyển động với một gia tốc elas += -springConst * (orig - dest)
biến thiên (biến thiên như thế nào thì mình nói rồi đó)
Nếu chỉ dừng mã lệnh ở đây thì vật sẽ chuyển động qua lại quanh con chuột chứ không lại
gần và đứng yên tại con chuột đâu, chúng ta n
Các file đính kèm theo tài liệu này:
- thuc_hanh_actionscript_3_0_6238.pdf