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
Mục số 2 đảm bảo ko chém gió
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
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ả.
Còn câu 3 nữa anh êi :v :))
Rule of thumb: 1GB cho toàn bộ project
Có commit mà
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
À em thấy rồi :)) tại màu trắng nên không để ý @@ đa tạ anh
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.
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.
tri_tran / ConsoleBrickGameSnake
Brick Game "Snake" simulation on Windows console
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
coi 2 cái file
fastconrend.h
vớifastconrend.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àmprintf
riêng để output vô cáioutBuf
tương ứng này nữa là xong thôi. Thêmgotoxy
đủ 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òngFCR_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ó HàmWriteConsoleOutputW
này xuất tất cả những gì có trongoutBuf
ra màn hình, có thể hiểu là nó swap 2 buffer.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 indexid
mảng 1 chiều của mảngbuf
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ọitrong đó color là ghép của
backcolor
vàtextcolor
: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 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
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 Hình như Windows ko cho phép đào sâu hơn ở phần console này hay sao ấy.
đ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.
ok em cảm ơn.