TRƯỜNG ĐẠI HỌC XÂY DỰNG KHOA CNTT – BỘ MÔN CÔNG NGHỆ PHẦN MỀM --------------------------------------------
ĐỒ ÁN: ĐỒ HỌA MÁY TÍNH 2 GIÁO VIÊN: PHAN THÁI TRUNG SINH VIÊN: NGUYỄN HỒNG GIANG MS: 4228.51 LỚP 51PM1
HÀ NỘI, 11/2009
Đồ Án Đồ Họa 2 200 9 Mục Lục TRƯỜNG ĐẠI HỌC XÂY DỰNG...................................................................................2 Mục Lục.............................................................................................................................3 Mở Đầu..............................................................................................................................3 Quy trình thực hiện............................................................................................................4 Bước 1. Thay nhân vật...................................................................................................4 Bước 2. Thay Map..........................................................................................................9 Bước 3. Thay và thêm Enemy......................................................................................12 Bước 4. Lưu điểm.........................................................................................................15 Bước 5. Preloader.........................................................................................................18 Bước 7. Pause / un-Pause.............................................................................................19 Website đồ án...................................................................................................................20
Mở Đầu Đồ họa máy tính 2 mang đến cho sinh viên những kiến thức về lập trình 3d, làm game trên các nền tảng. Đồ án đồ họa 2, chúng em chọn làm một game flash nhỏ dựa trên platform game có sẵn. Qua quá trình làm đồ án, chúng em đã học hỏi được thêm kiến thức về lập trình action scripts trong flash. Website: http://nguyenhonggiang.it-uce.com
3 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9
Quy trình thực hiện Bước 1. Thay nhân vật. Nhân vật trong platform có sẵn được thay bằng một nhân vật mới.
Lập trình cho nhân vật: onClipEvent (load) { jumping = false; // jumping is true speed = 0; healthX = _root.health._x; //sets healthX to the starting X postition of the "health" MC scoreX = _root.score._x; scoreY = _root.score._y; healthY = _root.health._y; skyX = _root.sky._x; //sets scoreX to the starting X postition of the "score" MC skyY = _root.sky._y; Xpos = this._x; Ypos = this._y; maxmove = 15; ispaused = false; _root.maxshoottime = 60; } onClipEvent (enterFrame) { if (Key.isDown(112) || Key.isDown(80)) { if(ispaused==true) { _root._pause = false; ispaused = false; } else { _root._pause = true; ispaused = true;
4 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 } } if (_root._pause==false) { if (this._y > Stage.height + 100) { _root.health.text = 0; } if (_root.health.text == 0) { _root.dead=true; } _x = Xpos-_root._x; //sets the X pos to the starting X postition of this MC _root.score._x = scoreX-_root._x; _root.score._y = scoreY-_root._y; _root.sky._x = skyX - _root._x; _root.sky._y = skyY - _root._y; //sets the scire MCs X pos to its starting point on the screen _root.health._x = healthX-_root._x; _root.health._y = healthY-_root._y; //sets the health MCs X pos to its starting point on the screen if (!_root.ground.hitTest(this._x, this._y, true) && ! jumping) { // if NOT hitting X and Y postion with the ground and NOT jumping this._y += 6; // Y positon moves up 6 } _global.tongdiem = _root.score.text; if (!_root.shooting) { // if _root.shooting is false _root.timer = 0; // _root.timer is set to 0 _root.mvsp = _xscale/20; // _root.mvsp is set to the chars xscale divided by 20 // the answer to this is the speed of the bullets } //if (this._y > Stage.height + 100) { //_root.stop(); //_root.gotoAndStop("loser"); //} if (_root.dead) { stopAllSounds(); var atDie = new Sound();
5 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 atDie.attachSound("charDie"); atDie.start(0, 1); this.gotoAndStop("dead"); _root.health.text = 100; } else { speed *= .85; if (dir == "right") { _root.health._x += speed; // moves the health, the opposite way to the _root _root.score._x += speed; // moves the score, the opposite way to the _root this._x += speed; // moves the char, the opposite way to the _root _root._x -= speed; // moves the _root _root.tree._x += 0.7*speed; } if (speed>0) { //if speed is smaller than 0 dir = "right"; // the variable dir is set to right } else if (speed<0) { //if speed is greater than 0 dir = "left"; // the var dir is set to left } if (dir == "left" && !_root.cotmoc.hitTest(this._x-20, this._y, true)) { _root.health._x += speed; _root.score._x += speed; this._x += speed; _root._x -= speed; _root.tree._x += 0.7*speed; } if (Key.isDown(Key.LEFT)) { // if left is pressed if (speed>-maxmove) { // if the speed is greater than neg. maxmove speed--; // speed goes lower } this.gotoAndStop("run"); this._xscale = -100; } else if (Key.isDown(Key.RIGHT)) { if (speed<maxmove) {
6 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 // if the speed is smaller than maxmove speed++; // speed goes up } this._xscale = 100; this.gotoAndStop("run"); } else if (Key.isDown(Key.CONTROL)) { this.gotoAndStop("attack"); attacking = true; speed = 0; } else if (Key.isDown(Key.SPACE)) { if (_root.gotgun == true && !_root.shooting) { _root.attachMovie("bullet", "bulleter", 1, {_x:_root.char._x, _y:_root.char._y-25}); var _banAT = new Sound(); _banAT.attachSound("sound8"); _banAT.start(0, true); // attach the movie with the Linkage name "bullet" to the _root at the character X position and the Y position minus 25 _root.shooting = true; // _root.shooting is set true with (_root.bulleter) { // all code below this code and it's closer refer to _root.bulleter onEnterFrame = function () { if (_root.timer>_root.maxshoottime) { // if _root.timer is smaller than _root.maxshoottime _root.shooting = false; // shooting is false unloadMovie(this); // this movie clip is unloaded } _root.timer+=5; // _root.timer goes up 1 _x += _root.mvsp*5; // the X goes up _root.mvsp (which is set constantly and stays the same when shooting.) }; }; } attacking = true; // attacking is true speed = 0;
7 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 // speed is set to 0 this.gotoAndStop("shoot"); // goto and stop on the shoot frame } } else if (speed<1 && speed>-1 && !attacking) { // if speed is smaller than one and greater than neg. 1 speed = 0; // speed is set to 0 this.gotoAndStop("idle"); // gotoAndStop the idle frame } if (Key.isDown(Key.UP) && !jumping) { // if up is pressed and NOT jumping jumping = true; // jumping is set true } if (jumping) { // if jumping is true this.gotoAndStop("jump"); this._y -= jump; _root._y += 0.2 * jump; // Y position is set down jump jump -= .5; // jump is set down .5 if (jump<0) { // if jump is smaller than 0 falling = true; // falling is true } if (jump<-15) { // if jump is smaller than neg. 5 jump = -15; // jump is set to neg 5 // capping fall speeds prevents falling through grounds } } if (_root.ground.hitTest(this._x, this._y, true) && falling) { // if hitting X an Y postions with the ground and falling jump = 12; // jump is set to 9 jumping = false; // jumping is false falling = false; gotoAndStop("idle");
8 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 // falling is false } } } } onClipEvent (keyUp) { // on Key Up if (Key.getCode() == Key.CONTROL) { // if the release is control attacking = false; // attacking is false } if (Key.getCode() == Key.SPACE) { gotoAndStop("idle"); } if (Key.getCode() == Key.RIGHT) { gotoAndStop("idle"); } if (Key.getCode() == Key.LEFT) { gotoAndStop("idle"); } }
Bước 2. Thay Map. Thay map có sẵn, thêm những chi tiết : cây, cảnh nền để làm cho game sinh động hơn.
9 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9
Cột mốc ngăn không cho đi tiếp có tác dụng khóa lại map. Đặt tên cho movie này là cotmoc và khi nhân vật chạm vào tức là hitTest thì nhân vật sẽ không đi được nữa. if (dir == "left" && !_root.cotmoc.hitTest(this._x-20, this._y, true)) { _root.health._x += speed; _root.score._x += speed;
10 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 this._x += speed; _root._x -= speed; _root.tree._x += 0.7*speed; }
Thanh ngang chuyển động lên xuống giúp nhân vật có thể nhảy từ bên bờ bên này sang bờ bên kia. Để nhân vật khi đứng trên thanh ngang không bị rơi, ta sẽ kiểm tra hitTest của chính nó và nhân vật. Nếu hitTest thì di chuyển tung độ của nhân vật theo. onClipEvent(load) { dir = "up"; upstep = 0; downstep = 0; } onClipEvent(enterFrame) { if(dir=="up") { upstep--; this._y += -2; if (this.hitTest(_root.char._x, _root.char._y, true)) _root.char._y += -2; } if(dir=="down") { downstep++; this._y += 2; if (this.hitTest(_root.char._x, _root.char._y, true)) _root.char._y += 2; } if(upstep == -100) { upstep = 0; dir = "down"; } if(downstep == 100) { downstep = 0;
11 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 dir = "up"; } }
Bước 3. Thay và thêm Enemy. Enemy có 3 loại: Loại 1: bắn một phát là chết.
Loại 2: loại này khởi tạo cho chúng 50 máu và mỗi lần hitTest với viên đạn mất 2 máu.
onClipEvent (load) { enemyspeed = 2; enemystepsright = 0; enemystepsleft = 0; enemydir = "left"; dead = false; mau = 50; } onClipEvent (enterFrame) { if (Key.isDown(112) || Key.isDown(80)) { _root._pause = true; if (jumping) _root.char.gotoAndStop("idle"); } if (Key.isDown(111) || Key.isDown(79)) _root._pause = false; if (!_root._pause) { if (this.hitTest(_root.char.attackpoint)) {
12 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 mau -= 1; } if (this.hitTest(_root.bulleter)) { mau -= 2; } if (mau<=0) { enemyspeed = 0; enemystepsright = 0; enemystepsleft = 0; dead = true; this.gotoAndStop("dead"); } if (this.hitTest(_root.char) && !dead) { // if this hits the character and is not dead _root.char.jumping = false; // characters jumping state is set false //_root.dead = true; while(_root.health.text!=0) { _root.health.text -= 5; } //_root.health.text = 0; // _root.dead is set true } if (!dead) { // if NOT dead if (enemydir == "right") { enemystepsright += 1; this._xscale = -100; this._x += enemyspeed; } else if (enemydir == "left") { enemystepsleft += 1; this._xscale = 100; this._x -= enemyspeed; } if (enemystepsright == 100) { enemystepsright = 0; enemydir = "left"; } else if (enemystepsleft == 100) { enemystepsleft = 0; // enemystepsleft is set to 0 enemydir = "right"; } } }
13 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 }
14 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9
Loại 3: Loại này giống loại 2 nhưng có 100 máu.
onClipEvent (load) { enemyspeed = 2; enemystepsright = 0; enemystepsleft = 0; enemydir = "left"; dead = false; mau = 100; }
Bước 4. Lưu điểm. Lưu điểm là một khâu cũng rất cần thiết với các game flash. Để lưu điểm thì bạn có thể sử dụng PHP & MySQL hoặc PHP lưu vào file txt,….
15 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9
Tạo một movie clip scoreTable chứa các dynamic text. Các dynamic text tên và điểm được đặt tên NAME0-NAME9 và SCORE0-SCORE9. Tại frame high score, ta viết đoạn code sau: scoreTable.filename="scores.txt"; scoreTable.scoresize=10; scoreTable.viewtype="FLASH"; scoreTable.loadVariables("http://nguyenhonggiang.ituce.com/scores.php", "GET");
đoạn code trên chỉ ra file text lưu điểm là scores.txt, kích thước là mảng và load dữ liệu từ file scores.txt thông qua file scores.php
Lưu điểm khi bạn đã vượt qua (chiến thắng) game.
16 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9
Khi bạn là người chiến thắng, nhập tên vào ô dynamic text và nhấn save, điểm sẽ được lưu lại. on(release) { if(!_global.luu) { scoreTable.filename = "scores.txt"; scoreTable.scoresize = 10; scoreTable.action = "INSERT"; scoreTable.winname = _root.tenBan; scoreTable.winscore = _global.tongdiem; scoreTable.loadVariables("http://nguyenhonggiang.ituce.com/scores.php", "GET"); _global.luu = true; } }
Lưu điểm khi bạn thua.
17 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9
Cũng tương tự như frame win, khi bạn nhập tên vào ô dynamic text, nhấn save thì điểm và tên sẽ được gửi đến cho file scores.php và file này sẽ làm nhiệm vụ lưu điểm vào file scores.txt
Bước 5. Preloader. Thanh loader biểu diễn tình trạng tải game sẽ làm cho người dùng cảm thấy thoải mái khi chờ đợi. Nếu game hay file flash của bạn tương đối nặng, mạng chậm người dùng có thể không biết game hay flash của bạn có tải được hay không. Lúc đó pre-loader sẽ làm tan biến đi sự nghi ngờ đó.
18 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9
onClipEvent(load) { this.preloaderBar._xscale = 1; this.textLoader.text = 0 + "%"; _root.stop(); } onClipEvent(enterFrame) { var loaded = _root.getBytesLoaded(); var total = _root.getBytesTotal(); var percent = loaded / total; this.preloaderBar._xscale = Math.round(100 / total * loaded); this.textLoader.text = Math.round(percent * 100) + "%"; if (loaded >= total) { _root.play(); gotoAndStop("game", 1); } }
Bước 7. Pause / un-Pause. Khi pause, ta dừng tất cả hành động của nhân vật, enemy . 19 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1
Đồ Án Đồ Họa 2 200 9 Ta khai báo một biến _root.pause if (Key.isDown(112) || Key.isDown(80)) { _root._pause = true; if (jumping) _root.char.gotoAndStop("idle"); } if (Key.isDown(111) || Key.isDown(79)) _root._pause = false;
Nếu nhấn phím p hoặc P : pause, Nhấn phím o hoặc O: un pause.
Website đồ án Địa chỉ: http://nguyenhonggiang.it-uce.com
------------THE END-------------
20 Nguyễn Hồng Giang – 4228.51 – Lớp 51PM1