Thực hành Actionscript

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.

pdf137 trang | Chia sẻ: Mr Hưng | Lượt xem: 877 | Lượt tải: 0download
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:

  • pdfthuc_hanh_actionscript_3_0_6238.pdf