TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
----------o0o---------
BÀI TẬP LỚN
MÔN ĐỒ HỌA MÁY TÍNH
Đề tài: Xây dựng game đồ họa 2D chém hoa quả
Giáo viên hướng dẫn: ThS.Vũ Minh Yến
Sinh viên thực hiện: Nhóm 8 lớp ĐH KHMT2 K6
1. Phạm Anh Đại
2. Lê Hồng Giang
3. Nguyễn Tiến Nhâm
Hà Nội 7/2013
NHÓM 8 _LỚP ĐH KHMT2K6
1
TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP HÀ NỘI
KHOA CNTT
Lời nói đầu
Đồ họa máy tính là một lĩnh vực của khoa học máy tính nghiên cứu về cơ sở
tốn học, các thuật toán cũng như các kĩ thuật cho phép tạo, hiển thị và điều khiển
hình ảnh trên màn hình máy tính. Đồ họa máy tính liên quan ít nhiều đến một số
lĩnh vực như đại số, hình học giải tích và hình học họa hình, quang học…… và kĩ
thuật máy tính và đặc biệt là chế tạo phần cứng ( các loại màn hình, các thiết bị
nhập xuất, các vi mạch đồ họa).
Nghiên cứu các phép biến đổi hình học trong không gian thực hai chiều là
một trong những nội dung quan trọng.
Qua thời gian tìm hiểu nhóm quyết định trọn đề tài Xây dựng game đồ họa
2D chém hoa quả trong khơng gian thực chúng em đã tìm hiểu được các thuật tốn
và các hàm đồ họa trong khơng gian 2 chiều .Ngồi ra trong q trình tìm hiểu về
để chọn ngôn ngữ để viết game chúng em cũng đã được tìm hiểu về đồ họa trên
một số ngơn ngữ khác ngồi C++. Đó là một trong những điểm mới mà trong q
trình làm BTL Nhóm tìm hiểu được.
Do q trình tìm hiểu cịn nhiều thiếu sót nên chương trình cịn nhiều hạn
chế, nhóm thực hiện rất mong nhận được ý kiến đóng góp từ phía cơ giáo và các
bạn để phần mềm được hồn thiện hơn!
“Nhóm BTL: Nhóm 8 lớp ĐH KHMT2 K6”
NHÓM 8 _LỚP ĐH KHMT2K6
2
TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP HÀ NỘI
KHOA CNTT
MỤC LỤC
Lời nói đầu.................................................................................................................2
I. TÌM HIỂU CÁC HÀM ĐỒ HỌA TRONG KHƠNG GIAN 2D........................3
1. Khởi tạo đồ họa màn hình.................................................................................3
2. Các hàm dùng để vẽ đường, điểm, miền.........................................................4
II. GIẢI THUẬT ĐIỀU KHIỂN GAME CHÉM HOA QUẢ..................................6
1. Vẽ quả cho game..............................................................................................6
2. Tiến trình điều khiển game...............................................................................7
III.
CÀI ĐẶT CHƯƠNG TRÌNH...........................................................................7
1. Giao diện game.................................................................................................7
2. Chương trình game...........................................................................................8
IV.
TÀI LIỆU THAM KHẢO..............................................................................28
V. KẾT LUẬN........................................................................................................28
NHÓM 8 _LỚP ĐH KHMT2K6
3
TRƯỜNG ĐẠI HỌC CƠNG NGHIỆP HÀ NỘI
I.
KHOA CNTT
TÌM HIỂU CÁC HÀM ĐỒ HỌA TRONG KHÔNG GIAN 2D
1. Khởi tạo đồ họa màn hình
Để khởi động chế độ đồ hoạ ta cần một số hàm sau :
Hàm void initgraph(int *graphdriver, int *graphmode, char *s) dùng để khởi
động chế độ đồ hoạ, trong đó s là đường dẫn tới tệp egavga.bgi, nếu s=””(rỗng)
thì máy tự tìm tệp egavga.bgi trên thư mục chủ. Giá trị của graphdriver và
graphmode được xác định trong bảng sau:
- Nếu graphdriver=VGA (hay 9) thì giá trị của graphmode có thể là VGALO
(hay 0) ứng với độ phân giải màn hình 640 x200 điểm ảnh,
graphdriver=VGAHI (hay 2) ứng với độ phân giải 640 x 480 điểm ảnh.
- Nếu graphdriver=DETECT (hay 0) thì trương trình tự tìm kiểu màn hình
đang dùng và gán cho graphdriver, tự động xác định chế độ đồ hoạ có độ phân
giải cao nhất gán cho graphmode.
Hàm int graphresult(void) cho mã lỗi khi khởi động đồ hoạ hay dùng các hàm
đồ hoạ. hàm cho giá trị bằng 0 tức là khơng có lỗi, cho giá trị khác khơng (mã
lỗi) thì có lỗi.
Hàm char *grapherrormsg(int k) cho lời giải thích bằng tiếng anh của lỗi đồ
hoạ, có mã lỗi là k.
Hàm void closegraph(void) dùng để đóng chế độ đồ hoạ.
Cấu trúc chung của một chương trình đồ hoạ:
- Khởi động hệ thống đồ hoạ.
- Xác định màu nền(màu màn hình), màu nét vẽ, màu tơ và kiểu tơ (mẫu tơ).
- Vẽ,tơ màu các hình mà ta mong muốn.
- Các thao tác đồ hoạ khác như cho hiện chữ....
- Đóng hệ thống đồ hoạ trở về mode văn bản.
NHÓM 8 _LỚP ĐH KHMT2K6
4
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
2. Các hàm dùng để vẽ đường, điểm, miền.
Hàm void putpixel(int x, int y, int color) : tơ điểm có toạ độ(x,y) trên màn hình
theo màu color
Hàm int getpixel(int x, int y) : trả về màu của điểm ảnh tại vị trí có toạ độ
(x,y).
Hàm void line(int x1,int y1,int x2,int y2) : vẽ đường thằng nối 2 điểm có toạ độ
(x1,y1) và (x2,y2), sau khi vẽ xong con trỏ vẽ quay về vị trí cũ (khơng thay đổi
vịtrí).
Hàm void lineto(int x,int y) : vẽ đường thẳng từ vị trí con trỏ vẽ hiện tại đến
điểm có toạ độ (x,y),vẽ xong con trỏ tới điểm có toạ độ (x,y).
Một số hàm sau đây dùng để vẽ một số hình học quen thuộc với góc vẽ được
xác định bởi gd và gc tức góc đầu đến góc cuối. Được quay theo chiều ngược
chiều kim đồng hồ:
Hàm void arc(int x, int y, int gd, int gc, int r) : vẽ một cung trịn với tâm có toạ
độ (x,y) , bán kính r, từ góc đầu tiên là gr đến góc cuối là gc (góc tính bằng độ).
Màu của nét vẽ do hàm setcolor() đặt;
Hàm void circle(int x, int y, int r) : vẽ đường tròn với tâm có toạ độ (x,y), bán
kính r.
Hàm ellipse(int x, int y, int gd, int gc, int rx, int ry) : vẽ một cũng ellipse với
tâm là (x,y) từ góc đầu gd đến góc cuối gc, bán kính trục x là rx, bán kính trục y
là ry.
Hàm void rectangle(int x1, int y1, int x2, int y2) : vẽ một đường chữ nhật có
đỉnh trên bên trái là (x1,y1) đỉnh dưới bên phải là (x2,y2).
Hàm void setfillstyle(int mẫu, int màu) : đặt mẫu tơ và màu tơ cho các hình đặc
và miền đóng. Màu có giá trị từ 0 đến 15 (xem lại ở bảng màu). Mẫu có giá trị
từ 0 đến 12 được cho ở bảng dưới. Với mẫu có giá trị 12 thì tự thiết kế mẫu tơ
theo 8byte
Hàm void pieslice(int x, int y, int gd, int gc, int r) : vẽ và tơ màu một hình quạt
có tâm là (x,y), bá kính r, từ góc đầu gd đến góc cuối gc.
NHÓM 8 _LỚP ĐH KHMT2K6
5
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
Hàm void sector(int x, int y, int gd, int gc, int rx, int ry) : vẽ và tơ màu một
mảnh ellipse có tâm là (x,y), từ góc đầu đến gd, đến góc cuối gc, có bán kính
trục x là rx, bán kính trục y là ry.
II.
GIẢI THUẬT ĐIỀU KHIỂN GAME CHÉM HOA QUẢ
1. Vẽ quả cho game
Ứng dụng các hàm đồ họa 2 D trong mơn đồ họa máy tính để vẽ các loại quả
sau đó tơ màu cho nó.
Giải thuật cho hàm vẽ một loại quả:
- Vẽ hình quả
Dùng hàm vẽ điểm putpixel để vẽ
- Tô màu cho quả
Hàm void dauloang(int x,int y,int f,int b)
{
if(getpixel(x,y)!=f&&getpixel(x,y)!=b){
putpixel(x,y,f);
dauloang(x,y+1,f,b);
dauloang(x,y-1,f,b);
dauloang(x-1,y,f,b);
dauloang(x+1,y,f,b);}}
2. Tiến trình điều khiển game
Các bước của tiến trình điều khiển game như sau:
- Khởi tạo quả
+ quả được vẽ bởi các hàm được khai báo ở trên trong quá trình vẽ quả, sau
khi gọi hàm vẽ quả , quả được vẽ và lưu vào một biến để khi mình gọi thơng
qua biến đó chứ khơng vẽ tiếp lần nữa.
NHÓM 8 _LỚP ĐH KHMT2K6
6
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
- Vẽ và xác định tọa độ của chuột
- Kiểm tra tọa độ chuột và tọa độ của quả nếu trùng nhau thì coi như quả đấy
bị chém và biến mất( xóa đi)
- Vẽ quả mới đường đi của quả được quy định trong 1 mảng 2 chiều lưu trong
một file .txt
- Sau khi quả bị chém thì gọi tiếp hàm vẽ quả ấy và tiếp tục cho di chuyển với
tọa độ quy định trong mảng 2 chiều.
- Thời gian quy định cho game kết thúc và dừng game.
III.
CÀI ĐẶT CHƯƠNG TRÌNH
1. Giao diện game
2. Chương trình game
#include <cstdlib>
#include <iostream>
#include <graphics.h>
NHĨM 8 _LỚP ĐH KHMT2K6
7
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
#include <windows.h>
#include <conio.h>
#include
using namespace std;
#define ROUND(a) ((long)(a+0.5))
//Các hàm putpixel ve qua
void DDA(int x1,int y1,int x2,int y2)
{
int x;
float y=y1;
float m=(float)(y2-y1)/(x2-x1);
putpixel(x,(int)y,GREEN);
if(x1{
x=x1;
for(int i=x1;i{
x++;
y+=m;
putpixel(x,(int)y,GREEN);
}
}
else
NHÓM 8 _LỚP ĐH KHMT2K6
8
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
{
y=y2;
x=x2;
for(int i=x2;i{
x++;
y+=m;
putpixel(x,(int)y,GREEN);
}
}
}
void vetamgiac(int x1,int y1,int x2,int y2, int x3, int y3)
{
DDA(x1,y1,x2,y2);
DDA(x2,y2,x3,y3);
DDA(x3,y3,x1,y1);
}
void plot(int xc, int yc, int x, int y, int color)
{
putpixel(xc+x, yc+y, color);
putpixel(xc-x, yc+y, color);
putpixel(xc+x, yc-y, color);
putpixel(xc-x, yc-y, color);
NHÓM 8 _LỚP ĐH KHMT2K6
9
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
}
void Bresenham_Ellipse(int xc, int yc, int xRadius, int yRadius, int color)
{
long x, y, px, py, rx2, ry2, p;
x = 0;
y = yRadius;
rx2 = xRadius * xRadius;
ry2 = yRadius * yRadius;
px = 0;
py = 2 * rx2 * y;
plot(xc, yc, x,y, color);
p = ROUND(ry2-(rx2*yRadius)+(0.25*rx2));
while (px < py)
{
x++;
px += 2*ry2;
if (p<0)
p += ry2 + px;
else
{
y--;
py -= 2*rx2;
NHÓM 8 _LỚP ĐH KHMT2K6
10
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
p+= ry2 + px - py;
}
plot(xc, yc, x, y, color);
}
p = ROUND(ry2*(x+0.5)*(x+0.5) + rx2*(y-1)*(y-1) - rx2*ry2);
while (y>0)
{
y--;
py -= rx2*2;
if (p>0)
p+=rx2-py;
else
{
x++;
px += ry2*2;
p += rx2 - py + px;
}
plot(xc, yc, x, y, color);
}
}
void Bresenham_Circle(int xc, int yc, int Radius, int color)
{
int x, y, d;
NHÓM 8 _LỚP ĐH KHMT2K6
11
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
x = 0;
y = Radius;
d = 3 - 2 * Radius;
while (x <= y)
{
putpixel(xc + x, yc + y, color);
putpixel(xc - x, yc + y, color);
putpixel(xc + x, yc - y, color);
putpixel(xc - x, yc - y, color);
putpixel(xc + y, yc + x, color);
putpixel(xc - y, yc + x, color);
putpixel(xc + y, yc - x, color);
putpixel(xc - y, yc - x, color);
if (d < 0)
d += 4 * x + 6;
else
{
d += 4 * (x-y) + 10;
y--;
}
x++;
}
NHÓM 8 _LỚP ĐH KHMT2K6
12
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
}
void dauloang(int x,int y,int f,int b)
{
if(getpixel(x,y)!=f&&getpixel(x,y)!=b)
{
putpixel(x,y,f);
dauloang(x,y+1,f,b);
dauloang(x,y-1,f,b);
dauloang(x-1,y,f,b);
dauloang(x+1,y,f,b);
}
}
void bau(int x, int y){
setcolor(4);
Bresenham_Circle(x,y,35,4);
dauloang(x,y,BLUE,4);
Bresenham_Circle(x-6,y-35,20,5);
dauloang(x-6,y-35,GREEN,5);
Bresenham_Circle(x-10,y-45,5,5);
dauloang(x-11,y-47,BLACK,5);
}
void tao(int x, int y){
NHÓM 8 _LỚP ĐH KHMT2K6
13
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
Bresenham_Circle(x,y,25,BLUE);
dauloang(x+1,y+1,GREEN,BLUE);
Bresenham_Ellipse(x-10,y-20,15,6,6);
dauloang(x-20,y-20,GREEN,6);
Bresenham_Ellipse(x+8,y-20,15,6,6);
dauloang(x+20,y-20,GREEN,6);
dauloang(x-1,y-20,BLUE,6);
}
void duaHau(int x, int y){
Bresenham_Ellipse(x,y,30,45,2);
dauloang(x,y,BLUE,2);
Bresenham_Ellipse(x,y,23,43,6);
dauloang(x,y,GREEN,6);
Bresenham_Ellipse(x,y,15,41,6);
dauloang(x,y,BLUE,6);
Bresenham_Ellipse(x,y,8,39,6);
dauloang(x,y,GREEN,6);
Bresenham_Ellipse(x,y,2,37,6);
dauloang(x,y,BLUE,6);
}
void NSlucky(int x, int y){
setcolor(5);
NHÓM 8 _LỚP ĐH KHMT2K6
14
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
Bresenham_Circle(x,y,25,5);
dauloang(x,y,YELLOW,5);
Bresenham_Circle(x,y,20,5);
dauloang(x,y,GREEN,5);
Bresenham_Circle(x,y,15,5);
dauloang(x,y,RED,5);
Bresenham_Circle(x,y,10,5);
dauloang(x,y,9,5);
Bresenham_Circle(x,y,5,5);
dauloang(x,y,BLUE,5);
Bresenham_Circle(x,y,2,5);
dauloang(x,y,15,5);
}
void boom(int x, int y){
setcolor(BLACK);
DDA(x-20,y-20,x-35,y-35);
Bresenham_Circle(x,y,30,4);
dauloang(x,y,0,4);
}
// Tien trinh dieu khien game
char *qbau, *xqbau, *qtao, *xqtao, *xqTron, *qDuaHau, *xqDuaHau,
*qNSlucky, *xqNSlucky, *qBoom, *xqBoom;
NHÓM 8 _LỚP ĐH KHMT2K6
15
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CNTT
int xbau, ybau, xtao, ytao, xDuaHau, yDuaHau, xNSlucky, yNSlucky,
xBoom, yBoom;
int checkbau, checktao,checkDuaHau, checkNSlucky, checkBoom;
int m;
int diem;
int checkEnd;
int DD[10][10000];
void khoiTaoQua();
void veChuot();
void checkChem(int x, int y);
void thoiGian();
void threadQua1();
void threadQua2();
void threadQua3();
void threadQua4();
void threadQua5();
void diemTongKet();
void get(int d[10][10000]);
void get(int d[10][10000]){
m = 5000;
diem = 0;
checkEnd = 0;
for(int i = 0; i < 6; i++)
for(int j= 0; jNHÓM 8 _LỚP ĐH KHMT2K6
16
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
DD[i][j] = d[i][j];
}
}
void khoiTaoQua() {
bau(55,55);
long szbau = imagesize(0,0,100,100);
qbau = (char*)malloc(szbau);
xqbau = (char*)malloc(szbau);
getimage(0,0,100,100, qbau);
getimage(100,100,200,200, xqbau);
putimage(0,0,xqbau,0);
tao(30,40);
long sztao = imagesize(0,0,80,80);
qtao = (char*)malloc(sztao);
xqtao = (char*)malloc(sztao);
getimage(0,0,80,80,qtao);
getimage(100,100,180,180, xqtao);
putimage(0,0,xqtao,0);
duaHau(50,70);
NHÓM 8 _LỚP ĐH KHMT2K6
17
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
long szDuaHau = imagesize(0,0,150,300);
qDuaHau = (char*) malloc (szDuaHau);
xqDuaHau = (char*) malloc (szDuaHau);
getimage(0,0,200,300,qDuaHau);
getimage(100,100,200,300, xqDuaHau);
putimage(0,0,xqDuaHau, 0);
NSlucky(40,50);
long szNSlucky = imagesize(0,0,150,300);
qNSlucky = (char*) malloc(szNSlucky);
xqNSlucky = (char*) malloc(szNSlucky);
getimage(0,0,200,300,qNSlucky);
getimage(100,100,200,300,xqNSlucky);
putimage(0,0,xqNSlucky,0);
boom(30,40);
long szBoom = imagesize(0,0,80,80);
qBoom = (char*)malloc(szBoom);
xqBoom = (char*)malloc(szBoom);
getimage(0,0,80,80,qBoom);
getimage(100,100,180,180,xqBoom);
NHÓM 8 _LỚP ĐH KHMT2K6
18
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
putimage(0,0,xqBoom, 0);
}
void veChuot() {
int x,y, x1, y1;
while(true) {
int luu[10000], sDiem = 0;
bool check1 = false;
bool check2 = false;
setcolor(BLUE);
if(ismouseclick(WM_LBUTTONDOWN)) {
check1 = true;
getmouseclick(WM_LBUTTONDOWN, x, y);
if(x != -1 && y != -1) {
x1 = x;
y1 = y;
circle(x,y,1);
luu[sDiem++] = x;
luu[sDiem++] = y;
checkChem(x, y);
}
}
NHÓM 8 _LỚP ĐH KHMT2K6
19
KHOA CNTT
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
while(check1 == true && check2 == false) {
getmouseclick(WM_MOUSEMOVE, x, y);
if(x != -1 && y != -1) {
line(x1, y1, x, y);
x1 = x;
y1 = y;
circle(x,y,1);
luu[sDiem++] = x;
luu[sDiem++] = y;
checkChem(x, y);
}
if(ismouseclick(WM_LBUTTONUP)) {
check2 = true;
getmouseclick(WM_LBUTTONUP, x, y);
if(x != -1 && y != -1) {
line(x1, y1, x, y);
x1 = x;
y1 = y;
circle(x,y,1);
luu[sDiem++] = x;
luu[sDiem++] = y;
checkChem(x, y);
//Xoa duong di
NHÓM 8 _LỚP ĐH KHMT2K6
20
KHOA CNTT