Làm game Flappy Bird
Mục tiêu: Làm game Flappy Bird: chim bay qua các cột ống, chạm ống hoặc đất thì thua.
Em sẽ học gì
- Nội dung trong bài: các nhân vật cùng hoạt động và lập trình song song
- Vòng lặp, Sự kiện, Thông điệp, di chuyển, trang phục hoạt hình
- Lệnh điều kiện, các biến nhớ điểm số, trạng thái và tốc độ.
- Tạo bản sao, trọng lực và va chạm.

Ta bắt đầu bài làm! Mở một bài làm mới, chưa có nhân vật nào. Các hình ảnh nhân vật đã được tải sẵn thành các file để sử dụng. Gồm chim bay có ba kiểu cánh, cột ống, mặt đất, nền thành phố, màn hình chờ và màn hình Game Over. Ta sẽ tải các nhân vật lên. Ta Bấm vào nút chọn nhân vật ở góc dưới bên phải, Đầu tiên ta tải cột ống lên. Chọn nút Tải lên, rồi chọn file cột ống. Đặt tên là Pipe, Vị trí nhân vật tính bằng hai toạ độ x và y. Sân khấu rộng từ âm 240 đến 240 theo chiều ngang x, và từ âm 180 đến 180 theo chiều dọc y. Điểm chính giữa sân khấu có x bằng 0, y bằng 0. chọn cột ống, đặt x bằng 264, để ống di chuyển ra mép phải sân khấu, và y bằng 0 để ở giữa theo chiều dọc

Cột ống cần một tiếng báo khi chim ghi điểm. Mở thẻ Âm thanh, bấm vào nút chọn âm thanh, chọn Tải âm thanh lên, rồi chọn file point, là tiếng ghi điểm.

Quay lại thẻ Code. Tiếp theo, phần mặt đất: ta chọn nhân vật, Tải nhân vật lên, rồi chọn file mặt đất. Đặt tên là Ground, Đặt vị trí x bằng 0, y bằng âm 147: để mặt đất sát phía dưới cùng sân khấu. Đến chú chim: ta chọn nhân vật, Chọn file chim bay. Đặt tên là Bird, x bằng âm 100: chim đứng sang bên trái y bằng 0.

Chim cần ba kiểu cánh để vỗ cánh. Mở thẻ Trang phục, bấm vào nút thêm trang phục, chọn Tải trang phục lên, và chọn file cánh giữa. Thêm tiếp trang phục: bấm vào nút thêm, rồi chọn file cánh xuống.

Chim còn cần tiếng vỗ cánh. Mở thẻ Âm thanh, bấm vào nút chọn âm thanh, chọn Tải âm thanh lên, rồi chọn file wing, là tiếng vỗ cánh.

Với 3 kiểu cánh này, khi thay đổi liên tục ta sẽ thấy chim đang đập cánh. Quay lại thẻ Code. Phần Màn hình chờ: bấm vào nút chọn nhân vật, bấm Tải nhân vật lên, rồi chọn file màn hình chờ. Đặt tên là Gét Red đi x bằng 0, để màn hình chờ nằm chính giữa sân khấu, đặt y bằng 30 để dịch lên 1 chút kích thước 60 phần trăm, để thu hỏi lại chút cho vừa. Đến phần Màn hình thua: ta chọn nhân vật, Tải nhân vật, chọn file Game Over. Đặt tên là Game Over, x bằng 0, cũng nằm chính giữa, y bằng 40: hình này sẽ hiện ra khi chim thua.

Lúc thua cần một tiếng va chạm. Mở thẻ Âm thanh, bấm vào nút chọn âm thanh, chọn Tải âm thanh lên, rồi chọn file hit, là tiếng va chạm.

Quay lại thẻ Code. Cuối cùng là nền: bấm vào nút chọn phông nền, Tải phông nền lên, chọn file nền thành phố.

Vậy là đã đủ hình ảnh. Ta Quay lại phần Code.

Bây giờ tạo biến. Chọn nhân vật Bird. Vào nhóm Các biến số, chọn Tạo một biến, đặt tên biến là score: đây là biến điểm số, dùng chung cho mọi nhân vật, rồi bấm OK. Tạo biến thứ hai, đặt tên là playing: cho biết trò chơi đã bắt đầu chưa, bằng 0 là chưa, bằng 1 là đang chơi, bấm OK. Tạo tiếp một biến thứ ba, đặt tên v y: là trọng lực để chim sẽ bay lên hay rơi xuống. chỉ chim dùng nên chọn Chỉ nhân vật này, bấm OK. Bỏ dấu tick của v y và của playing, để ẩn bớt các ô biến số trên sân khấu, chỉ giữ ô điểm số trên màn hình để xem điểm khi chơi.

Bây giờ ta bắt đầu viết lệnh. Ta chọn nhân vật đường ống: Pipe.

Việc cần làm: tạo các cột ống mới, cách nhau một khoảng ngẫu nhiên.
Sơ đồ thuật toán của ống gốc: ẩn đi, đợi đến khi trò chơi bắt đầu, rồi lặp mãi: tạo một bản sao cột ống, chờ 2 đến 2,5 giây.

Ta Chọn nhóm Sự kiện, kéo khối lệnh: Khi bấm vào cờ xanh,

gắn khối lệnh ẩn đi: để ống gốc tự ẩn đi lúc bắt đầu.

Thêm khối đợi đến khi, trong nhóm Điều khiển,

đưa phép so sánh bằng vào ô điều kiện, bên phải là 1,

bên trái là biến playing: đợi đến khi playing bằng 1, là khi trò chơi bắt đầu.
Giải thích: Khối đợi đến khi điều kiện đúng, tức là playing bằng 1, thì sẽ chạy lệnh tiếp theo

Thêm khối vòng lặp mãi mãi, tên khối là Liên tục,
Giải thích: Khối vòng lặp mãi mãi , lặp lại các khối lệnh bên trong, có thể dừng khi ta đặt điều kiện dừng.

bên trong tạo một bản sao của ống: mỗi bản sao của chính nó
Giải thích: Để ống sẽ tạo liên tục các bản sao, và di chuyển về phía chim, để trông như chim đang bay qua ống.

Sau mỗi bản sao, thêm khối chờ,

với số giây lấy ngẫu nhiên, từ 2 đến 2,5 giây. Ta vừa làm: ống ẩn đi, đợi trò chơi bắt đầu, rồi cứ chờ ngẫu nhiên và tạo thêm một bản sao.
Giải thích: để các cột ống sinh ra ngẫu nhiên cho sinh động

Chạy thử: ta tạm đặt playing bằng 1, rồi bấm cờ xanh, ống gốc ẩn đi và liên tục tạo bản sao ẩn. Ta viết script cho bản sao để thấy chúng chạy.

Việc cần làm: ống sẽ chạy từ phải sang trái, nếu không chạm con chim thì cộng điểm, ống ra khỏi màn hình thì tự xoá.
Sơ đồ của bản sao ống: hiện ở mép phải với độ cao ngẫu nhiên. Chưa ra khỏi mép trái thì dịch sang trái 3 bước, vừa qua chim thì cộng một điểm. Ra khỏi mép trái thì xoá bản sao.

Giờ viết cho bản sao: kéo khối, Khi tôi bắt đầu là một bản sao,
Giải thích: Khối khi tôi bắt đầu là một bản sao, chạy khi bản sao vừa được tạo ra.

gắn khối đi tới điểm x y, x bằng 260, để bắt đầu xuất hiện ở mép phải sân khấu,

y là một số ngẫu nhiên, từ 0, đến 60, để độ cao các cột ống có vị trí dọc khác nhau.

Thêm khối hiện ra,

thêm khối vòng lặp có điều kiện, lặp lại cho đến khi,

ghép phép so sánh nhỏ hơn, bên phải là âm 260

bên trái là vị trí x của cột ống: nghĩa là cột ống sẽ hiện ra từ mép phải cho đến khi ra khỏi mép trái sân khấu.
Giải thích: Khối lặp lại cho đến khi là vòng lặp có điều kiện, lặp liên tục lệnh trong đó nếu điều kiện còn đúng.

Bên trong vòng lặp, khối đổi x một lượng bằng âm 3: để mỗi lần cột ống dịch sang trái ba bước.

Thêm khối điều kiện nếu,

ghép phép so sánh bằng, bên phải là x bằng âm 100, là vị trí của chim

bên trái là vị trí x: cột ống vừa đi qua chim,

thì thêm khối đổi biến một lượng, chọn biến score: game được cộng thêm một điểm khi chim bay qua được ống

Thêm khối bắt đầu âm thanh point, trong nhóm Âm thanh: mỗi lần ghi điểm có một tiếng báo.
Giải thích: Khối bắt đầu âm thanh phát tiếng rồi chạy tiếp ngay, không chờ tiếng phát xong.
Giải thích: Khối điều kiện nếu: nếu điều kiện đúng thì chạy các khối bên trong, ở đây cột ống qua chim thì cộng một điểm.

Cuối cùng, ra khỏi màn hình thì xoá bản sao cột ống này. Ta vừa làm xong: bản sao hiện ở mép phải, chạy sang trái, qua chim thì cộng điểm, ra khỏi màn hình thì xoá.
Giải thích: Ta lưu ý Khối xoá bản sao này, để xoá bản sao khi không cần nữa, để đỡ tốn bộ nhớ.

Chạy thử: ta tạm đặt playing bằng 1, rồi bấm cờ xanh, các cột ống hiện ở mép phải, chạy sang trái rồi biến mất như mong muốn

Tiếp theo là mặt đất Ground.

Việc cần làm: mặt đất chạy sang trái liên tục, đi quá xa thì kéo về.
Sơ đồ của mặt đất: lặp mãi, dịch sang trái 3 bước; đi quá âm 35 thì kéo về 36 bước.

Kéo khối Khi bấm vào cờ xanh,

gắn khối vòng lặp mãi mãi, mục đích để mặt đất di chuyển liên tục

bên trong khối đổi x một lượng, âm 3, để mặt đất chạy sang trái.

Thêm khối điều kiện nếu,

ghép phép so sánh nhỏ hơn, bên phải là âm 35,

bên trái là vị trí x của mặt đất,

thì khối đổi x một lượng bằng 36 để kéo mặt đất về lại vị trí ban đầu, rồi chạy tiếp, nhìn như mặt đất chạy mãi không hết. Ta sẽ thấy mặt đất như di chuyển liên tục sang trái, để con chim đứng yên nhưng cảm giác đang bay sang phải
Giải thích: Như vậy ta thấy khối mặt đất cứ sang trái vài bước, rồi được đặt về lại bên phải, liên tục như vậy

Chạy thử mặt đất nhé: bấm cờ xanh, mặt đất chạy mãi sang trái, nhìn như con đường dài vô tận. Ta đã xong phần mặt đất.

Bây giờ ta sang phần Màn hình chờ Get Re đi

Việc cần làm: hiện màn hình chờ, trò chơi bắt đầu thì ẩn.
Sơ đồ của màn hình chờ: hiện ra, đợi đến khi trò chơi bắt đầu, rồi ẩn đi.

khối Khi bấm cờ xanh,

thì hiện ra.

Thêm khối: Đợi đến khi,

phép so sánh bằng, bên phải là 1,

bên trái là biến playing: trò chơi bắt đầu thì màn hình chờ biến mất.

Sau đó khối ẩn đi. Ta vừa làm: màn hình chờ hiện ra, đợi trò chơi bắt đầu, rồi ẩn đi.

Chạy thử: bấm cờ xanh, màn hình chờ hiện ra và đứng đợi, vì trò chơi chưa bắt đầu.

Bây giờ Đến Màn hình thua GameOver.

Việc cần làm: ẩn Game Over lúc bắt đầu.
Sơ đồ: bấm cờ xanh thì màn hình Game Over ẩn đi.

Khi bấm cờ xanh,

thì ẩn đi.

Chạy thử: bấm cờ xanh, màn hình Game Over biến mất.

Việc cần làm: nhận thông báo gameover thì hiện ra.
Sơ đồ: nhận thông báo gameover thì hiện ra và phát tiếng va chạm.

Kéo thêm khối Khi nhận được thông báo, tạo thông báo mới tên gameover,

thì hiện ra. Thông báo này sẽ do chú chim gửi đi khi thua.

Thêm khối phát âm thanh hit đến hết, trong nhóm Âm thanh: tiếng va chạm khi chim thua.
Giải thích: Khối khi nhận được thông báo: Game Over chỉ hiện khi chim thua và gửi thông báo gameover.

Chạy thử: bấm cờ xanh, màn hình Game Over bị ẩn đi, chỉ hiện khi nhận thông báo thua từ chú chim.

Bây giờ Đến chú chim, nhân vật chính.

Việc cần làm: đặt chim về vị trí xuất phát, các biến về 0.
Sơ đồ khởi tạo của chim: về vị trí xuất phát, nhìn sang phải, rồi đặt ba biến vy, score, playing về 0.

Khi bấm cờ xanh,

đặt chim ở vị trí xuất phát bằng khối đi tới điểm x y, x bằng âm 100, y bằng 0,

thêm khối đặt hướng bằng, 90: chim nhìn sang phải.

Thêm khối đặt biến, chọn vy, giá trị 0, là trọng lực rơi xuống

thêm một khối đặt biến nữa, chọn score, giá trị 0, là điểm số

thêm khối đặt biến playing, là đang chạy hay dừng, 0 là dừng chọn giá trị 0: để bắt đầu một ván mới. Ta vừa làm: đưa chim về vị trí xuất phát, nhìn sang phải, và đặt ba biến về 0.

Chạy thử: bấm cờ xanh, chim về đúng vị trí xuất phát, nhìn sang phải.

Việc cần làm: chờ bấm phím, rồi rơi theo trọng lực; chạm ống hoặc đất thì thua.
Sơ đồ chính của chim: đợi bấm phím, rồi đặt playing bằng 1 và vy bằng 8. Rồi lặp mãi: rơi theo trọng lực, nghiêng đầu theo tốc độ. Chạm ống hoặc đất thì báo gameover và dừng; bay quá cao thì giữ y bằng 170.

Script thứ hai: khi bấm cờ xanh,

khối đợi đến khi,

có phím được bấm: lúc đó trò chơi mới bắt đầu.

Thêm khối đặt biến, chọn playing, giá trị 1: trò chơi đang chơi.

Thêm khối đặt biến, chọn vy, trọng lực kéo chim rơi xuống hay bay lên giá trị 8: chim bật lên lúc đầu.

Thêm khối vòng lặp mãi mãi,

bên trong khối đổi biến một lượng, chọn vy, âm 0,8: đó là trọng lực kéo chim xuống.
Giải thích: Đây là trọng lực: mỗi vòng lặp, vy giảm đi 0,8 nên chim rơi càng lúc càng nhanh.

Thêm khối đổi y một lượng,

bằng vy: vy dương thì bay lên, vy âm thì rơi xuống.

Chim nghiêng đầu theo tốc độ: khối đặt hướng bằng,

một phép trừ, 90 trừ,

một phép nhân, 3 nhân,

vy: chim ngẩng đầu khi bay lên, cúi đầu khi rơi xuống.

Thêm khối điều kiện nếu: để kiểm tra va chạm,

với điều kiện là khối hoặc, ghép khối đang chạm vào ô bên trái, chọn Pipe: chim chạm cột ống, và một khối đang chạm vào ô bên phải, chọn Ground: hoặc chim chạm đất. Khối đang chạm đúng khi nhân vật này chạm vào nhân vật đã chọn.
Giải thích: Khối hoặc đúng khi một trong hai điều kiện đúng: chim chạm ống hoặc chạm đất.

Nếu thua thì khối phát thông báo và chờ, chọn gameover: màn hình Game Over sẽ hiện ra,
Giải thích: Khối phát thông báo và chờ: gửi thông báo rồi đợi các nhân vật nhận xử lý xong.

thêm khối dừng tất cả ở dưới: sau khi phát thông báo thì kết thúc trò chơi.

Giữ chim không bay quá cao: thêm khối điều kiện nếu,

phép so sánh lớn hơn, bên phải là 170,

bên trái là vị trí y của chim,

thì khối đặt y bằng, 170: để chim không vượt khỏi đỉnh màn hình. Ta vừa làm: đợi phím bấm, rồi lặp: rơi theo trọng lực, nghiêng đầu, chạm ống hoặc đất thì thua.

Chạy thử: bấm cờ xanh, chim đứng đợi phím, rồi bấm Space một lần: chim bật lên rồi rơi theo trọng lực, chạm đất thì hiện Game Over.

Việc cần làm: bấm phím thì chim bay lên.
Sơ đồ: bấm phím thì vy bằng 8 và phát tiếng vỗ cánh: chim bay lên.

Script cuối: khi bấm phím,

khối đặt biến, chọn vy, giá trị 8: chim vỗ cánh bay lên.

Thêm khối bắt đầu âm thanh wing: mỗi lần bấm phím có tiếng vỗ cánh. Ta vừa làm: bấm phím thì đặt vy bằng 8, chim bay lên.

Chạy thử: bấm cờ xanh, rồi bấm Space: chim bật lên, sau đó rơi xuống theo trọng lực. Nếu bấm liên tục space, chim sẽ bay lên trên mãi

Việc cần làm: đổi trang phục liên tục để chim đập cánh.
Sơ đồ: lặp mãi, đổi sang trang phục kế tiếp rồi chờ 0,1 giây: chim đập cánh.

Một script nữa cho cánh chim: khi bấm cờ xanh,

khối vòng lặp mãi mãi,

bên trong khối trang phục kế tiếp,

thêm khối chờ, gắn ngay dưới khối trang phục kế tiếp trong vòng lặp, 0,1 giây giữa các lần đổi, nên chim trông như đang đập cánh. Ta vừa làm: lặp mãi mãi, đổi sang trang phục kế tiếp, chờ 0,1 giây: chim đập cánh.

Chạy thử: bấm cờ xanh, chim đổi trang phục liên tục, nhìn như đang đập cánh.

Xong rồi! Chọn lại nhân vật Bird để chơi thử.

Chọn con chim, bấm cờ xanh, rồi bấm phím cho chim vỗ cánh: chim bay qua các cột ống, điểm tăng lên, chạm ống hay đất thì hiện Game Over.

Các khối mới trong bài
- Ta đã hoàn thành bài làm. Bài này ta học các khối:
- Khối đợi đến khi: dừng lại cho tới khi điều kiện đúng thì mới chạy tiếp.
- Khối liên tục: vòng lặp mãi mãi: lặp lại các khối lệnh bên trong.
- Khối tạo bản sao của: tạo một bản sao: mỗi bản sao là một cột ống mới.
- Khối khi tôi bắt đầu là một bản sao: chạy khi bản sao vừa được tạo ra.
- Khối xoá bản sao này: xoá bản sao khi không cần nữa, đỡ tốn bộ nhớ.
- Khối lặp lại cho đến khi: vòng lặp có điều kiện: lặp cho tới khi điều kiện đúng.
- Khối nếu … thì: khối điều kiện: điều kiện đúng thì chạy các khối bên trong.
- Khối bắt đầu âm thanh: phát một tiếng rồi chạy tiếp ngay, không chờ hết tiếng.
- Khối hoặc: đúng khi một trong hai điều kiện đúng.
- Khối phát thông báo và chờ: gửi thông báo rồi đợi các nhân vật nhận xử lý xong.
Kỹ thuật lập trình đã học
- Về kỹ thuật lập trình, bài này ta học: bản sao: một nhân vật gốc tạo ra nhiều bản sao cùng chạy.
- Trọng lực: tốc độ rơi tăng dần nên chim rơi nhanh dần.
- Va chạm: kiểm tra chim có chạm cột ống hoặc mặt đất không.
- Điều kiện, vòng lặp thông điệp, phối hợp với nhau để làm nên trò chơi.
Bài tập
Bài tập mở rộng, ta có thể thêm các cột ống có khoảng hở khác nhau, tăng hoặc giảm tốc độ ống để thay đổi độ khó