1. Trang chủ
  2. » Luận Văn - Báo Cáo

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ả

31 29 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Xây dựng game đồ họa 2D chém hoa quả
Tác giả Phạm Anh Đại, Lê Hồng Giang, Nguyễn Tiến Nhâm
Người hướng dẫn ThS. Vũ Minh Yến
Trường học Trường Đại Học Công Nghiệp Hà Nội
Chuyên ngành Khoa học máy tính / Đồ họa máy tính
Thể loại Bài tập lớn
Năm xuất bản 2013
Thành phố Hà Nội
Định dạng
Số trang 31
Dung lượng 209,97 KB
File đính kèm GAME CHEM HOA QUA.zip (763 KB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • I. TÌM HIỂU CÁC HÀM ĐỒ HỌA TRONG KHÔNG GIAN 2D (4)
    • 1. Khởi tạo đồ họa màn hình (4)
    • 2. Các hàm dùng để vẽ đường, điểm, miền (5)
  • 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 (6)
  • III. CÀI ĐẶT CHƯƠNG TRÌNH (7)
    • 1. Giao diện game (7)
    • 2. Chương trình game (7)
  • IV. TÀI LIỆU THAM KHẢO (31)
  • V. KẾT LUẬN (31)

Nội dung

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ở toá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 toán và các hàm đồ họa trong không gian 2 chiều .Ngoài ra trong quá 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 ngoài C++. Đó là một trong những điểm mới mà trong quá trình làm BTL Nhóm tìm hiểu được. Do quá 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 hoàn thiện hơn

TÌM HIỂU CÁC HÀM ĐỒ HỌA TRONG KHÔNG GIAN 2D

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)` được sử dụng để khởi động chế độ đồ họa trong lập trình C Tham số `s` là đường dẫn tới tệp `egavga.bgi`; nếu `s` rỗng (`""`), thì hệ thống sẽ tự tìm kiếm tệp `egavga.bgi` trong thư mục gốc của máy Giá trị của `graphdriver` và `graphmode` được xác định dựa trên bảng cấu hình phù hợp để thiết lập chế độ đồ họa mong muốn Hàm này đóng vai trò quan trọng trong việc bắt đầu hoạt động đồ họa của chương trình, đảm bảo các thiết lập phù hợp cho quá trình hiển thị hình ảnh.

Trong cấu hình hệ thống, nếu graphdriver là VGA (hoặc 9), thì giá trị của graphmode có thể là VGALO (hoặc 0), tương ứng với độ phân giải màn hình 640 x 200 điểm ảnh Ngược lại, khi graphdriver là VGAHI (hoặc 2), hệ thống sẽ sử dụng độ phân giải 640 x 480 điểm ảnh để nâng cao chất lượng hiển thị.

Khi biến graphdriverECT (hoặc 0), chương trình sẽ tự động xác định kiểu màn hình đang sử dụng và gán cho graphdriver Đồng thời, hệ thống sẽ tự động xác định chế độ đồ họa có độ phân giải cao nhất để gán cho graphmode, giúp tối ưu hóa trải nghiệm hiển thị trên thiết bị của người dùng.

Hàm int graphresult(void) dùng để kiểm tra mã lỗi khi khởi động đồ họa hoặc sử dụng các hàm đồ họa Hàm này trả về giá trị bằng 0 nếu không có lỗi, còn trả về mã lỗi khác không khi có sự cố xảy ra trong quá trình khởi động hoặc thực thi các hàm đồ họa Sử dụng hàm này giúp xác định chính xác trạng thái và xử lý lỗi kịp thời trong lập trình đồ họa.

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.

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)` dùng để vẽ đường thẳng nối hai điểm có tọa độ `(x1, y1)` và `(x2, y2)` Sau khi vẽ xong, con trỏ vẽ trở về vị trí ban đầu, không thay đổi vị trí thực thi của con trỏ Hàm này giúp tạo các hình dạng đồ họa chính xác, thuận tiện trong lập trình đồ họa 2D.

Hàm `void lineto(int x, int y)` vẽ một đường thẳng từ vị trí con trỏ vẽ hiện tại đến điểm có tọa độ (x, y) Sau khi vẽ xong, con trỏ tự động di chuyển đến điểm (x, y), giúp bạn dễ dàng tạo các đoạn đường thẳng chính xác trong các ứng dụng đồ họa Hàm này là thành phần quan trọng trong việc xây dựng các hình vẽ và chỉnh sửa hình ảnh trong lập trình đồ họa, đồng thời hỗ trợ tối ưu hóa quy trình vẽ bằng cách dễ dàng xác định điểm bắt đầu và điểm kết thúc của đường thẳng.

Các hàm sau đây giúp vẽ các hình học quen thuộc, với góc vẽ được xác định bởi góc đầu (gd) và góc cuối (gc) Quá trình vẽ được thực hiện theo chiều ngược chiều kim đồng hồ, đảm bảo chính xác và trực quan trong thiết kế đồ họa Việc sử dụng các hàm này tối ưu hóa quá trình tạo hình và tăng tính linh hoạt cho các dự án lập trình đồ họa của bạn.

Hàm void arc(int x, int y, int gd, int gc, int r) vẽ một cung tròn có tâm tại toạ độ (x, y) với bán kính r Cung tròn bắt đầu từ góc đầu tiên là góc gr và kết thúc tại góc cuối là gc, tính bằng độ Màu của nét vẽ được thiết lập bằng hàm setcolor().

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)` dùng để vẽ một hình ellipse với tâm tại điểm (x, y) Hàm này bắt đầu vẽ từ góc đầu `gd` và kết thúc tại góc cuối `gc`, giúp xác định phạm vi vẽ của ellipse Bán kính trục x của hình ellipse là `rx`, trong khi bán kính trục y là `ry`, đảm bảo hình ellipse chính xác theo các tham số đã định.

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)` dùng để thiết lập mẫu tô và màu tô cho các hình đặc và miền đóng trong lập trình đồ họa Màu sắc được xác định bằng các giá trị từ 0 đến 15 dựa trên bảng màu chuẩn Mẫu tô có các giá trị từ 0 đến 12, trong đó mẫu có giá trị 12 cho phép bạn tự thiết kế mẫu tô theo định dạng 8 byte Việc thiết lập này giúp tùy biến màu sắc và kiểu mẫu tô để tạo ra các hình ảnh đa dạng và sinh động.

Hàm `void pieslice(int x, int y, int gd, int gc, int r)` là hàm dùng để vẽ và tô màu một hình quạt có tâm tại điểm (x, y), bán kính r, bắt đầu từ góc đầu `gd` đến góc cuối `gc` Hàm này giúp tạo ra các hình quạt có hình dạng chính xác, phù hợp cho các dự án đồ họa và trực quan Việc sử dụng hàm này hỗ trợ người lập trình dễ dàng vẽ các loại hình quạt tròn, giúp tăng tính thẩm mỹ và hiệu quả trong thiết kế giao diện Với khả năng kiểm soát góc bắt đầu và kết thúc, hàm `pieslice` là công cụ lý tưởng để tạo các biểu đồ dạng hình quạt, biểu thị tỷ lệ phần trăm hoặc dữ liệu phân tích.

Hàm `void sector(int x, int y, int gd, int gc, int rx, int ry)` được sử dụng để vẽ và tô màu một phần của cung ellipse có tâm tại điểm (x, y) Hàm nhận các tham số như góc đầu (`gd`) và góc cuối (`gc`) để xác định đoạn cung cần vẽ, cùng với bán kính trục x (`rx`) và trục y (`ry`) để xác định kích thước của ellipse Đây là phương pháp hiệu quả để tạo các hình dạng phần cung ellipse theo yêu cầu trong đồ họa máy tính.

GIẢI THUẬT ĐIỀU KHIỂN GAME CHÉM HOA QUẢ

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ả:

Dùng hàm vẽ điểm putpixel để vẽ

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);}}

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:

Quả được vẽ bằng các hàm đã được khai báo trước đó trong quá trình lập trình Sau khi gọi hàm vẽ quả, hình quả sẽ được lưu vào một biến để tránh việc vẽ lại nhiều lần, giúp tối ưu hóa quá trình hiển thị Việc lưu hình ảnh vào biến còn giúp dễ dàng thao tác hoặc hiển thị lại quả trong các bước sau của chương trình Đây là cách hiệu quả để quản lý hình ảnh trong quá trình vẽ đồ họa bằng mã nguồn, đảm bảo hình quả được xử lý chính xác và tiết kiệm thời gian.

- 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.

CÀI ĐẶT CHƯƠNG TRÌNH

Chương trình game

#include using namespace std;

//Các hàm putpixel ve qua void ĐĂ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(x10) p+=rx2-py; else

{ x++; px += ry2*2; p += rx2 - py + px;

} void Bresenham_Circle(int xc, int yc, int Radius, int color)

This code snippet illustrates the process of plotting symmetrical points in a circle drawing algorithm, efficiently rendering a circle by exploiting its symmetry across all eight octants It demonstrates how to determine pixel positions relative to the circle's center, `(xc, yc)`, by calculating pairs of points and applying symmetry to optimize rendering The conditional statement `if (d < 0) d += 4 * x + 6; else` ensures the algorithm correctly updates the decision parameter `d`, guiding the placement of pixels to accurately trace the circle's perimeter Implementing these optimized plotting techniques can significantly improve the performance and visual quality of circle rendering in computer graphics applications.

} void dauloang(int x,int y,int f,int 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,25,BLUE); dauloang(x+1,y+1,GREEN,BLUE);

Bresenham_Ellipse(x+8,y-20,15,6,6); dauloang(x+20,y-20,GREEN,6); dauloang(x-1,y-20,BLUE,6);

} void NSlucky(int x, int y){ setcolor(5);

} void boom(int x, int y){ setcolor(BLACK); ĐĂx-20,y-20,x-35,y-35);

Trong quy trình điều khiển game, các biến như *qbau, *xqbau, *qtao, *xqtao, *xqTron, *qDuaHau, *xqDuaHau, cùng các tọa độ x và y như xbau, ybau, xtao, ytao, xDuaHau, yDuaHau, xNSlucky, yNSlucky, xBoom và yBoom được sử dụng để quản lý trạng thái của các đối tượng trong trò chơi Các biến kiểm tra như checkbau, checktao, checkDuaHau, checkNSlucky, checkBoom giúp xác định trạng thái hoạt động của từng phần tử Hàm initialize (khoiTaoQua) thiết lập đối tượng ban đầu, trong khi các hàm veChuot, checkChem, thoiGian đảm nhận nhiệm vụ vẽ bối cảnh, kiểm tra va chạm và theo dõi thời gian chơi Các hàm thread Qua (threadQua1, threadQua2, ) điều khiển chuyển động của các đối tượng, còn hàm diemTongKet ghi nhận điểm cuối cùng của trò chơi Bộ dữ liệu DD hỗ trợ lưu trữ trạng thái các phần tử trong game, và hàm get() giúp khởi tạo hoặc cập nhật dữ liệu này, bắt đầu với mốc m = 5000, điểm số = 0 và trạng thái kết thúc = 0.

Chức năng `khoiTaoQua()` thực hiện việc khởi tạo các hình ảnh cây cảnh và quả trên màn hình bằng cách lấy dữ liệu hình ảnh từ các phần tử gốc, sau đó sao chép và hiển thị chúng ở vị trí mong muốn Quá trình này bao gồm việc sử dụng hàm `imagesize` để xác định kích thước ảnh, cấp phát bộ nhớ phù hợp, và sử dụng các hàm như `getimage` và `putimage` để xử lý hình ảnh, giúp tạo ra các đồ họa sinh động phù hợp cho trò chơi hoặc ứng dụng trực quan.

This code demonstrates image processing techniques such as loading, cropping, and displaying images using memory management functions It begins by defining specific coordinates and dimensions for image extraction, then allocates memory dynamically to store these images The process involves retrieving image sections, like the background and a specific object, and then rendering them onto the display Additionally, the code includes a 'boom' effect, where a smaller image is loaded, cropped, and displayed to create visual impact Optimizing memory allocation and image handling ensures efficient rendering in graphic applications.

This article presents a code snippet for a mouse click detection function in a graphical environment It initializes coordinate variables and continuously listens for mouse clicks When a left mouse button click is detected, it captures the click position, draws a small circle at that point, and stores the coordinates in an array The function also includes checks to handle multiple clicks and update the status accordingly Implementing such mouse event handling is essential for interactive applications and user interface development using graphics libraries Properly managing mouse inputs enhances user experience by enabling dynamic and responsive visual interactions.

} 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);

This code snippet demonstrates how to remove or erase specific paths in a graphical application by iterating through stored coordinate points It sets the drawing color, retrieves coordinate pairs from an array, and then draws circles at each point followed by connecting lines between them This process effectively clears or updates the visual paths on the screen, ensuring smooth rendering in graphical programs.

// kiem tra toa do chuot có nam trong toa do cua qua hay khong? void checkChem(int x, int y) { if((xbau -10 ) < x && x < (xbau + 70) && (ybau - 10) < y && y < (ybau + 70))

} if((xtao -10 ) < x && x < (xtao + 70) && (ytao - 10) < y && y < (ytao + 70))

} if((xBoom -10) < x && x < (xBoom + 70) && (yBoom -10) < y && y < (yBoom + 70))

} setcolor(YELLOW); settextstyle(1,0,8); char tDiem[10]; itoa(diem, tDiem, 10); outtextxy(850, 110, tDiem); settextstyle(1,0,5); outtextxy(850, 70, "Scores");

} void thoiGian() { int t = 60; settextstyle(1,0,3); outtextxy(800 , 10, "Time: "); outtextxy(1030 , 10, "s"); settextstyle(1,0,5); while(t >=0) { itoa(t, hien, 10); outtextxy(950 , 1, hien); t ; delay(1000); if(t == -1) checkEnd = 1;

} void threadQua1() { checkbau = 0; int random = rand()%7; for(int i=0; i

Ngày đăng: 22/08/2023, 08:51

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w