Project Snake C++ và một vài câu hỏi về GitHub

Chẳng là em vừa làm xong cái game console đầu tiên kể từ ngày cai nghiện Unity :’( Qua project này em muốn hỏi các anh chị một vài vấn đề như sau:
1/ Cách xử lý game loop của anh chị như thế nào? Của em sao màn hình nó cà giựt cà giựt chóng mặt quá :’(
2/ Em nghe một ông đang học OpenGL là ổng chưa từng học win32api , vậy đó có phải là chém gió không? Tại em thấy ebook nào về OpenGL cơ bản hay DirectX cơ bản đều có win32api ở đầu tiên.
3/ GitHub nó cung cấp cho mình bao nhiêu Gb để lưu trữ? Với sao cái Github for Window nó không có nút commit ạ :v em phải commit bằng Shell.

Link project ạ: https://github.com/hoangtrung1999/Snake-C-.git

2 Likes

Mục số 2 đảm bảo ko chém gió :smile:

2 Likes

Thế tại sao các ebook nó lại có phần đó vậy anh @@ với không học thì có sao không? Cái đó em ráng nuốt mãi mà thấy tiến bộ chậm quá @@

Hì, mình ko học OpenGL nên vì sao ngta dùng WinAPI thì mình cũng chả biết :<.
Nhưng mình thấy có nhiều người code mà ko cần dùng WinAPI :stuck_out_tongue:
http://www.jonathancortes.com/projects.php#ballenger
Như cái Tiny quest ở link trên.
Down source về xem sơ thì mình ko thấy WinAPI nào cả.

3 Likes

Còn câu 3 nữa anh êi :v :))

Rule of thumb: 1GB cho toàn bộ project

2 Likes

Có commit mà :penguin:
Nhưng nó ko rõ lắm thôi

-> Tab Changes ở dưới có khung summary, ghi thông tin vô nó hiện ra nút commit to master

3 Likes

À em thấy rồi :)) tại màu trắng nên không để ý @@ đa tạ anh :slight_smile:

1 Like

Mình học cơ bản về OpenGL thấy nó viết sẵn cho hàm để gọi 1 cửa sổ Window rồi. Kể cả SDL 2.0 hay SFML đều có hàm để tạo ra cửa sổ đồ họa.

2 Likes

1/ Tạo 1 cái buffer riêng rồi “vẽ” hay output vô cái buffer này, sau đó swap buffer này với buffer của console cho nó vẽ. Với cách này thì output 100 lần cũng chả xi nhê gì. Cách này có lẽ cũng là cách mà SDL hay SFML làm đó. Draw riêng rồi ngay cuối mỗi game loop phải có 1 dòng Render chính là swap buffer này.

https://bitbucket.org/tri_tran/consolebrickgamesnake

cái window này có 112 cột x 83 dòng. Chạy có chớp nhưng ko phải giật giật :joy:

coi 2 cái file fastconrend.h với fastconrend.c ấy. Đại khái là tạo 1 biến toàn cục mà phần chính là CHAR_INFO* outBuf; đây sẽ là mảng “2 chiều” tương ứng với từng ký tự trên màn hình console output. Output cái gì thì viết 1 hàm printf riêng để output vô cái outBuf tương ứng này nữa là xong thôi. Thêm gotoxy đủ kiểu nữa, chỉ cần tính ra index tương ứng của vị trí ô chữ trên màn hình thành index trong mảng 1 chiều.

xong rồi nhìn qua main.c thì trước khi kết thúc game loop thì phải có thêm 1 dòng FCR_writebuffer(); để swap 2 buffer này. Giống như SDL RenderPresent hay SFML window.display(); vậy.

tuy màn hình có thể xem là mảng 2 chiều nhưng thực tế làm mảng 1 chiều thì tiện hơn. Ví dụ viết quá chiều rộng màn hình thì nó sẽ xuống dòng, mảng 2 chiều phải mất công cắt chuỗi ra rồi viết vào row tiếp theo, trong khi mảng 1 chiều thì cứ xuất vô tư thôi. Với lại WriteConsoleOutputW của Windows cung cấp thì CHAR_INFO* là mảng 1 chiều nên phải chiều nó :joy: Hàm WriteConsoleOutputW này xuất tất cả những gì có trong outBuf ra màn hình, có thể hiểu là nó swap 2 buffer.

3 Likes

Thế nếu mình không dùng hàm do windows cung cấp thì mình tự viết như thế nào anh? Em chưa hình dung ra ý tưởng.

“tự viết” là tự viết làm sao… Trước sau gì cũng phải đụng tới hàm của Windows cung cấp mà, vì vẽ vô màn hình console của Windows, sao mà né win api được ~.~ Có thể làm theo cách khi con rắn di chuyển thì chỉ cần xóa phần đuôi (bằng cách gotoxy tới phần đuôi rồi output khoảng trắng) rồi vẽ phần đầu mới (gotoxy tới phần đầu rồi vẽ), ko cần phải vẽ tất cả lại từ đầu. Nhưng làm vậy thì phức tạp hóa vấn đề lên khi con rắn ăn mồi, phải vẽ lại phần đuôi, vẽ mồi mới.

phần chậm ở đây là ở chỗ cout / putchar / v.v… mình xuất thẳng ra màn hình console. Hình dung nó như là mỗi lần viết bài lên bảng thì phải đi về chỗ ngồi coi công thức 1 cái, rồi lên bảng viết 1 cái, v.v… làm 100 lần như vậy thì rất chậm. Ý tưởng ở đây là tạo 1 mảng ví dụ char[25][80] (25 dòng 80 cột) tương ứng với từng ô trên màn hình console, rồi mình cout/putchar/textccolor v.v… gì vô mảng này hết, rồi xuất mảng này 1 lần ra màn hình. Như vậy tuy phải xuất hơn 1000 chữ nhưng mình chỉ ôm 1 cuốn tập lên bảng chép, ko phải chạy lên chạy xuống chỗ ngồi như trước nữa, lẹ hơn.

nhưng nếu cout ra cái mảng 2 chiều này thì cũng chậm như cũ chả khác gì. Windows có cung cấp hàm xuất từ 1 mảng CHAR_INFO ví dụ đặt tên là buf ra màn hình console thẳng thay vì thông qua cout/v.v… là hàm WriteConsoleOutput. CHAR_INFO thì đơn giản chỉ có 2 phần tử là Char là union của WCHAR (2-4 byte) và CHAR (1 byte) và Attributes là 1 integer cho biết màu chữ/màu nền/kiểu nền của ký tự đó. Tùy vào mình kêu hàm nào mà console sẽ xuất ra UnicodeChar hay AsciiChar.

bây giờ thay vì xài cout/printf v.v… thì mình đành phải xuất vào cái mảng buf. Tọa độ (x,y) khi gọi hàm gotoxy cũng phải update index id mảng 1 chiều của mảng buf này.

code ở main() vẫn giữ nguyên, chỉ sửa những chỗ xài cout/putchar lại thành hàm riêng của mình viết, ví dụ put_char_info(char c) thì gọi

buf[id].Char.AsciiChar = c;
buf[id].Attributes = color;

trong đó color là ghép của backcolortextcolor: color = (backColor<<4) + textColor;

em thích thư viện đồ họa mà ko có bóng dáng của Win API thì có SDL2 hoặc SFML đó. 2 thư viện này có đầy đủ từ vẽ hình tới vẽ chữ tới âm thanh tới network chứ ko chỉ gói gọi ở xuất chữ như màn hình console. Vọc Unity thì như lái xe đua chả ngắm cảnh gì được, xuống console thì như chặt tay chặt chân :joy: Học SDL2 ~ đi bộ hoặc SFML ~ chạy, ngắm cảnh cho biết với người ta chứ ai đi chặt tay chặt chân bò lết :joy:

3 Likes

Cái phần buffer em có xem clip của anh Đạt rồi , ý em là cái phần swap buffer . Xem clip của anh Đạt thì em hiểu là gom tất cả input lại rồi xuất 1 lần duy nhất , nhưng cái em thắc mắc là cái này , hàm này nó khác với cách dùng mảng 2 chiều như thế nào? Câu trên em hỏi ý là tự viết lại cái hàm này có được không :v tại em muốn hiểu cách nó hoạt động ra sao.

anh gu gồ cũng ko thấy ai làm được hết :joy: Hình như Windows ko cho phép đào sâu hơn ở phần console này hay sao ấy.

2 Likes

:joy: đau thật , vậy cho em hỏi thêm 1 câu nữa thôi , nếu làm game console mà phải dùng với bộ đệm thì có những cách nào ngoài hàm anh đã nói không ạ ( trừ cách dùng mảng 2 chiều lun )

hình như là ko. Muốn vẽ từng pixel thì kiếm thư viện khác chứ console thì chỉ có các ô chữ.

gu gồ thấy có cái PDCurses mà nó cũng giả lập console thôi.

2 Likes

ok em cảm ơn.:blush:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?