Đăng nhập
Latest topics
» Tôi sẽ đỗ đại học!by NgocPRO 6/11/2024, 8:37 am
» Kỷ niệm xưa của chúng ta
by nightWalker 9/2/2024, 6:49 pm
» Bị lệch khung cần người giúp đỡ
by webhuy28 7/10/2021, 10:34 pm
» [HỎI ĐÁP] Danh sách bạn bè không thể hiển thị
by anhdaodaica1 2/10/2021, 10:04 pm
» [HỎI ĐÁP] Thông tin tài khoản không thể lưu thay đổi
by anhdaodaica1 2/10/2021, 6:05 am
» Phim bố già full
by huy.pc52 24/8/2021, 12:20 am
» Xin code Box HTML cho Forumvi
by Larva 1/7/2021, 12:57 pm
» Hello Anh Em Chinh phục
by HoàngTửNaivip5p 28/5/2021, 5:03 am
» Trang chủ tin tức cập nhật HOT 2016
by kenbi05 1/1/2020, 11:02 pm
» Không Dang9 bài viết = hình ảnh được
by huy.pc52 30/11/2019, 10:52 am
» CHÚC ANH EM NĂM MỚI VUI VẺ TRÀNG ĐẦY HẠNH PHÚC
by sps.kủn 12/2/2019, 1:16 pm
» Skin CNTT-K3 2015 (Full Mod)[✔]
by kenbi05 6/7/2018, 12:30 am
» baivong, handsome,....
by sps.kủn 29/6/2018, 1:54 pm
» [SHARE] SKIN ĐHFM.V7 @PUNBB
by tonyhoaivu 2/5/2018, 2:37 pm
» Share Skin Xanh Dương Cùi Bắp
by tonyhoaivu 28/4/2018, 5:57 pm
» Xin Skin http://v1.hotrofm.net/
by tonyhoaivu 28/4/2018, 5:45 pm
» Xin Skin Rao Vặt
by tonyhoaivu 15/4/2018, 12:07 pm
» Làm Sao Để Xóa Khung Này
by tonyhoaivu 14/4/2018, 7:18 pm
» [Lập nhóm]Lập nhóm fm
by vietkanpy 31/3/2018, 11:53 am
» [Help] về server úp ảnh của phutu [✔]
by baivong 17/3/2018, 10:18 pm
» Đừng khóc cho “tôi – Chinh Phục!”…
by AnHung 27/2/2018, 5:33 pm
» [Share] Skin Diendandaihoc.com [ Punbb ] [✔]
by Lu Mờ 13/2/2018, 7:28 pm
» Mời mấy thím vào groups Forumotion Việt Nam.
by dang02315 13/2/2018, 12:40 am
» Có thể làm các kiểu giao diện được không?
by Lu Mờ 9/2/2018, 3:40 pm
» ltns chinhphuc.info
by Shinichi Kudo 27/1/2018, 2:27 am
Top posting users this week
No user |
Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
+5
K.-Kun
nightWalker
GaKon
arikbna
miamor
9 posters
Trang 1 trong tổng số 1 trang
Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
HTML5 không còn lạ gì đối với coders và cả fm-ers nữa nhỉ
Tuy nhiên thì để sử dụng thành thục HTML5 thì không phải ai cũng có thể.
và để tự học HTML5 cũng khá là khó.
HTML5 được sử dụng với nhiều mục đích, nhưng mục đích lớn nhất mình nghĩ là để lập trình game 2d~ (Hình như cũng có 3d rồi nhưng mà chưa hoàn chỉnh)
Mình cũng chả hiểu biết gì nhiều về lĩnh vực này, nhưng cũng mạo muội làm cái bài hướng dẫn này cho anh em XD
Mình định dịch, nhưng ngôn ngữ lập trình dịch qua tiếng việt mình thấy khá bựa =w= có lẽ là do mình bíp biết dịch thế nào =v=
Nên mình viết theo ý mình, có tham khảo tài liệu http://jdstraughan.com/2013/03/05/html5-snake-with-source-code-walkthrough/
(mình khuyên các bạn nên đọc chỉ 1 bài thôi, và nên là bài tiếng anh Đọc bài anh xog chuyển qua bài này mình sợ các bạn phọt máu mà chết x__X)
[*] Bài viết khá dài, bạn nào đủ kiên nhẫn thì hẵng đọc, còn ai không đọc thì chỉ cần kéo sang bên phải bấm nút like là xong
[*] Bài viết hướng đến đối tượng gà mờ, giai đoạn đầu học hỏi HTML5, không dành cho dân chuyên. x___X
[*] Nếu có sai sót mong được lượng thứ
[*] Mình không muốn nhận được những cmt kiểu: Dài thế bố ai mà đọc được, Dài thế này viết làm *abc* gì, có ai đọc đâu, Chả giúp ích gì,... bleh bleh bleh.. Không đọc, không giúp ích gì cho bạn thì phắn *abc* đi, lởn vởn cmt linh tinh ngứa hết cả mắt
Ok... bài hướng dẫn này được viết trên nền game Rắn săn mồi, game đơn giản nhất, sử dụng ít thuật toán nhất.
Demo: http://invision.chinhphuc.info/h194-page hoặc http://invision.chinhphuc.info/h84-page (đương nhiên thì mình chả viết cái nào trong 2 cái đấy cả )
Bài viết này phân tích theo demo 1 (trang /h194- )
HTML
Trang HTML cho game chỉ cần 1 thẻ canvas là đủ.
Quan trọng nhất là js viết xoay quanh thẻ canvas này.
Để cho dễ hiểu, ta sẽ chia js này thành 6 phần nhỏ để phân tích:
Trước hết, trong thẻ script, điều cốt yếu ta cần là cái này:
Nhiệm vụ của nó là để vẽ lên thẻ canvas có id the-game thông qua một đối tượng context được trả về từ phương thức canvas.getContext(id) - mà ở đây id là 2d
Và giờ thì chúng ta bước vào tìm hiểu 6 lớp nhỏ như phần đã giới thiệu
Game Object
Snake Object
Food Object
Helpers
Event Listener
Game của chúng ta sắp hoàn chỉnh rồi. Giờ chỉ còn Game Loop - phần quan trọng nhất của bất kì một game nào.
Game loop
Và cuối cùng! Game hoàn thành ! Thêm dòng này vào cuối cùng:
Ngoài ra các bạn hoàn toàn có thể tạo game con rắn kiểu ma trận giống như nokia 1200,.. bằng cách tạo thêm lớp Map để thêm vật cản. Tuy nhiên, mình chưa đủ trình viết ra mà cũng chưa thấy ai làm nó cả 8-} nên thôi. Nhưng có thể biết đâu sau này sẽ có ai đó trong này làm bài hướng dẫn game con rắn ma trận Tuy nhiên ngoài việc tạo lớp map mới ra thì sẽ cần phải để ý thêm đến tọa độ của con mồi trong hàm set() nữa.
Các bạn có thể tham khảo cách lớp Map và vật cản cũng như một đống kiểu viết mới nữa trong loạt serie hướng dẫn làm game mario ở đây:
Part 1: http://yinyangit.wordpress.com/2012/05/31/html5-canvas-viet-game-mario-part-1/
Part 2: http://yinyangit.wordpress.com/2012/06/02/html5-canvas-viet-game-mario-part-2/
Part 3: http://yinyangit.wordpress.com/2012/06/04/html5-canvas-viet-game-mario-part-3/
Part 4: http://yinyangit.wordpress.com/2012/06/06/html5-canvas-viet-game-mario-part-4/
Part 5 (end) : http://yinyangit.wordpress.com/2012/06/07/html5-canvas-viet-game-mario-part-5-end/
Hoặc tìm hiểu cách tạo game = HTML5 tại đây: http://yinyangit.wordpress.com/category/game-dev/html5-canvas/
Download ebook tại đây:
Tiếng Anh (recommend):
http://it-ebooks.info/tag/html5/
http://it-ebooks.info/book/415/ (căn bản)
http://it-ebooks.info/book/504/ (nâng caoo))
Tiếng Việt:
http://yinyangit.wordpress.com/2012/07/08/ebook-html5-canvas-lap-trinh-game-2d-free/
Tuy nhiên thì để sử dụng thành thục HTML5 thì không phải ai cũng có thể.
và để tự học HTML5 cũng khá là khó.
HTML5 được sử dụng với nhiều mục đích, nhưng mục đích lớn nhất mình nghĩ là để lập trình game 2d~ (Hình như cũng có 3d rồi nhưng mà chưa hoàn chỉnh)
Mình cũng chả hiểu biết gì nhiều về lĩnh vực này, nhưng cũng mạo muội làm cái bài hướng dẫn này cho anh em XD
Mình định dịch, nhưng ngôn ngữ lập trình dịch qua tiếng việt mình thấy khá bựa =w= có lẽ là do mình bíp biết dịch thế nào =v=
Nên mình viết theo ý mình, có tham khảo tài liệu http://jdstraughan.com/2013/03/05/html5-snake-with-source-code-walkthrough/
(mình khuyên các bạn nên đọc chỉ 1 bài thôi, và nên là bài tiếng anh Đọc bài anh xog chuyển qua bài này mình sợ các bạn phọt máu mà chết x__X)
[*] Bài viết khá dài, bạn nào đủ kiên nhẫn thì hẵng đọc, còn ai không đọc thì chỉ cần kéo sang bên phải bấm nút like là xong
[*] Bài viết hướng đến đối tượng gà mờ, giai đoạn đầu học hỏi HTML5, không dành cho dân chuyên. x___X
[*] Nếu có sai sót mong được lượng thứ
[*] Mình không muốn nhận được những cmt kiểu: Dài thế bố ai mà đọc được, Dài thế này viết làm *abc* gì, có ai đọc đâu, Chả giúp ích gì,... bleh bleh bleh.. Không đọc, không giúp ích gì cho bạn thì phắn *abc* đi, lởn vởn cmt linh tinh ngứa hết cả mắt
Ok... bài hướng dẫn này được viết trên nền game Rắn săn mồi, game đơn giản nhất, sử dụng ít thuật toán nhất.
Demo: http://invision.chinhphuc.info/h194-page hoặc http://invision.chinhphuc.info/h84-page (đương nhiên thì mình chả viết cái nào trong 2 cái đấy cả )
Bài viết này phân tích theo demo 1 (trang /h194- )
HTML
Trang HTML cho game chỉ cần 1 thẻ canvas là đủ.
- Code:
<canvas id="the-game" width="320" height="240">
- Code:
<style>article, aside, details, figcaption, figure, footer, header,
hgroup, menu, nav, section {
display: block;
}
body {
background-color: #CCC;
}
h1 {
text-align: center;
}
p {
text-align: center;
}
canvas {
display: block;
margin: 0 auto;
background-color: #666;
}</style>
Quan trọng nhất là js viết xoay quanh thẻ canvas này.
Để cho dễ hiểu, ta sẽ chia js này thành 6 phần nhỏ để phân tích:
- game (object)
- snake (object)
- food (object)
- some helpers/service methods
- an event listener
- the game loop
Trước hết, trong thẻ script, điều cốt yếu ta cần là cái này:
- Code:
var canvas = document.getElementById("the-game");
var context = canvas.getContext("2d");
Nhiệm vụ của nó là để vẽ lên thẻ canvas có id the-game thông qua một đối tượng context được trả về từ phương thức canvas.getContext(id) - mà ở đây id là 2d
Và giờ thì chúng ta bước vào tìm hiểu 6 lớp nhỏ như phần đã giới thiệu
Game Object
- Spoiler:
- Lớp này gồm phần điều khiển điểm số, tình trạng (game over), và vài thứ linh tinh khác bạn muốn thêm vào.
- Code:
game = {
score: 0,
fps: 8,
over: false,
message: null,
start: function() {
game.over = false;
game.message = null;
game.score = 0;
game.fps = 8;
snake.init();
food.set();
},
stop: function() {
game.over = true;
game.message = 'GAME OVER - PRESS SPACEBAR';
},
drawBox: function(x, y, size, color) {
context.fillStyle = color;
context.beginPath();
context.moveTo(x - (size / 2), y - (size / 2));
context.lineTo(x + (size / 2), y - (size / 2));
context.lineTo(x + (size / 2), y + (size / 2));
context.lineTo(x - (size / 2), y + (size / 2));
context.closePath();
context.fill();
},
drawScore: function() {
context.fillStyle = '#999';
context.font = (canvas.height) + 'px Impact, sans-serif';
context.textAlign = 'center';
context.fillText(game.score, canvas.width/2, canvas.height * .9);
},
drawMessage: function() {
if (game.message !== null) {
context.fillStyle = '#00F';
context.strokeStyle = '#FFF';
context.font = (canvas.height / 10) + 'px Impact';
context.textAlign = 'center';
context.fillText(game.message, canvas.width/2, canvas.height/2);
context.strokeText(game.message, canvas.width/2, canvas.height/2);
}
},
resetCanvas: function() {
context.clearRect(0, 0, canvas.width, canvas.height);
}
};
- game.score số điểm hiện tại của trò chơi, ban đầu là 0
- game.fps thời gian mỗi frame được duy trì (tính theo giây) (đại khái là như kiểu vận tốc í). Giá trị này tỉ lệ thuận với độ khó của levels.
- game.over
- game.message hiển thị tin nhắn đến người chơi khi chết - Vd "game over. click to restart.", "loser, bet u can play again. click to lose again.",.. bleh bleh..
- Hàm game.start() khá dễ hiểu. Nó đặt trạng thái trò chơi thông qua game.over = false, xóa game.message (dòng "Game over"), đặt lại fps, và thực hiện hàm init() trên snake và food (sẽ đề cập trong lớp sau)
- Hàm game.stop() thì chỉ đơn thuần là đưa trò chơi về dạng "over" (vật chủ die) và hiển thị dòng game.message
- Ba hàm tiếp theo là thuật vẽ trong trò chơi. Phương thức vẽ hộp (drawBox) có thể dử dụng để vẽ con mồi, và những đoạn nối của con rắn. Hàm drawBox() cần nhận 4 thông số: tọa độ x, tọa độ y, kích cỡ, và màu. Nó có thể di chuyển đến tọa độ x, tọa độ y, vẽ hộp có kích cỡ, màu sắc tương ứng với các thông số đã khai báo.
- Hàm drawScore() cách viết có chút khác biệt, nhưng đơn giản hơn so với việc vẽ hộp.
- Còn hàm drawMessage() thì chỉ thêm dòng kiểm tra nếu game.message có hiển thị trên màn hình thì thực hiện lệnh vẽ nó ra. Hết.
*Trong các hàm draw này các bạn cần biết nhiều về các câu lệnh context.[...] như là context.fillStyle, context.moveTo, context.lineTo,... - Hàm cuối cùng là hàm resetCanvas()
Snake Object
- Spoiler:
- Code:
snake = {
size: canvas.width / 40,
x: null,
y: null,
color: '#0F0',
direction: 'left',
sections: [],
init: function() {
snake.sections = [];
snake.direction = 'left';
snake.x = canvas.width / 2 + snake.size / 2;
snake.y = canvas.height /2 + snake.size / 2;
for (i = snake.x + (5 * snake.size); i >= snake.x; i-=snake.size) {
snake.sections.push(i + ',' + snake.y);
}
},
move: function() {
switch(snake.direction) {
case 'up':
snake.y-=snake.size;
break;
case 'down':
snake.y+=snake.size;
break;
case 'left':
snake.x-=snake.size;
break;
case 'right':
snake.x+=snake.size;
break;
}
snake.checkCollision();
snake.checkGrowth();
snake.sections.push(snake.x + ',' + snake.y);
},
draw: function() {
for (i = 0; i < snake.sections.length; i++) {
snake.drawSection(snake.sections[i].split(','));
}
},
drawSection: function(section) {
game.drawBox(parseInt(section[0]), parseInt(section[1]), snake.size, snake.color);
},
checkCollision: function() {
if (snake.isCollision(snake.x, snake.y) === true) {
game.stop();
}
},
isCollision: function(x, y) {
if (x < snake.size/2 ||
x > canvas.width ||
y < snake.size/2 ||
y > canvas.height ||
snake.sections.indexOf(x+','+y) >= 0) {
return true;
}
},
checkGrowth: function() {
if (snake.x == food.x && snake.y == food.y) {
game.score++;
if (game.score % 5 == 0 && game.fps < 60) {
game.fps++;
}
food.set();
} else {
snake.sections.shift();
}
}
};
- Đầu tiên là lớp này khởi tạo snake.size property, và ta đặt size cho con rắn là: canvas.width / 40 (canvas.width là chiều rộng của thẻ canvas đã khai báo trong html => snake.size tỉ lệ thuận với canvas.width và / 40 thì chắc chả phải nói..
VD: width ban đầu trong ví dụ này là 320 => snake.size sẽ là 320/40 = 8
Chú ý là giá trị size ở đây đại diện cho độ rộng mỗi cạnh luôn, vậy nên nó sẽ luôn có dạng hình vuông, và như đây thì sẽ là hình vuông 8x8. - Tiếp theo chúng ta khởi tạo giá trị tọa độ x và y cho con rắn, và thiết lập các hướng đi mặc định khi bắt đầu.
- Cuối cùng, và quan trọng nhất, là mảng snake.sections. Không như các nhân vật game khác chỉ di chuyển, con rắn trong game này có thân rất dài, và mỗi khi đổi hướng, đầu nó sẽ đổi trước, và theo đó thì từng mẩu thân nó mới đổi theo, và để quay một góc thì có thể sẽ mất nhiều hơn 1 bước di chuyển. Để thực hiện điều này, ta tạo con rắn bởi một dãy các tọa độ, và shift() hay push() các tọa độ ra và vào mảng để thay đổi vị trí của từng mẩu tương ứng. (trong phần init() ngay phía dưới)
- Hàm init() được sử dụng để tạo nên con rắn từ mảng và các phần tử trong đó. Hàm này chỉ bắt đầu chạy khi chắc chắn phần mảng trống và hướng đi mặc định đã được định sẵn. Sau đó nó mới thực hiện, và thực hiện theo các bước sau:
- Đầu tiên là đặt con rắn vào vị trí giữa khung trò chơi, và để thực hiện điều đó:
- Code:
snake.x = canvas.width / 2 + snake.size / 2;
snake.y = canvas.height /2 + snake.size / 2;
- https://i.servimg.com/u/f81/17/70/31/89/test1010.png
Tưởng tượng tọa độ như hình vẽ, con rắn màu xanh, chấm đỏ là điểm ở giữa => đáng ra chấm đỏ là vị trí giữa, nhưng vì con rắn có kích cỡ => phải bù trừ, mà gốc tọa độ trên cùng bên trái => phép tính thực hiện bù trừ là phép tính + => tọa độ để đặt con rắn là dấu chấm xanh.
- Và cuối cùng, hàm init() thực hiện các dòng lệnh để bước đầu tạo nên con rắn (tạo con rắn theo dạng mảng):
- Code:
for (i = snake.x + (5 * snake.size); i >= snake.x; i-=snake.size) {
snake.sections.push(i + ',' + snake.y);
}
- Tiếp đó là hàm snake.move()
- Hàm này sẽ kiểm tra snake.direction (sẽ đề cập sau) và sau đó thay đổi vị trí đầu con rắn cho phù hợp. Di chuyển lên, thì cần tọa độ y ( y ) giảm (tưởng tượng theo hình vẽ nhé), di chuyển xuống thì tăng, sang trái ( x ) giảm, phải ( x ) tăng.
- Sau khi thay đổi vị trí của phần đầu, snake.move() gọi hàm snake.checkCollision() để kiểm tra sự va chạm. nghĩa là nếu như mẩu đầu đó đụng phải thành box, hay với một mẩu nào đó của con rắn, thì game.stop().
Đi sâu vào phần checkCollision() và isCollision(). Hàm checkCollision() có gọi hàm isCollision() để thực hiện thao tác kiểm tra va chạm để dừng game.
Và hàm isCollision() là phần ta cần phân tích sâu chút.- Code:
isCollision: function(x, y) {
if (x < snake.size/2 ||
x > canvas.width ||
y < snake.size/2 ||
y > canvas.height ||
snake.sections.indexOf(x+','+y) >= 0) {
return true;
}
},
- 4 phép kiểm đầu tiên xác định xem mẩu đầu của con rắn đã ra ngoài canvas hay chưa (x > canvas.width || x < snake.size/2 || y < snake.size/2 || y > canvas.height).
- Phép kiểm cuối cùng kiểm tra xem con rắn có ăn phải chính mình hay không bằng cách kiểm tra xem tọa độ của các phần tử trong mảng có trùng nhau hay không (snake.sections.indexOf(x+','+y) >= 0).
- Tiếp, hàm .move() gọi đến hàm snake.checkGrowth(), hàm này sẽ cho phép con rắn lớn thêm nếu đụng phải con mồi, và kiểm tra việc con rắn đụng con mồi bằng cách kiểm tra vị trí của mẩu đầu với vị trí của con mồi, nếu trùng nhau thì ok, con rắn thêm một mẩu nữa.
- Code:
checkGrowth: function() {
if (snake.x == food.x && snake.y == food.y) {
game.score++;
if (game.score % 5 == 0 && game.fps < 60) {
game.fps++;
}
food.set();
} else {
snake.sections.shift();
}
}
- Lúc này game.score sẽ tăng thêm 1 đơn vị giá trị (++), đồng thời sẽ gọi hàm food.set() để tạo con mồi mới, và tiếp tục kiểm tra nếu số điểm chia hết cho 5 thì fps sẽ tăng thêm 1 đơn vị giá trị (++).
- Và nếu như không đụng phải con mồi, con rắn sẽ tự động shift() mất một phần tử (cuối cùng). Chỗ này các bạn để ý trong hàm move(), ta có đề cập đến snake.sections.push(snake.x + ',' + snake.y) - đó là để thêm vào mảng tạo nên con rắn 1 phần tử. Song tại hàm đó ta chưa cho shift() đi một phần tử để bảo đảm chiều dài của nó không đổi. Vì thế ta thực hiện hành động xóa 1 phần tử tại hàm này, khi không ăn mồi. Nếu ăn mồi, hành động này không xảy ra => tăng thêm 1 phần tử.
=> Rắn theo dạng mảng (bước đầu) hoàn tất.- Tiếp theo ta sẽ đề cập tới 2 hàm draw() và drawSection(), 2 hàm này không có gì đáng nói, chỉ là dùng để vẽ, chứ không sử dụng thuật toán gì hết. Hàm draw() gọi hàm drawSection() để các mẩu con rắn, và hàm drawSection() gọi hàm drawBox() để vẽ. Từ đó, các phần tử trong mảng sẽ được biểu diễn theo như cách vẽ đã trình bày trong hàm drawBox() => rắn hoàn tất.
Food Object
- Spoiler:
- Phần này thì thư thả được rồi Ngắn thôi, không có gì quá phức tạp như trên đâu.
- Code:
food = {
size: null,
x: null,
y: null,
color: '#0FF',
set: function() {
food.size = snake.size;
food.x = (Math.ceil(Math.random() * 10) * snake.size * 4) - snake.size / 2;
food.y = (Math.ceil(Math.random() * 10) * snake.size * 3) - snake.size / 2;
},
draw: function() {
game.drawBox(food.x, food.y, food.size, food.color);
}
};
- Khi hàm food.set() được gọi:
- Đầu tiên là kích cỡ con mồi sẽ được thiết lập để phù hợp với kích thước của con rắn.
- Tiếp, các tọa độ (x, y) của con mồi sẽ được sắp đặt ngẫu nhiên. Tuy nhiên, không phải tùy ý một cách vô tội vạ. Vì con rắn của chúng ta chỉ có thể di chuyển đến những tọa độ mà phù hợp với những phần tử có kích cỡ đã khai báo ban đầu, chứ không phải với mọi pixel trên canvas. (ví dụ đơn giản, con rắn tạo bởi dãy các phần tử hình vuông 8x8, ta chia canvas của ta thành 1 mạng lưới tọ bởi các hình vuông 8x8 => con rắn có thể di chuyển trên các cột ô vuông, chứ không thể di chuyển chèn lên dòng kẻ từ bên cột này sang cột nọ => miếng mồi cũng phải nằm trong các ô vuông.) Vì thế, ta cần để ý những dòng sau:
- Code:
food.x = (Math.ceil(Math.random() * 10) * snake.size * 4) - snake.size / 2;
food.y = (Math.ceil(Math.random() * 10) * snake.size * 3) - snake.size / 2;
- Để hiểu hơn các bạn theo dõi tiếp hình minh họa: https://i.servimg.com/u/f81/17/70/31/89/html-510.png và https://i.servimg.com/u/f81/17/70/31/89/test1010.png . Con rắn di chuyển trên đường kẻ đỏ trong hình 1. Vậy giả sử phép Math.ceil(Math.random() * 10) * snake.size * 4 trả về giá trị 12 (đơn vị độ dài ô vuông) và Math.ceil(Math.random() * 10) * snake.size * 3 trả về giá trị 9 (đơn vị độ dài ô vuông) => con mồi nằm trong ô vuông thứ 12 từ trái qua phải, và ô vuông thứ 9 từ trên xuống dưới. Tuy nhiên, như mình vừa nói, con rắn di chuyển trên những đường kẻ, nên tính phép bù trừ với snake.size / 2 để đặt vị trí con mồi vào giữa những dòng kẻ.
- Hàm cuối cùng trong lớp này là hàm draw(), hàm này không có gì đặc biệt, vẫn sử dụng game.drawBox() (lớp đầu tiên) để vẽ nên hình dạng con mồi.
Helpers
- Spoiler:
- Như bao game khác, trong game cần có sự hỗ trợ từ bàn phím, hay con trỏ chuột.
- Code:
inverseDirection = {
'up':'down',
'left':'right',
'right':'left',
'down':'up'
};
keys = {
up: [38, 75, 87],
down: [40, 74, 83],
left: [37, 65, 72],
right: [39, 68, 76],
start_game: [13, 32]
};
Object.prototype.getKey = function(value){
for(var key in this){
if(this[key] instanceof Array && this[key].indexOf(value) >= 0){
return key;
}
}
return null;
};
- Trong game này, ta không cho phép con rắn di chuyển theo hướng ngược lại với hướng nó đang đi (mà phải quẹo theo nhiều bước) vì thế ta tạo lớp inverseDirection để thực hiện điều này. Code phần này khá đơn giản, để cấm di chuyển ngược lại (ví dụ đang đi xuống mà muốn đi lên, không thể dùng nút lên, vậy ta quy định bấm nút lên là vẫn cứ đi xuống.
- Phần keys là quy định các phím mà game cho phép. Ví dụ ở trên là cho phép phím WASD, các nút lên xuống, và HJKL.
- Cuối cùng lớp này ta add thêm hàm getKey() cho Object prototype để kiểm tra key code có tồn tại trên keys object hay không, nếu có thì trả về giá trị sao cho khớp lệnh. (nói đơn giản là để lấy mã char của cái key mình vừa bấm)
Nói tóm lại, những gì cái này làm là nó xác định hướng đi cho con rắn dựa trên mã char của key mà ta đã sử dụng.
Event Listener
- Spoiler:
- Javascript dưới giúp việc đọc input từ bàn phím dễ dàng.
- Code:
addEventListener("keydown", function (e) {
lastKey = keys.getKey(e.keyCode);
if (['up', 'down', 'left', 'right'].indexOf(lastKey) >= 0
&& lastKey != inverseDirection[snake.direction]) {
snake.direction = lastKey;
} else if (['start_game'].indexOf(lastKey) >= 0 && game.over) {
game.start();
}
}, false);
- Tại đây, ta sử dụng hàm getKey() (như đã nói ở trên) để kiếm tra xem phím vừa nhập vào có giống với những phím có thể tạo di chuyển hay không, và ta kiểm tra thêm key vừa nhập đó có hướng có ngược lại với snake.direction hay không. Nếu cả 2 điều kiện thỏa mãn thì con rắn sẽ chuyển hướng.
- Và if nữa là nếu key vừa nhập vào là key mà cho phép restart game, và đồng thời khi đó game đã over => game.start() được gọi.
- Nếu không gặp điều kiện nào, con rắn tiếp tục di chuyển với hướng đang di chuyển.
Hết phần này. Khá đơn giản
Game của chúng ta sắp hoàn chỉnh rồi. Giờ chỉ còn Game Loop - phần quan trọng nhất của bất kì một game nào.
Game loop
- Spoiler:
- Cuộc hành trình của chúng ta sắp xong. Chỉ còn nốt ván này nữa thôi. Nếu đã đọc đến đây rồi, đọc tiếp đi
Sau khi tạo tất cả các lớp cơ bản cho game rắn săn mồi của ta, ta cần bước tối quan trọng là gộp chúng lại thành 1 thể và compile thành 1 game có thể chơi được.- Code:
var requestAnimationFrame = window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame;
function loop() {
if (game.over == false) {
game.resetCanvas();
game.drawScore();
snake.move();
food.draw();
snake.draw();
game.drawMessage();
}
setTimeout(function() {
requestAnimationFrame(loop);
}, 1000 / game.fps);
};
requestAnimationFrame(loop);
Khi requestAnimationFrame được thiết lập, nó cho phép ta gọi, và thực hiện refresh game mỗi 60 fps.
Xem xét kĩ loop(), ta thấy đầu tiên là hàm này thực hiện kiểm tra trạng thái trò chơi, xem có .over hay không. Nếu trò chơi đang hoạt động (không .over) thìmột loạt các hành động sẽ xảy đến: (đây là lúc sử dụng các hàm ta đã viết ở trên)- game.resetCanvas() - Làm trống canvas
- game.drawScore() - Viết điểm lên nền canvas
- snake.move() - Tính điểm đầu của con rắn,...
- food.draw() - Đặt vị trí con mồi
- snake.draw() - Vẽ con rắn bằng cách nối các phần tử trong mảng.
- game.drawMessage() - Hiển thị game.messagge, khi thua.
Bằng cách thực hiện những động tác này nhiều lần trong 1 giây => sẽ có cảm giác rắn đang chuyển động. Và để làm được điều này, ta cần phải tạo môt vòng lặp vô hạn.
Chính là chỗ này:- Code:
setTimeout(function() {
requestAnimationFrame(loop);
}, 1000 / game.fps);
Và cuối cùng! Game hoàn thành ! Thêm dòng này vào cuối cùng:
- Code:
requestAnimationFrame(loop);
Ngoài ra các bạn hoàn toàn có thể tạo game con rắn kiểu ma trận giống như nokia 1200,.. bằng cách tạo thêm lớp Map để thêm vật cản. Tuy nhiên, mình chưa đủ trình viết ra mà cũng chưa thấy ai làm nó cả 8-} nên thôi. Nhưng có thể biết đâu sau này sẽ có ai đó trong này làm bài hướng dẫn game con rắn ma trận Tuy nhiên ngoài việc tạo lớp map mới ra thì sẽ cần phải để ý thêm đến tọa độ của con mồi trong hàm set() nữa.
Các bạn có thể tham khảo cách lớp Map và vật cản cũng như một đống kiểu viết mới nữa trong loạt serie hướng dẫn làm game mario ở đây:
Part 1: http://yinyangit.wordpress.com/2012/05/31/html5-canvas-viet-game-mario-part-1/
Part 2: http://yinyangit.wordpress.com/2012/06/02/html5-canvas-viet-game-mario-part-2/
Part 3: http://yinyangit.wordpress.com/2012/06/04/html5-canvas-viet-game-mario-part-3/
Part 4: http://yinyangit.wordpress.com/2012/06/06/html5-canvas-viet-game-mario-part-4/
Part 5 (end) : http://yinyangit.wordpress.com/2012/06/07/html5-canvas-viet-game-mario-part-5-end/
Hoặc tìm hiểu cách tạo game = HTML5 tại đây: http://yinyangit.wordpress.com/category/game-dev/html5-canvas/
Download ebook tại đây:
Tiếng Anh (recommend):
http://it-ebooks.info/tag/html5/
http://it-ebooks.info/book/415/ (căn bản)
http://it-ebooks.info/book/504/ (nâng caoo))
Tiếng Việt:
http://yinyangit.wordpress.com/2012/07/08/ebook-html5-canvas-lap-trinh-game-2d-free/
- Spoiler:
- Spoiler:
- Spoiler:
- Spoiler:
- Spoiler:
- Spoiler:
- Spoiler:
- thêm mấy icon bựa rắm v~
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
là lập trình game = html5, chơi online, nhưng khi chơi game chưa có sao lưu dữ liệu. Tuy nhiên, bạn hoàn toàn có thể làm game theo kiểu 1 mình mình chơi với máy rồi so điểm với nhau, chứ nhiều người chơi trên 1 server nối vào nhau thì mình k chắc )arikbna đã viết:game online hả bác
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
hay wa, tks thớt 2 phát lun
bữa nào rãnh ngồi vọc, lúc trc cũng định học mấy cái này nhưng toàn tiếng anh nên đâm ra chán ràu bỏ, hi vọng pác viết bài đều đều
bữa nào rãnh ngồi vọc, lúc trc cũng định học mấy cái này nhưng toàn tiếng anh nên đâm ra chán ràu bỏ, hi vọng pác viết bài đều đều
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
kingLeonidas đã viết:cắn răng
Ây da! Vừa nhìn Commet cắn trúng lưỡi rồi
- P/s: Đừng có mở nhé!:
- Đã bảo đừng mở rồi mà
Click làm gì Thôi lỡ rồi like đê
K.-Kun- CPModerator
-
Ngày đăng ký : 22/11/2012
Số bài : 1511
CPP : 639
Châm ngôn sống : Không bao giời đi ngược lại với lời nói của mình! Đó chính là nhẫn đạo của tôi
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
Chà chà, ít khi wan tâm đến cái HTML5 (tại mức độ rộng lớn của nó ) Nhưng đọc xong bài này thấy hấp dẫn quá
1 like
1 like
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
Phần CSS, ngoài canvas thì các tag khác không nằm trong bài sao đưa vào làm gì?
Trong bài nhiều đoạn dịch, hướng dẫn, không phân biệt rõ biến(variables), hàm(function), phương thức(method) mà cái quan trọng nhất là method thì lại không đả động đến.
Trong bài này chỉ thuần giải thích cách tác giả viết game rắn săn mồi, gà mờ thì chẳng thể xem nổi "bài căn bản" này.
Trong bài nhiều đoạn dịch, hướng dẫn, không phân biệt rõ biến(variables), hàm(function), phương thức(method) mà cái quan trọng nhất là method thì lại không đả động đến.
Trong bài này chỉ thuần giải thích cách tác giả viết game rắn săn mồi, gà mờ thì chẳng thể xem nổi "bài căn bản" này.
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
Nếu làm game = Html5 thì có cần cài thêm gì không vậy bác. Nếu mà không thì .... Tớ nghĩ làm game = Html5 sẽ được ưa thích hơn so với flash nhỉ.
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
Cần cài... trình duyệt... có hỗ trợ HTML5
Re: Tìm hiểu căn bản lập trình game 2D với HTML5 qua game Rắn ăn mồi
Hồi trước có làm 1 game bắn bóng nhưng chán quá nên bỏ...
Similar topics
» [Game] Game online lớn như Gunny mà ăn cắp nhạc nền của game khác
» Giúp đỡ sửa HTML5 History API
» Bức tranh vẽ bằng HTML5 - Code
» [Horror Game - Hội Bựa Game] Among The Sleep | BETA | Co-op
» Game 3D Huyết Chiến ra mắt game thủ Việt
» Giúp đỡ sửa HTML5 History API
» Bức tranh vẽ bằng HTML5 - Code
» [Horror Game - Hội Bựa Game] Among The Sleep | BETA | Co-op
» Game 3D Huyết Chiến ra mắt game thủ Việt
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết