Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 74 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
74
Dung lượng
2,51 MB
Nội dung
TRƢỜNG ĐẠI HỌC SƢ PHẠM ĐÀ NẴNG KHOA TIN HỌC LUẬN VĂN TỐT NGHIỆP CỬ NHÂN CÔNG NGHỆ THÔNG TIN KHĨA 2009 NGHIÊN CỨU LẬP TRÌNH ĐỒ HỌA VÀ XÂY DỰNG GAME 3D CHO MOBILE Giáo viên hƣớng dẫn : Th.S TRẦN UYÊN TRANG Sinh viên thực : TRẦN ĐỨC HUY ĐÀ NẴNG THÁNG NĂM 2013 NHẬN XÉT CỦA GIÁO VIÊN HƢỚNG DẪN Đà Nẵng, ngày …… tháng …… năm 201… Giáo viên hƣớng dẫn NHẬN XÉT CỦA HỘI ĐỒNG XÉT DUYỆT Đà Nẵng, ngày …… tháng …… năm 201… Hội đồng xét duyệt Mục lục NHẬN XÉT CỦA GIÁO VIÊN HƢỚNG DẪN NHẬN XÉT CỦA HỘI ĐỒNG XÉT DUYỆT MỞ ĐẦU Chƣơng 1: CƠ SỞ LÝ THUYẾT Khái niệm đồ họa máy tính Sự phát triển đồ họa di động Khái niệm 3D 12 3.1 Hệ tọa độ chiều 12 3.2 Vertex (đỉnh) 15 3.3 Edge (cạnh) 15 3.4 Triangle & Quad (Tam giác hình đa giác) 16 3.5 Normal Vector (Vector pháp tuyến) 16 3.6 Pixel 17 3.7 Texture & Texel 17 3.8 Fragment 17 3.9 Phép chiếu song song phép chiếu phối cảnh 18 Các kênh màu (Color channel) 19 3.10 Các thƣ viện đồ họa DirectX, OpenGL OpenGL ES 20 Rendering Pipeline (quy trình trình chiếu hình ảnh) 30 Shader 33 Các khái niệm toán học 3D 35 Ma trận MVP 40 Texture 43 10 Mơ hình đối tƣợng (Model) 44 11 Ngôn ngữ GLSL 45 12 Cấu trúc trò chơi (game) 48 13 Giới thiệu Game Engine 49 Chƣơng 2: PHÂN TÍCH VÀ XÂY DỰNG ĐỀ TÀI 51 Giới thiệu đề tài nội dung game 51 Các thành phần gồm có game 53 Thiết kế lớp đối tƣợng 55 Chuyển game máy tính sang điện thoại 65 Một vài hình ảnh demo game 69 KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN 73 TÀI LIỆU THAM KHẢO 74 MỞ ĐẦU Ngày nay, phát triển bùng nổ thiết bị di động có tác động khơng nhỏ tới đời sống Có thể dễ dàng nhận thấy, thiết bị số di động nhƣ Smartphone (iPhone, Android,…), tablet (iPad, iPad mini, loại máy tính bảng khác,…) dần trở thành vật bất ly thân ngƣời, sử dụng chúng hầu nhƣ khắp nơi, lúc, học, công sở, chơi với bạn bè, nhà,… Chính phổ biến này, kèm theo phát triển vƣợt bậc công nghệ phần cứng lẫn phần mềm thiết bị di động biến điện thoại có hình trắng đen, nghe gọi nhắn tin ngày xƣa trở thành nhƣng cỗ máy mạnh mẽ với cấu hình mạnh, hệ điều hành đa nhiệm, đa tác vụ, kết nối internet thƣờng trực 24/24 với công nghệ 3G, wifi Nhờ mà nhu cầu giải trí thiết bị ngày tăng, đồng thời với cạnh tranh hãng sản xuất thiết bị di động cung cấp cho giới lập trình nhiều công cụ để hỗ trợ phát triển sản phẩm cơng nghệ, giải trí thiết bị di động, nhiều chợ ứng dụng đƣợc đầu tƣ phát triển để đảm bảo đầu cho sản phẩm ứng dụng di động, giúp lập trình viên dễ dàng kiếm đƣợc tiền từ sản phẩm dễ dàng đƣa sản phẩm đến thị trƣờng quốc tế cách nhanh chóng, mà khơng cần phải lo nghĩ nhiều cho việc quảng bá sản phẩm hay đau đầu chiến lƣợc kinh doanh phức tạp Để nắm bắt xu công nghệ giới tận dụng hội lớn này, em cảm thấy cần thiết phải nghiên cứu sâu vào lĩnh vực phát triển ứng dụng di động đầy hấp dẫn này, nên em chọn đề tài Nghiên cứu lập trình đồ họa xây dựng Game 3D cho mobile với mục tiêu có đƣợc nhìn tồn diện hiểu rõ đƣợc lập trình đồ họa, game, cơng nghệ đằng sau đó, để xây dựng cho cơng cụ mà từ sử dụng để xây dựng game tùy thích cho thiết bị di động (iPhone, iPad, Android phone,…) ứng dụng kiến thức xây dựng game 3D đơn giản lấy đề tài biển đảo Việt Nam với tên gọi: Game Bảo vệ Hoàng Sa Trƣờng Sa Chƣơng 1: CƠ SỞ LÝ THUYẾT Khái niệm đồ họa máy tính Đồ họa máy tính lĩnh vực khoa học máy tính nghiên cứu sở tốn học, thuật toán nhƣ kĩ thuật phép tạo, hiển thị điều khiển hình ảnh hình máy tính Đồ họa máy tính có liên quan nhiều đến số lĩnh vực nhƣ đại số, hình học giải tích, hình học họa hình, quang học, kĩ thuật máy tính, đặc biệt chế tạo phần cứng (các loại hình, thiết bị xuất, nhập, vỉ mạch đồ họa ) Theo nghĩa rộng hơn, đồ họa máy tính phƣơng pháp công nghệ dùng việc chuyển đổi qua lại liệu hình ảnh hình máy tính Đồ họa máy tính hay kĩ thuật đồ họa máy tính cịn đƣợc hiểu dƣới dạng phƣơng pháp kĩ thuật tạo hình ảnh từ mơ hình tốn học mơ tả đối tƣợng hay liệu lấy đƣợc từ đối tƣợng thực tế Thuật ngữ "đồ họa máy tính" (computer graphics) đƣợc đề xuất chuyên gia ngƣời Mĩ tên William Fetter vào năm 1960 Khi ơng nghiên cứu xây dựng mơ hình buồng lái máy bay cho hãng Boeing William Fetter dựa hình ảnh chiều mơ hình ngƣời phi cơng buồng lái để xây dựng nên mơ hình buồng lái tối ƣu cho máy bay Boeing Đây phƣơng pháp nghiên cứu vào thời kì Phƣơng pháp cho phép nhà thiết kế quan sát cách trực quan vị trí ngƣời lái khoang buồng lái William Fetter đặt tên cho phƣơng pháp computer graphics Lịch sử đồ họa máy tính vào thập niên 1960 cịn đƣợc đánh dấu dự án SketchPad đƣợc phát triển Học viện Công nghệ Massachusetts (MIT) Ivan Sutherland Các thành tựu thu đƣợc đƣợc báo cáo hội nghị Fall Joint Computer kiện lần ngƣời ta tạo mới, hiển thị thay đổi đƣợc liệu hình ảnh trực tiếp hình máy tính thời gian thực Hệ thống Sketchpad đƣợc dùng để thiết kế hệ thống mạch điện bao gồm thành phần sau: Màn hình CRT Bút sáng bàn phím bao gồm phím chức Máy tính chứa chƣơng trình xử lí thơng tin Với hệ thống này, ngƣời sử dụng vẽ trực tiếp sơ đồ mạch điện lên hình thơng qua bút sáng, chƣơng trình phân tích tính tốn thơng số cần thiết mạch điện ngƣời dùng vẽ nên Kỹ thuật đồ họa đƣợc liên tục hoàn thiện vào thập niên 1970 với xuất chuẩn đồ họa làm tăng cƣờng khả giao tiếp tái sử dụng phần mềm nhƣ thƣ viện đồ họa Sự phát triển vƣợt bậc công nghệ vi điện tử phần cứng máy tính vào thập niên 1980 làm xuất hàng loạt vỉ mạch hỗ trợ cho việc truy xuất đồ họa với giảm giá đáng kể máy tính cá nhân làm đồ họa ngày sâu vào sống thực tế Đồ họa máy tính có nhiều ứng dụng máy tính ƣớc tính đến 80% thơng tin xử lí hình ảnh Một số ứng dụng tiêu biểu đồ họa máy tính nhƣ là: Tạo mơ hình, hoạt cảnh (game, giải trí, ) Hỗ trợ thiết kế đồ họa Mơ hình ảnh, chuẩn đốn hình ảnh (trong y tế) Huấn luyện đào tạo ảo (quân sự, hành không, ) Sự phát triển đồ họa di động Ngày nay, với phát triển thiết bị di động, sức mạnh đồ họa ứng dụng di động ngày phát triển Ngay từ thời kì đầu tiên, mà thiết bị di động cịn sử dụng hình trắng đen ứng dụng đồ họa cho điện thoại bắt đầu đƣợc đầu tƣ phát triển, từ mục đích ban đầu tạo trị chơi giải trí đơn giản nhƣ Snake máy di động Nokia Dần dần sau, công nghệ thay đổi, chất lƣợng hình điện thoại ngày cải tiến, lĩnh vực đồ họa di động lại trỗi dậy với ứng dụng game có chất lƣợng cao hơn, bên cạnh đồ họa góp phần đem lại bóng bẩy, đại cho sản phẩm di động Game di động vào thời kì hình trắng đen năm 1998 Các game 2D J2ME vào thời kì năm 2004 Vào năm 2005, game 3D bắt đầu xuất chất lƣợng không cao Năm 2007, game di động chƣa có đột phá ngồi việc độ phân giải hình đƣợc tăng cao giúp hiển thị hình ảnh chi tiết Năm 2008, iPhone bắt đầu xuất hiện, kéo theo sức mạnh đồ họa đƣợc nâng cao, chất lƣợng hình cảm ứng đột phá đem lại thay đổi rõ rệt cho mặt game di động 10 _count = 0; _current++; _curLine = 0; } } } } } } else { LOGE("[SME] Scene file not found !\n"); } } Sau có lớp quản lý hình tạo hình game, hình game có cấu trúc nhƣ sau: class GameState { public: virtual void virtual void virtual void virtual void }; Init() = 0; Draw() = 0; Update(float deltaTime) = 0; Destroy() = 0; Ví dụ hình chọn level có cấu trúc nhƣ sau: class LevelSelectState: public GameState { public: Rectangle bgRect,survivalRect,storyRect; string *story; int currentPage, numPages; float timer; LevelSelectState(void); ~LevelSelectState(void); void void void void Init(); Draw(); Update(float deltaTime); Destroy(); }; Sau đó, bắt đầu xây dựng lớp đối tƣợng game, gồm có: Cannon súng đại bác Bullet – viên đạn dùng để bắn 60 WarShip – tàu địch Castle – tòa thành HP – máu ngƣời chơi Sea – mặt biển Khẩu súng đại bác có cấu trúc đối tƣợng nhƣ sau: class Cannon : public Singleton, public Objects { private: unsigned int numBullet;// số đạn có đồng thời số đạn giới hạn bắt đầu chơi public: float angle; //góc quay súng float count; unsigned int reload_time; bool isUnlimited; Cannon(void); ~Cannon(void); void init(); void Draw(); void setBullet(unsigned int);// set num of bullet unsigned int getBullet(void); void Update(float deltaTime); void rotLeft(float deltaTime); void rotRight(float deltaTime); void shock(); void reBegin(); void Fire(float _angle, float _v0); }; Cấu trúc đối tƣợng viên đạn: class Bullet : public Objects, public Singleton { public: int MAX_POW; int MIN_POW; float increase; float angle;// góc bay viên đạn so với trục Ox float v0;//vận tốc ban đầu viên đạn float time;//thời điểm viên đạn tính từ lúc bắn Vector3 cur_pos;// vị trí ban đầu viên đạn bool isFire; //biến lưu lại trạng thái viên đạn: bắn/chưa bắn Bullet(void); void init(); void reBegin(void); void Fire(float _angle, float _v0); void Update(float deltaTime); ~Bullet(void); 61 }; Lớp HP – hiển thị trạng thái máu ngƣời chơi class HP : public Status_Bar, public Singleton { float cur_hit; public: HP(void); void init(); void Draw(); void Update(float deltaTime); void Change(int value); bool getHit(); ~HP(void); }; Lớp WarShip – Định nghĩa tàu quân địch class WarShip : public Objects { int x, y; int dir; // direction of WarShip bool addScoreC, addScoreB; // test add score when colliding Castle or Bullet float leftW, rightW, topW, bottomW, frontW, backW; int num_Rotate; // test warship rotate? float dx, dz, agl; float Angle; // the symbol of angle rotatate around Oy Matrix mLocation; bool isBombed; bool direct ; bool checkColl; int typeColl; public: //bool movePearl; // direction when press button PEARL EnemyBullet* ebullet; int accurate; int timefire; Vector3 pos, rot, cmr; bool isUpdate; int count; WarShip(void); WarShip(int ); void initWS (void); 62 ~WarShip(void); void Rotate( float, float, float, float ); //void Draw(); void UpdateWS1( float ); void UpdateWS2( float ); bool isCollideBullet(void); bool isCollideCastle(void); bool isCollideWS ( WarShip ws ); void Update(float deltaTime); void Draw(); }; Để di chuyển súng đại bác sang trái phải theo kiện nhấn phím bấm vào nút hình Ta xử lý nhƣ sau: //cannon turn right if (GL2D::IsInRect(holdX, holdY, rectDirectionRight) || GL2D::IsInRect(holdX2, holdY2, rectDirectionRight)) { if (Camera::GetInstance()->getRotation().y >= -0.1) Camera::GetInstance()->Key(deltaTime, 39); cannon->rotRight(deltaTime); #ifdef _ANDROID if (ResourcesManager::GetInstance()->isPlaySound == 1) { StopSound(); PlaySound(2, 0); } #endif LOGI("Turn right\n"); } //cannon turn left if (GL2D::IsInRect(holdX, holdY, rectDirectionLeft) || GL2D::IsInRect(holdX2, holdY2, rectDirectionLeft)) { if (Camera::GetInstance()->getRotation().y Key(deltaTime, 37); cannon->rotLeft(deltaTime); #ifdef _ANDROID if (ResourcesManager::GetInstance()->isPlaySound == 1) { StopSound(); PlaySound(2, 0); } #endif LOGI("Turn left\n"); } Khi ngƣời chơi nhấn vào nút Fire, ta điều khiển cho lực bắn tăng lên giảm xuống nhƣ sau: 63 if (GL2D::IsInRect(holdX, holdY, rectFireBT) || GL2D::IsInRect(holdX2, holdY2, rectFireBT)) { if ( power < ) { bullet->increase *= -1; pow_bar->increase *= -1; } if ( power > bullet->MAX_POW ) { bullet->increase *= -1; //nếu lực bắn đặt tối đa lực bắn giảm xuống tiếp tục nhấn pow_bar->increase *= -1; } power += bullet->increase * (deltaTime * 50); pow_bar->scale += pow_bar->increase * (deltaTime * 50); LOGI("power: %f\tlengh bar: %f\n",power, pow_bar->scale); } Khi thả bắt đầu kiện bắn: if (GL2D::IsInRect(holdX, holdY, rectFireBT) || GL2D::IsInRect(holdX2, holdY2, rectFireBT)) { LOGI("Power: %f\n", power); pow_bar->Reset(); cannon->Fire(cannon->angle, power); //cannon->shock(); #ifdef _ANDROID if (ResourcesManager::GetInstance()->isPlaySound == 1) { StopSound(); PlaySound(1, 0); } #endif power = 0; } 64 Chuyển game máy tính sang điện thoại Để chuyển game từ máy tính sang điện thoại, cần cài đặt công cụ - Android SDK Android NDK Cygwin Sau cài đặt hồn tất mơi trƣờng bắt đầu việc chuyển đổi cách tạo Project Android Sau ta cần biên dịch file CPP game cách dùng NDK Cygwin Make Sau file định nghĩa file CPP cần biên dịch cho MAKE LOCAL_MODULE := libgl2jni LOCAL_CFLAGS := -Werror LOCAL_SRC_FILES := / /InternshipFW/3DMath.cpp \ / /InternshipFW/Application.cpp \ / /InternshipFW/BoxObject.cpp \ / /InternshipFW/BrokenGlass.cpp \ / /InternshipFW/Bullet.cpp \ / /InternshipFW/Camera.cpp \ / /InternshipFW/Cannon.cpp \ / /InternshipFW/Castle.cpp \ / /InternshipFW/CreditsState.cpp \ / /InternshipFW/EnemyBullet.cpp \ / /InternshipFW/FileSystem.cpp \ / /InternshipFW/FinishLevelState.cpp \ / /InternshipFW/GameLevelState.cpp \ / /InternshipFW/GameOverState.cpp \ / /InternshipFW/Graphic.cpp \ / /InternshipFW/Ground.cpp \ / /InternshipFW/HP.cpp \ / /InternshipFW/IngameState.cpp \ / /InternshipFW/Input.cpp \ / /InternshipFW/LevelSelectState.cpp \ / /InternshipFW/LoadingState.cpp \ / /InternshipFW/LogoScreenState.cpp \ / /InternshipFW/MainMenuState.cpp \ / /InternshipFW/ManageEnemy.cpp \ / /InternshipFW/Model.cpp \ / /InternshipFW/ObjManager.cpp \ / /InternshipFW/Objects.cpp \ / /InternshipFW/ObjectsManager.cpp \ / /InternshipFW/Particle.cpp \ / /InternshipFW/ParticleHP.cpp \ / /InternshipFW/ParticleSystem.cpp \ 65 / /InternshipFW/PearlSkill.cpp \ / /InternshipFW/ResourcesManager.cpp \ / /InternshipFW/SceneManager.cpp \ / /InternshipFW/ScoreManager.cpp \ / /InternshipFW/Sea.cpp \ / /InternshipFW/Shaders.cpp \ / /InternshipFW/StateManager.cpp \ / /InternshipFW/Status_Bar.cpp \ / /InternshipFW/TGA.cpp \ / /InternshipFW/Texture.cpp \ / /InternshipFW/TopScoreState.cpp \ / /InternshipFW/WaitingScreenState.cpp \ / /InternshipFW/WarShip.cpp \ / /InternshipFW/WaterSpark.cpp \ gl_code.cpp \ LOCAL_LDLIBS := -llog -lGLESv2 Sau biên dịch xong, dùng chƣơng trình JNI trung gian làm cầu nối C++ Java Chƣơng trình có nhiệm vụ liên kết file vừa biên dịch với Java để chạy Android #include #include #include #include static static static static static static " / /InternshipFW/Application.h" " / /InternshipFW/Input.h" jobject bridge; jmethodID android_playSound; jmethodID android_playMusic; jmethodID android_stopSound; jmethodID android_stopMusic; JavaVM* jVM; extern "C" { JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_init(JNIEnv * env, jobject obj, jstring sdpath); JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_step(JNIEnv * env, jobject obj, jfloat deltaTime); JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_pointer(JNIEnv * env, jobject obj, jint type, jint x, jint y, jint x2, jint y2); void Java_com_drybones_evate_GL2JNILib_BridgeJ2C( JNIEnv* env, jobject thiz, jobject obj ) { bridge = obj; jclass glViewClass; 66 (jVM)->GetEnv((void**) &env, JNI_VERSION_1_6); bridge = (jobject)(env)->NewGlobalRef( obj); glViewClass = (env)->GetObjectClass( bridge); android_playSound = (env)->GetMethodID(glViewClass, "playSound", "(II)V"); android_playMusic = (env)->GetMethodID(glViewClass, "playMusic", "(II)V"); android_stopSound = (env)->GetMethodID(glViewClass, "stopSound", "()V"); android_stopMusic = (env)->GetMethodID(glViewClass, "stopMusic", "()V"); LOGI("End C call java init"); } int JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv *env; jVM = vm; LOGI("JNI ONLOAD"); if((vm)->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) { return -1; } return JNI_VERSION_1_6; } // Play Sound void PlaySound(int id, int loop) { JNIEnv *env; (jVM)->GetEnv((void**) &env, JNI_VERSION_1_6); (env)->CallVoidMethod(bridge, android_playSound, id, loop); LOGI("\nPlay Sound from jni!!"); }; void PlayMusic(int id, int loop) { JNIEnv *env; (jVM)->GetEnv((void**) &env, JNI_VERSION_1_6); (env)->CallVoidMethod(bridge, android_playMusic, id, loop); LOGI("\nPlay Music from jni!!"); } void StopSound() { JNIEnv *env; (jVM)->GetEnv((void**) &env, JNI_VERSION_1_6); (env)->CallVoidMethod(bridge, android_stopSound); 67 } void StopMusic() { JNIEnv *env; (jVM)->GetEnv((void**) &env, JNI_VERSION_1_6); (env)->CallVoidMethod(bridge, android_stopMusic); } }; JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_init(JNIEnv * env, jobject obj, jstring sdpath) { LOGI("Start JNI Load"); Application::GetInstance()->Init( "/mnt/sdcard/Evate/Resource" ); LOGI("Finish JNI Load"); } JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_step(JNIEnv * env, jobject obj, jfloat deltaTime) { //LOGI("JNI deltaTime: %f", deltaTime); Application::GetInstance()->Render(); Application::GetInstance()->Update(deltaTime); } JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_pointer(JNIEnv * env, jobject obj, jint type, jint x, jint y, jint x2, jint y2) { if (type == 1) Input::GetInstance()->OnPointer(POINTER_DOWN, x, y, x2, y2); if (type == 2) Input::GetInstance()->OnPointer(POINTER_UP, x, y, x2, y2); } Dòng lệnh sau dùng để định đƣờng dẫn load liệu thẻ nhớ cho game Application::GetInstance()->Init( "/mnt/sdcard/Evate/Resource" ); Trong mã nguồn game, có đoạn xử lý kiểm tra, hệ thống Android thực chức riêng biệt, ví dụ: #ifdef _ANDROID if (ResourcesManager::GetInstance()->isPlaySound == 1) { StopSound(); PlaySound(2, 0); } #endif Đoạn chƣơng trình sau kiểm tra hệ thống Android bật âm 68 Một vài hình ảnh demo game Một vài hình ảnh q trình xây dựng game sản phẩm hồn thiện: 69 70 71 72 KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN Qua q trình làm đồ án, em có hội vận dụng toàn kiến thức đƣợc học suốt trình học tập trƣờng Đại học, với kiến thức đƣợc giới thiệu trình Thực tập vừa qua Điều đem lại cho em kinh nghiệm vô quý giá Vì kiến thức cịn có hạn thời gian làm đồ án không dài, nên không tránh khỏi sai sót hạn chế Em mong nhận đƣợc đóng góp nhiệt tình từ Cơ giáo hƣớng dẫn Hội đồng để em hồn thiện sản phẩm Về hƣớng phát triển cho đồ án, em hồn thiện chức có Game, tập trung cải thiện vấn đề xử lý game nhiều độ phân giải hình cho nhiều dịng điện thoại Android khác nhau, phát triển thêm chức hỗ trợ phát triển game cho tảng di động khác nhƣ iPad, BlackBerry, Windows Phone,… phát triển thêm để game Bảo vệ Hồng Sa Trƣờng Sa có thêm chiều sâu nội dung nhƣ cách chơi hấp dẫn phát hành miễn phí lên chợ ứng dụng nhƣ AppStore, Play Store để ngƣời dễ dàng tải chơi Em xin chân thành cảm ơn Cô Trần Uyên Trang tận tình hƣớng dẫn em suốt thời gian thực đồ án, em xin cảm ơn thầy cô Khoa Tin trƣờng Đại học Sƣ phạm Đà Nẵng tận tình dạy dỗ dẫn cho em kiến thức từ nên chuyên sâu suốt năm học để em có đƣợc tảng kiến thức tốt hồn thành đƣợc luận văn 73 TÀI LIỆU THAM KHẢO Giáo trình Lập trình Game 3D với OpenGL ES (tài liệu nội Công ty Gameloft) Website Songhoca (http://songho.ca) Giáo trình mơn Lý thuyết đồ họa 74 ... em cảm thấy cần thiết phải nghiên cứu sâu vào lĩnh vực phát triển ứng dụng di động đầy hấp dẫn này, nên em chọn đề tài Nghiên cứu lập trình đồ họa xây dựng Game 3D cho mobile với mục tiêu có đƣợc... đƣợc lập trình đồ họa, game, cơng nghệ đằng sau đó, để xây dựng cho cơng cụ mà từ sử dụng để xây dựng game tùy thích cho thiết bị di động (iPhone, iPad, Android phone,…) ứng dụng kiến thức xây dựng. .. Ultimate Game Studio, Colrist Entertaiment,… 50 Chƣơng 2: PHÂN TÍCH VÀ XÂY DỰNG ĐỀ TÀI Giới thiệu đề tài nội dung game Sau tìm hiểu kĩ lƣỡng vấn đề lý thuyết lập trình đồ họa, em bắt đầu xây dựng game