Vẽ hình vuông trong python
Trong bài hướng dẫn trước, mình đã giới thiệu khá nhiều thứ trong pygame. Trong bài hướng dẫn lần này, chúng ta sẽ tiếp tục tìm hiểu những cơ bản khác của pygame. Đây là những phần các bạn cần nắm để có thể làm một trò chơi hoàn chỉnh, bao gồm. cách thêm hình ảnh vào trò chơi, tạo chuyển động trong trò chơi, bắt sự kiện,. Bây giờ chúng ta cùng bắt đầu thôi Một số hàm vẽ thông thườngTrong bài hướng dẫn trước chúng ta đã tìm hiểu kỹ cách vẽ một hình chữ nhật. Trong phần này mình sẽ giới thiệu nhanh qua các hàm vẽ thường dùng trong pygame. Thực tế, trong trò chơi, người ta ít sử dụng các hàm để vẽ những hình ảnh đó, mà người ta sẽ sử dụng những tệp ảnh đó để thêm vào trong trò chơi. Mình thì sử dụng các hàm vẽ này trong lúc kiểm tra hoạt động của trò chơi trước khi đặt các hình ảnh vào. Ví dụ, nếu mình muốn làm game Flappy Bird thì mình sẽ vẽ con chim là hình elip trước, sau khi mọi thứ hoạt động ổn định thì mình sẽ tìm hình con chim để thay thế. Cách thêm hình ảnh vào thì mình sẽ nói ở phần sau. Giờ các bạn hãy xem nhanh qua đoạn code này nhé
Đây là kết quả khi chạy đoạn mã trên Hàm vẽ chữ nhật đã được giới thiệu ở phần trước. Bây giờ chúng ta đang tìm hiểu các hàm vẽ khác pygame. vẽ tranh. circle(bề mặt, màu sắc, tâm, bán kính, chiều rộng) Hàm này dùng để vẽ hình tròn
pygame. vẽ tranh. ellipse(surface, color, rect, width) Hàm này dùng để vẽ hình elip
pygame. vẽ tranh. đa giác(bề mặt, màu sắc, điểm, chiều rộng) Hàm này dùng để vẽ đa giác
pygame. vẽ tranh. line(surface, color, start_pos, end_pos, width) Hàm này dùng để vẽ một đoạn thẳng
Các bạn lưu ý là các giá trị về độ dài hay độ dài là các số nguyên, đơn vị là pixel Tạo chuyển động trong trò chơiSau khi tìm hiểu qua một số hàm vẽ, chúng ta đã vẽ được vài thứ trên màn hình. Bây giờ, các bạn sẽ tìm hiểu cách làm cho các hình ảnh chuyển động. Các bạn chạy thử đoạn code này nhé, mình sẽ giải thích sau
This is results Trước khi tìm hiểu các dòng code thì các bạn cần biết thêm 1 khái niệm là FPS (Frames Per Second). Hiểu theo nghĩa tiếng Việt thì FPS là lượng khung hình trong 1 giây. Ví dụ. nếu FPS là 60 thì trong 1 giây sẽ có 60 khung hình xuất hiện liên tiếp. Có thể ai cũng biết vòng lặp trong khi chạy rất nhanh, trong 1 giây sẽ lặp rất nhiều lần và tốc độ phụ thuộc vào nhiều yếu tố như mã trong vòng lặp, CPU. Vì thế để đảm bảo trò chơi hoạt động ổn định thì cần phải thiết lập FPS để vòng lặp trò chơi thực hiện với tốc độ định trước. Để thiết lập FPS, các bạn hãy chú ý những dòng code sau
Các dòng mã trên hoạt động thế nào thì các bạn có thể tự tìm hiểu thêm nhé Bây giờ chúng ta hãy tìm hiểu những dòng code khác
Những dòng mã trên được sử dụng để tạo một bề mặt chứa hình chiếc xe. Biến 7 là độ phóng đại của xe, dựa vào biến này để vẽ xe, vì muốn thay đổi vị trí của xe thì cần phải thay đổi biến này. Biến 8 đại diện cho bề mặt của xe, biến này được truyền vào các hàm vẽ bên dưới. Khi tạo bề mặt thì có một điểm khác với phần trước là có thêm tham số 9 được truyền vào. 9 dùng để xác định đây là 1 bề mặt có đặc tính trong suốt, nếu không có tham số này thì bề mặt sẽ có 1 màu nền đen, các bạn có thể bỏ qua 9 và chạy lại để thấy sự khác biệt. Các hàm bên dưới dùng để vẽ các hình lên 8 để tạo thành xe. Qua đây có thể biết được lợi ích của việc sử dụng bề mặt, bề mặt được tạo bên ngoài trò chơi vòng lặp và được vẽ sẵn lên đó, vì thế trong trò chơi vòng lặp chỉ cần thay đổi vị trí của cả bề mặt mà không cần chỉnh sửa lại từng hình đã có Bây giờ hãy nhìn vào bên trong trò chơi vòng lặp nhé 1Dòng mã trên để vẽ xe ( 8) lên cửa sổ ( 4). Vị trí vẽ có độ phóng đại là 7, biến này sẽ được thay đổi để tạo chuyển động cho xe. Thay thế nào thì xem đoạn mã bên dưới nhé 5Sau mỗi vòng lặp thì độ phóng đại của xe tăng lên 2 pixel. Điều kiện trong 6 để cho xe không chạy ra ngoài màn hình, khi phần đầu của xe ra khỏi màn hình thì vẽ xe ra phía sau bên phải. Do đó có thể tạo chuyển động cho xe rồi. Đơn giản quá đúng không nhỉSẵn đây mình cũng sẽ giới thiệu cho các bạn cách dùng lớp cho đoạn mã xe. Việc sử dụng lớp sẽ giúp quản lý các đối tượng trong trò chơi dễ dàng hơn. Các bạn chạy thử đoạn mã này nhé. Kết quả chạy thì cũng như trên thôi. 7Các bạn có thể dễ dàng nhận ra vị trí của xe ( 7) và bề mặt của xe ( 8) được tạo trong hàm khởi động 9. Có 2 hàm là 0 và 1 có tác dụng là vẽ và thay đổi vị trí của xe. Đây cũng là cấu trúc cơ bản của một đối tượng khi thiết lập trò chơi. Tất nhiên là những đối tượng khác nhau có thể có những cấu trúc khác nhau hơn, có những hàm đặc biệt hơnvẽ chữPhần này cũng không quá phức tạp nên mình sẽ lướt nhanh nhé. Các bạn hãy chạy thử đoạn mã và xem kết quả 3Trước tiên cần phải xác định phông chữ cần vẽ. Dòng dưới đây để tạo chữ chữ 4Biến 2 dùng để đại diện cho chữ cái đó, phông chữ được dùng là consolas, cỡ chữ là 30Tiếp theo là tạo một bề mặt và vẽ chữ lên đó. Dòng dưới đây có nhiệm vụ đó 0Tham số 3 4 là chữ cần vẽ. Tham số thứ 2 là True, cái này gọi là antialias, nếu giải kỹ thì khá dài dòng, hiểu đơn giản là nó sẽ làm "mềm" nét vẽ, các bạn có thể thử đổi thành 5 rồi chạy lại, kết quả cũng được . Tham số thứ 3 là màu chữ, ở đây là màu xanh. Tham số cuối cùng là màu nền, ở đây là màu đỏ. Nếu không truyền vào tham số cuối cùng thì chữ sẽ không có màu nền, các bạn có thể thử bỏ nó rồi chạy lại thửAdd imageTrước giờ chúng ta chỉ tạo ra những bề mặt rồi vẽ hình lên đó. Tuy nhiên, có những hình phức tạp (một con mario không có giới hạn) thì không thể sử dụng các hàm để vẽ được, hoặc nếu vẽ được thì rất phức tạp. Vì thế, người ta phải sử dụng những tệp hình ảnh có sẵn để thêm vào trong trò chơi. Nào, bây giờ hãy tìm hiểu cách để thêm hình ảnh vào. Để cho đơn giản, mình sẽ sử dụng phần mã xe ở phần trước. Mình sẽ thêm hình ảnh xe vào để thay thế cho các hàm vẽ Trước hết chúng ta sẽ tìm hình 1 chiếc xe trước. Hình này mình lụm ở đây và có chỉnh sửa lại cho phù hợp với kích thước 6. Chúng ta sẽ lưu tệp ảnh với tên xe. png and set the same directory with file codeNào, bây giờ chúng ta đến phần code. Các bạn hãy chạy thử đoạn code này nhé 1Kết quả là chiếc xe cũ đã được thay thế thành 1 hình khác, nhìn thú vị hơn đúng không Nếu để ý kỹ thì mã chỉ thay đổi một chút so với đoạn mã cũ. Các công cụ có thể trong hàm khởi tạo 9 của lớp 8, dòng tạo bề mặt và các hàm vẽ được thay thế bằng dòng 2Đây là dòng để thêm hình ảnh vào. pygame. hình ảnh. load() có tham số truyền vào là đường dẫn đến hình ảnh, ở đây tập tin ảnh cùng thư mục hiện tại nên không cần đường dẫn đầy đủ. Hàm này có kết quả trả về là một bề mặt, vì thế có thể sử dụng biến 8 như một bề mặt bình thườngEventMột trò chơi cần phải có sự tương tác với người chơi. Tất nhiên người chơi trò chơi thích điều khiển một chiếc xe hơn là xem nó tự chạy. Vì thế, chúng ta hãy tìm cách để có thể điều khiển được xe trong đoạn code trên nhé. Ý tưởng là thế này, khi nhấn giữ phím mũi tên trái thì xe chạy sang trái, khi nhấn giữ phím mũi tên phải thì xe chạy sang phải, đơn giản thế thôi Đoạn mã sau đây sẽ thực hiện điều đó, các bạn hãy nhập vào và chạy thử nhé. À mà các bạn nhớ đặt xe file. png time into the same directory nhe 3Đây là kết quả, khi nhấn giữ phím mũi tên trái thì xe chạy sang trái, khi giữ phím mũi tên phải thì xe chạy sang phải Phần này hơi phức tạp nên các bạn nhớ chú ý nhé Bây giờ hãy nhìn vào hàm 1 của lớp 8 4Có thêm 2 tham số đó là 2 và 3 dùng để kiểm tra xem xe chạy sang trái, sang phải hay đứng im. Các dòng 6 khá đơn giản nên mình không giải thích được nhiều về nó. Điều quan trọng ở đây là làm sao để điều chỉnh các tham số 2 và 3 ứng với công việc của phím mũi tên. Chúng ta hãy tìm hiểu các dòng mã khácCó thêm 2 biến được tạo bên ngoài trò chơi vòng lặp 5Đây là 2 biến tương ứng được truyền vào 7. Bây giờ, hãy chú ý đến phần bắt sự kiện bên trong vòng lặp 8 6Dòng 9 để kiểm tra xem có xảy ra sự kiện 10 hay không. 10 là sự kiện xảy ra khi có 1 phím được nhấn xuống. Các bạn lưu ý rằng sự kiện này chỉ xảy ra khi các phím tắt được nhấn xuống, khi các phím đang được giữ thì sự kiện này không xảy ra nữa (ngoại trừ khi có các phím khác được nhấn). Nghe có vẻ khó hiểu đúng không, các bạn cố gắng nhé, hãy tìm hiểu thêm nhiều nguồn khác nhau để hiểu rõ hơn. Trong đoạn 6 đó thì còn 2 dòng 6 nữa để kiểm tra phím được ấn là phím nào, dòng 14 để xem phím được ấn có phải là phím mũi tên trái hay không, nếu đúng thì gán cho 15 để xe chạy sang trái, tương Dòng 16 to check xem có xảy ra sự kiện 17 hay không. 17 là sự kiện xảy ra khi có 1 phím được giải phóng. Cũng tương tự như 10, sự kiện 17 chỉ xảy ra khi giải quyết các phím được thả ra. Các đoạn 6 bên trong cũng tương tự như các phần trên. Khi phím mũi tên bên trái được thả ra thì 52 (xe không chạy sang trái nữa), tương tự đối với trường hợp phím mũi tên phảiNgoài hai sự kiện 10 và 17 thì trong pygame còn rất nhiều sự kiện khác. Mình dùng hai sự kiện này để làm ví dụ về cách bắt sự kiện trong pygame, các sự kiện khác thì các bạn có thể tự tìm hiểu thêm hoặc mình sẽ giới thiệu trong từng bài hướng dẫn khácKết quảQua hai bài hướng dẫn, mình đã giới thiệu cho các bạn những phần cơ bản của pygame và lập trình trò chơi. Như mình đã nói từ trước, mình không thể hướng dẫn cho các bạn mọi thứ trong pygame. Điều quan trọng vẫn là khả năng tự tìm hiểu của các bạn. Trong bài hướng dẫn tiếp theo, mình sẽ cùng các bạn làm ra 1 game hoàn chỉnh. Tạm biệt và hẹn gặp lại ở những bài hướng dẫn tiếp theo |