PHẦN II: NỘI DUNG I. TÌM HIỂU NGÔN NGỮ LẬP TRÌNH MACROMEDIA FLASH
III. ỨNG DỤNG PHẦN MỀM TRONG MÔ PHỎNG CÁC THÍ NGHIỆM VẬT LÝ
III.1. Mô phỏng chuyển động chiếu (chuyển động của viên đạn đƣợc bắn ra khỏi nòng súng)
III.1.2. Tạo các đối tƣợng trên Stage
Mô phỏng này có một Scene, trong Scene có 1 Layer, Layer có một Frame duy nhất.
Frame 1: Rê các đối tượng đã tạo có trong thư viện vào trong Stage.
Cửa sổ mô phỏng như sau:
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 67 Tạo các Text trên Stage:
Text tĩnh (Static Text): Chứa các nội dung: góc ban đầu, độ cao h, vận tốc đầu, thời gian t, đơn vị độ (o), giây (s), mét (m), mét trên giây (m/s).
Text nhập (Input Text): Cho phép người dùng nhập vào giá trị của góc ban đầu_ Trong trường Var ta đặt là g_bd. Giá trị nhập của vận tốc đầu_ Trong trường Var ta đặt là v_bd.
Text động (Dynamic Text): Giá trị của độ cao h_ Trong trường Var ta đặt là h_bd. Giá trị của thời gian t_ Trong trường Var ta đặt là tg.
Đặt biểu tượng cho phép phóng to và thu nhỏ, nút bắn, nút xóa vết, cờ trên Stage.
Mở bảng điều khiển Action và nhập các mã lệnh cho Frame này như sau:
onPress=function(){
fscommand("fullscreen","true");
};
onPress=function(){
fscommand("allowscale","false");
};
// Tạo một Movie Clip chứa các đối tượng mô phỏng this.createEmptyMovieClip(“mo_phong”,-1000);
with(mo_phong) {
// Đưa các đối tượng từ thư viện vào cửa sổ chính attachMovie(“m_dat”, “m_dat”,-10);
attachMovie(“dot”, “dot”,10);
attachMovie(“n_sung”, “n_sung”,11);
attachMovie(“tru”, “tru”,12);
attachMovie(“thuoc1”, “thuoc1”,13);
attachMovie(“thuoc2”, “thuoc2”,14);
attachMovie(“b_xe”, “b_xe”,15);
attachMovie(“m_ten”, “m_ten”,17);
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 68 attachMovie(“c_co”, “c_co”,18);
attachMovie(“ve_tdo”, “ve_tdo”,19);
attachMovie(“t_do”, “t_do”,20);
attachMovie(“goc_ban”, “goc_ban”,21);
// Đặt vị trí cho các đối tượng m_dat._x=-400;
m_dat._y=Stage.height;
b_xe._x=100;
b_xe._y=m_dat._y-25;
}
// Khai báo các giá trị
// Khai báo gia tốc trọng trường g=9,8;
t=0;
tg=0;
// Biến dùng phóng to và thu nhỏ i=4;
j=0;
// Các biến khác shoot=flase;
dunglai=flase;
camco=flase;
ve_toado=true;
// Thiết lập các giá trị ban đầu: vị trí súng, đạn, các thanh tọa độ, góc và độ cao ban đầu function bandau():Void{
_root.flag._visible=true;
with(mo_phong) {
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 69 // Ẩn mũi tên chỉ hướng bắn
m_ten._visible=flase;
// Ẩn cò chỉ vị trí c_co._visible=flase;
// Ẩn tọa độ tại vị trí cực đại t_do._visible=flase;
// Đặt hai thanh ngang và đứng làm trục tọa độ thuoc1._x=b_xe._x;
thuoc1._y=b_xe._y;
thuoc2._x=b_xe._x;
thuoc2._y=b_xe._y;
// Đưa súng và đạn vào vị trí đã chọn là trục tọa độ n_sung._x=b_xe._x;
n_sung._y=b_xe._y;
dot._x=n_sung._x;
dot._y=n_sung._y;
// Cho súng quay theo góc do ta nhập vào n_sung._rotation=-_root.goc_bd;
// Đặt trụ đỡ súng vào vị trí tru._y=m_dat._y;
tru._x=b_xe._x;
tru._height=m_dat._y-b_xe._y-25;
// Tính độ cao ban đầu
_root.h_bd=(m_dat._y-dot._y)/20;
// Tính khoảng cách đầu của đạn trên trục x _root.xo=dot._x;
// Text hiển thị góc bắn cạnh súng goc_ban._x=n_sung._x-20;
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 70 goc_ban._y=n_sung._y-5;
goc_ban.goc=_root.goc_bd;
if(goc_ban.goc==null){
goc_ban.goc=0;
}
// Hàm dùng di chuyển xe sang vị trí khác mo_phong.b_xe.onPress=function() {
startDrag(this,true);
};
mo_phong.b_xe.onRelease=function() {
stopDrag();
};
// Hàm này vẽ đồ thị đường đi của đạn Function bandau()
{
t=t+1/60;
tg=int(t*100)/100;
// Tính tung độ đạn thời điểm t
mo_phong.tungdo=mo_phong.m_dat._y-20*(-49*t*t+vy*t+Number(h_bd));
setProperty(mo_phong.dot,_y,mo_phong.tungdo);
// Tính hoành độ đạn tại thời điểm t mo_phong.hoanhdo=20*vx*t+xo;
setProperty(mo_phong.dot._x,mo_phong.hoanhdo);
// Vẽ quỹ đạo theo vị trí đạn
mo_phong.lineTo(mo_phong.dot._x,mo_phong.dot._y);
// Nếu đạn rơi đến mặt đất thì ngừng vẽ quỹ đạo
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 71 if(mo_phong.dot._y>=mo_phong.dat._y)
{
dunglai=true;
t=0;
// Vẽ đường nối từ vị trí cao nhất đến trục tọa độ mo_phong.lineStyle(0.5,0xffff00,50);
mo_phong.moveTo(mo_phong.ve_toadox,mo_phong.ve_toadoy);
mo_phong.lineTo(mo_phong.ve_toadox,mo_phong.thuoc1._y);
mo_phong.moveTo(mo_phong.ve_toadox,mo_phong.ve_toadoy);
mo_phong.lineTo(mo_phong.thuoc2._x,mo_phong.ve_toadoy);
// Hiển thị tọa độ tại vị trí vật cao nhất
duplicateMovieClip(mo_phong.t_do,“t_do”+j,222+j);
mo_phong[“t_do”+j]._x=mo_phong.ve_toadox;
mo_phong[“t_do”+j]._y=mo_phong.ve_toadoy;
mo_phong[“t_do”+j].t_dox=(mo_phong.ve_toadox-mo_phong.n_sung._x)/20;
mo_phong[“t_do”+j].t_doy=(mo_phong.m_dat._y-mo_phong.ve_toadoy)/20;
}
// Nếu đạn rơi đến trục x thì vẽ cờ hiển thị vị trí
if(camco==true and mo_phong.dot._y>mo_phong.thuoc1._y-2 and mo_phong.dot._x>mo_phong.thuoc1._x+10){
j=j+1;
duplicateMovieClip(mo_phong.c_co,“c_co”+j,100+j);
mo_phong[“c_co”+j]._x=mo_phong.dot._x;
mo_phong[“c_co”+j]._y=mo_phong.thuoc1._y;
mo_phong[“c_co”+j].goc=(mo_phong.dot._x-mo_phong.n_sung._x)/20;
camco=flase;
}
// Xác định vị trí tại nơi vật cao nhất
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 72 if(ve_toado==true and t>=vy/g){
mo_phong.ve_toadox = mo_phong.dot._x;
mo_phong.ve_toadoy = mo_phong.dot._y;
ve_toado = false;
} }
Function dieukhien() {
setProperty(flag,_x,_xmouse);
setProperty(flag,_y,_ymouse);
// Hàm này dùng thay đổi kích thước của mô phỏng
mo_phong._y = Stage.height-i*Stage.height/4-(4-i)*50;
mo_phong._x=0;
mo_phong._xscale = i*25;
mo_phong._yscale = i*25;
if(flag.hitTest(ban)||flag.hitTest(reset)||flag.hitTest(zom_m)||flag.hitTest(zom_n)) {
Mouse.show();
Flag._visible = false;
} }
// Bắt đầu chạy chương trình this.onEnterFrame = function(){
bandau();
if(shoot==true and dunglai==flase){
bandau();
}
dieukhien();
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 73 };
mo_phong.n_sung.onMouseMove = function(){
if(_root.xoay._nong){
mo_phong.n_sung._rotation=5.729578E+001*Math.atan2(mo_phong._ymouse- mo_phong.n_sung._y,mo_phong._xmouse-mo_phong.n_sung._x);
goc_bd = -mo_phong.n_sung._rotation;
};
// Hành động khi ta nhấn vào nút bắn ban.onPress = function(){
// Nếu vận tốc đầu là rỗng thì mặc định là 20m/s if(v_bd!=null)
{
vo=v_bd;
} else {
v_bd=20;
}
// Cho hiện mũi tên chỉ hướng bắn
mo_phong.n_sung.m_ten._visible = true;
alpha = goc_bd*Math.PI/180;
// Chuyển góc bắn sang đơn vị radian // Đặt nét vẽ cho đồ thị
mo_phong.moveTo(mo_phong.dot.x,mo_phong.dot._y);
// Tính vận tốc đầu theo phương x và y vx = vo*Math.cos(alpha);
vy = vo*Math.sin(alpha);
// Đặt giá trị cho các biến điều kiện
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 74 shoot = true;
dunglai = flase;
camco = true;
ve_toado = true;
};
ban.onRelease = function() {
mo_phong.n_sung.m_ten._visible = flase;
};
// Khi nhấn nút xóa vết reset.onPress = function() {
// Xóa các đường quỹ đạo _root.mo_phong.clear();
for(var c=0; c<=j; c++) {
// Xóa các cờ đánh dấu vị trí trên trục x removeMovieClip(mo_phong[“c_co”,+c]);
// Xóa các text đánh dấu vị trí cao nhất của đạn removeMovieClip(mo_phong[“t_do”,+c]);
} };
// Hàm phóng to và thu nhỏ zom_m.onPress = function() {
i=i+1;
};
zom_n.onPress = function()
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 75 {
if(i<=1) {
i=1;
} else { i=i-1;
} };
// Khi nhấn vào súng thì cho phép xoay nòng súng theo con trỏ mo_phong.n_sung.onPress = function(){
flag._visible = flase;
_root.xoay_nong = true;
};
mo_phong.n_sung.onRelease = function() {
_root.xoay._nong = flase;
};
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 76 Cửa sổ Action sau khi nhập mã lệnh cho Frame này như sau:
Để chạy chương trình: nhấn tổ hợp phím Ctrl+Enter Cửa sổ mô phỏng xuất hiện như sau:
SVTH: Lý Trọng Hiếu – MSSV: 1100215 Trang 77 Nhập vào góc ban đầu và vận tốc đầu.
Góc ban đầu cũng sẽ được hiển thị trên ô text nếu dùng chuột rê nòng súng.
Nếu không nhập vào vận tốc ban đầu, chương trình sẽ tự gán vận tốc đầu là 20m/s.
Kết quả mô phỏng chuyển động: