Chuyên gia công nghệ sáng tạo với nhiều kinh nghiệm trong thế giới thực. Cung cấp các giải pháp kỹ thuật số thông minh trực tuyến cho cả doanh nghiệp nhỏ và cấp doanh nghiệp
"Tôi có niềm đam mê với bất kỳ thứ gì liên quan đến công nghệ kỹ thuật số, thích lập trình và thử thách phát triển trải nghiệm kỹ thuật số thành công. Là một nhà phát triển có kinh nghiệm, tôi đã tạo các ứng dụng máy tính đầu tiên của mình vào năm 1990 và trang web đầu tiên của tôi vào năm 1998. Tôi thích chia sẻ kiến thức của mình với người khác và muốn giúp bạn chia sẻ những cơ hội tuyệt vời mà Internet mang lại. "
“Học, hiểu với niềm đam mê giáo dục mãnh liệt. Internet đã mang đến cho chúng ta những cơ hội mới để mở rộng và chia sẻ kiến thức. "
Bạn muốn tìm hiểu thêm về việc trở thành nhà phát triển web, bạn có muốn trải nghiệm sự tự do mà công nghệ mang lại cho chúng ta không? . Công nghệ kết nối tất cả chúng ta theo nhiều cách. Nó mở ra cánh cửa cho những người nắm lấy nó và học cách biến những kết nối đó thành hiện thực
"Các khóa học của tôi được thiết kế để giúp bạn đạt được mục tiêu của mình, học hỏi và cập nhật các kỹ năng"
Tiểu sử. Nhà phát triển ứng dụng web có kinh nghiệm, đã làm việc trên nhiều ứng dụng cấp doanh nghiệp, hàng trăm trang web, giải pháp kinh doanh và nhiều ứng dụng web độc đáo và sáng tạo. Các lĩnh vực chuyên môn về phát triển ứng dụng web bao gồm HTML, CSS, JavaScript, JQuery, Bootstrap, PHP và MySQL. Bất cứ điều gì liên quan đến tạo web và trải nghiệm kỹ thuật số. Đam mê mọi thứ liên quan đến phát triển ứng dụng web, lập trình đến tiếp thị trực tuyến, tập trung mạnh vào mạng xã hội và SEO.
"Hiểu công nghệ cung cấp phương tiện để kết nối tốt hơn với người dùng. Nó cũng mở ra rất nhiều cánh cửa. Kiến thức là chìa khóa thành công và tôi muốn giúp bạn trải nghiệm những gì công nghệ mang lại. Tôi đam mê công nghệ web và mong được chia sẻ kiến thức và kinh nghiệm của mình với bạn. "
Bạn sẽ khám phá cách tạo và hiển thị đồ họa trò chơi, thêm tính tương tác, âm thanh và hoạt ảnh. Bạn sẽ học cách xây dựng công cụ trò chơi tùy chỉnh của riêng mình với các thành phần có thể tái sử dụng để bạn có thể nhanh chóng phát triển trò chơi với tác động tối đa và mã tối thiểu. Bạn cũng sẽ tìm hiểu những bí mật của toán học vectơ và các kỹ thuật phát hiện va chạm nâng cao, tất cả đều được trình bày một cách thân thiện và phi kỹ thuật. Bạn sẽ tìm thấy các ví dụ hoạt động chi tiết, với hàng trăm hình minh họa và hàng nghìn dòng mã nguồn mà bạn có thể tự do điều chỉnh cho các dự án của riêng mình. Tất cả các kỹ thuật toán học và lập trình đều được giải thích tỉ mỉ và các ví dụ đều có kết thúc mở để khuyến khích bạn nghĩ ra những cách độc đáo để sử dụng các kỹ thuật này trong trò chơi của riêng bạn. Bạn có thể sử dụng những gì học được trong cuốn sách này để tạo trò chơi cho máy tính để bàn, điện thoại di động, máy tính bảng hoặc Web
Thiết kế trò chơi nâng cao với HTML5 và JavaScript là bước tiếp theo tuyệt vời dành cho các lập trình viên có kinh nghiệm hoặc những người mới bắt đầu đầy tham vọng đã có một số kinh nghiệm về JavaScript và muốn bước đầu tiên vào thế giới phát triển trò chơi điện tử. Đây cũng là cuốn sách tiếp theo tuyệt vời dành cho những độc giả của Foundation Game Design với HTML5 và JavaScript [của cùng tác giả], những người muốn thêm chiều sâu và độ chính xác cho các kỹ năng của họ
Các ví dụ về trò chơi trong cuốn sách này sử dụng JavaScript thuần túy, vì vậy bạn có thể viết mã gần với kim loại nhất có thể mà không phải phụ thuộc vào bất kỳ khuôn khổ giới hạn hoặc công cụ trò chơi nào. Không thư viện, không phụ thuộc, không plugin của bên thứ ba. chỉ có bạn, máy tính của bạn và mã. Nếu bạn đang tìm kiếm một cuốn sách để nâng cao kỹ năng thiết kế trò chơi của bạn và hơn thế nữa, thì đây chính là cuốn sách đó
Đồng sáng lập Starfish Web Consulting — một studio thiết kế và phát triển Web có trụ sở tại Belfast, Bắc Ireland. Tìm hiểu thêm về Eoin ↬
Bản tin email
Email [đập vỡ] của bạn
Mẹo hàng tuần về giao diện người dùng & UX.
Được hơn 200.000 người tin cậy.
- SmashingConf San Francisco. Tất cả về Frontend. Ngày 23–26 tháng 5 năm 2023
- Giao diện người dùng SmashingConf 2023
- Xem trực tiếp vào tháng 12. thứ 8
- Bắt đầu miễn phí
- Các mẫu thiết kế giao diện Đào tạo UX
- Nâng cao Tiếp theo. lớp học js
Điều tuyệt vời về những tiêu đề này là chúng hoạt động tốt như nhau trên cả thiết bị di động và máy tính để bàn sử dụng cùng một mã. HTML5 cuối cùng có thể hoàn thành chén thánh “viết một lần, chạy mọi nơi” không?
Bắt đầu
Trước khi bạn bắt đầu phác thảo Temple Run hoặc Angry Birds tiếp theo, bạn nên lưu ý một số điều có thể làm giảm hứng thú của bạn
Thêm sau khi nhảy. Tiếp tục đọc bên dưới ↓
Nâng cao kỹ năng UX của bạn với Khóa học video về mẫu thiết kế giao diện thông minh, thư viện video 8h của Vitaly Friedman. Với hàng trăm ví dụ thực tế, hướng dẫn thiết kế và danh sách kiểm tra UX. Kiểm tra bản xem trước miễn phí [video miễn phí, 15 phút]
Chuyển đến khóa học video UX ↬- Màn biểu diễn. Các trình duyệt di động thường không được biết đến với các công cụ JavaScript rực rỡ của chúng. Tuy nhiên, với iOS 6 và Chrome beta dành cho Android, mọi thứ đang được cải thiện nhanh chóng
- Nghị quyết. Một lượng lớn thiết bị Android thực sự có nhiều độ phân giải. Chưa kể đến việc tăng độ phân giải và mật độ điểm ảnh của iPhone 4 và iPad 3
- âm thanh. Hy vọng bạn tận hưởng âm thanh của sự im lặng. Ít nhất là hỗ trợ âm thanh trong trình duyệt di động là kém. Lag là một vấn đề lớn, vì thực tế là hầu hết các thiết bị chỉ cung cấp một kênh duy nhất. iOS thậm chí sẽ không tải âm thanh cho đến khi người dùng bắt đầu hành động. Lời khuyên của tôi là hãy giữ chặt và đợi các nhà cung cấp trình duyệt giải quyết vấn đề này
Giờ đây, với tư cách là nhà phát triển Web, bạn đã quen với việc xử lý các lỗi của một số trình duyệt nhất định và giảm cấp một cách duyên dáng cũng như xử lý các nền tảng bị phân mảnh. Vì vậy, một vài thách thức kỹ thuật sẽ không làm bạn thất vọng, phải không? . Bối cảnh trình duyệt di động đang thay đổi nhanh đến mức những lo ngại này sẽ sớm trở thành ký ức xa vời
Trong phần hướng dẫn này, chúng tôi sẽ tạo một trò chơi tương đối đơn giản, đưa bạn qua những điều cơ bản và giúp bạn tránh xa những cạm bẫy. Kết quả sẽ như thế này
- Chơi bản trình diễn
- Tải xuống bản trình diễn [ZIP]
Đây là một trò chơi khá đơn giản, trong đó người dùng làm nổ các bong bóng nổi trước khi chạm đến đỉnh màn hình. Theo trí tưởng tượng, tôi đã đặt tiêu đề cho nỗ lực nhỏ của chúng tôi là Pop
Chúng tôi sẽ phát triển điều này trong một số giai đoạn riêng biệt
- Phục vụ cho vô số cổng xem và tối ưu hóa cho thiết bị di động;
- Xem sơ qua cách sử dụng canvas API để vẽ lên màn hình;
- Nắm bắt các sự kiện chạm;
- Tạo một vòng lặp trò chơi cơ bản;
- Giới thiệu các nhân vật hoặc "thực thể" trò chơi;
- Thêm phát hiện va chạm và một số phép toán đơn giản để thêm gia vị;
- Thêm một chút đánh bóng và một số hiệu ứng hạt cơ bản
1. Sắp đặt sân khấu
đủ của câu chuyện nền. Khởi động trình soạn thảo văn bản yêu thích của bạn, rót một cốc cà phê đậm đặc và bắt tay vào làm
Như đã đề cập, có rất nhiều kích thước độ phân giải và mật độ pixel trên các thiết bị. Điều này có nghĩa là chúng tôi sẽ phải mở rộng khung vẽ của mình để phù hợp với chế độ xem. Điều này có thể phải trả giá bằng việc giảm chất lượng, nhưng một mẹo thông minh là làm cho canvas nhỏ và sau đó mở rộng quy mô, giúp tăng hiệu suất
Hãy bắt đầu với một shim HTML cơ bản
body { margin: 0; padding: 0; background: #000;}
canvas { display: block; margin: 0 auto; background: #fff; }
// all the code goes here
Thẻ khung nhìn
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
5 yêu cầu các trình duyệt di động tắt tỷ lệ người dùng và hiển thị ở kích thước đầy đủ thay vì thu nhỏ trang xuống. Các thẻ meta có tiền tố // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
6 tiếp theo cho phép trò chơi được đánh dấu. Trên iPhone, các ứng dụng được đánh dấu trang không hiển thị thanh công cụ ở cuối trang, do đó giải phóng bất động sản có giá trịHãy nhìn vào những điều sau đây
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
Đầu tiên, chúng tôi tạo không gian tên
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
7 cho trò chơi của chúng tôi. Là nhà phát triển giỏi, chúng tôi không muốn làm ô nhiễm không gian tên toàn cầu. Để giữ thông lệ tốt, chúng tôi sẽ khai báo tất cả các biến khi bắt đầu chương trình. Hầu hết trong số họ là rõ ràng. // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
8 đề cập đến phần tử // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
8 trong HTML và // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
0 cho phép chúng tôi truy cập phần tử đó thông qua API canvas JavaScriptTrong
// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
1, chúng tôi lấy một tham chiếu đến phần tử canvas của mình, lấy ngữ cảnh của nó và điều chỉnh kích thước của phần tử canvas thành 480 × 320. Hàm // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
2, được kích hoạt khi thay đổi kích thước và tải sự kiện, điều chỉnh thuộc tính // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
3 của canvas cho chiều rộng và chiều cao tương ứng trong khi vẫn duy trì tỷ lệ. Thực tế, khung vẽ vẫn có cùng kích thước nhưng đã được thu nhỏ bằng CSS. Hãy thử thay đổi kích thước trình duyệt của bạn và bạn sẽ thấy tỷ lệ canvas phù hợpNếu bạn đã thử điều đó trên điện thoại của mình, bạn sẽ nhận thấy rằng thanh địa chỉ vẫn hiển thị. ừ. Chúng ta có thể khắc phục điều này bằng cách thêm một vài pixel phụ vào tài liệu rồi cuộn xuống để ẩn thanh địa chỉ, như vậy
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
1Đoạn mã trên phát hiện ra tác nhân người dùng, gắn cờ cho Android và iOS nếu có. Thêm nó vào cuối
// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
1, trước cuộc gọi đến // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
5Sau đó, trong hàm
// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
2, nếu // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
7 hoặc // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
8 là // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
9, chúng tôi thêm 50 pixel khác vào chiều cao của tài liệu — i. e. đủ không gian thừa để có thể cuộn xuống qua thanh địa chỉ// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
Lưu ý rằng chúng tôi chỉ làm điều này cho các thiết bị Android và iOS; . Ngoài ra, chúng tôi cần trì hoãn việc kích hoạt
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
90 để đảm bảo rằng nó không bị bỏ qua trên Safari di động2. một bức tranh trống
Bây giờ chúng ta đã thu nhỏ khung vẽ của mình vừa khít với khung nhìn, hãy thêm khả năng vẽ một số hình dạng
Ghi chú. Trong hướng dẫn này, chúng ta sẽ gắn bó với các hình dạng hình học cơ bản. iOS 5 và Chrome beta dành cho Android có thể xử lý nhiều họa tiết hình ảnh ở tốc độ khung hình cao. Hãy thử điều đó trên Android 3. 2 trở xuống và tốc độ khung hình sẽ giảm theo cấp số nhân. May mắn thay, không có nhiều chi phí khi vẽ vòng tròn, vì vậy chúng tôi có thể có nhiều bong bóng trong trò chơi của mình mà không cản trở hiệu suất trên các thiết bị cũ hơn
Dưới đây, chúng tôi đã thêm một đối tượng cơ bản
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
91 cho phép chúng tôi xóa màn hình, vẽ hình chữ nhật và hình tròn và thêm một số văn bản. Chưa có gì đáng kinh ngạc. Mozilla Developers Network luôn có các tài nguyên tuyệt vời, có đầy đủ các ví dụ để vẽ lên khung vẽ// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
Đối tượng
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
91 của chúng ta có các phương thức để xóa màn hình và vẽ hình chữ nhật, hình tròn và văn bản. Lợi ích của việc trừu tượng hóa các hoạt động này là chúng tôi không phải nhớ các lệnh gọi API canvas chính xác và giờ đây chúng tôi có thể vẽ một vòng tròn bằng một dòng mã, thay vì năm dòng mã.Hãy đưa nó vào thử nghiệm
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
9Bao gồm mã ở trên vào cuối hàm
// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
1 và bạn sẽ thấy một vài hình dạng được vẽ trên canvas3. cảm ứng ma thuật
Giống như chúng ta có sự kiện
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
94, các trình duyệt di động cung cấp các phương pháp để nắm bắt các sự kiện chạmCác phần thú vị của mã bên dưới là các sự kiện
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
95, // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
96 và // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
97. Với sự kiện tiêu chuẩn // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
94, chúng ta có thể lấy tọa độ từ // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
99 và // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
10. Các sự kiện chạm hơi khác một chút. Chúng chứa một mảng // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
11, mỗi phần tử chứa tọa độ cảm ứng và dữ liệu khác. Chúng tôi chỉ muốn lần chạm đầu tiên và chúng tôi truy cập nó như vậy. // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
12Ghi chú. Android chỉ cung cấp quyền truy cập JavaScript cho các tác vụ đa chạm kể từ phiên bản 4
Chúng tôi cũng gọi
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
13 khi mỗi sự kiện được kích hoạt để tắt tính năng cuộn, thu phóng và bất kỳ hành động nào khác có thể làm gián đoạn dòng chảy của trò chơiThêm đoạn mã sau vào hàm
// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
1// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
1Bạn có thể nhận thấy rằng mã ở trên chuyển dữ liệu sự kiện tới một đối tượng
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
15 mà chúng tôi chưa xác định. Hãy làm điều đó ngay bây giờ// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
8Bây giờ, hãy thử nó. Hmm, các vòng tròn không xuất hiện. Một cú gãi đầu nhanh chóng và một khoảnh khắc bóng đèn. Bởi vì chúng tôi đã chia tỷ lệ canvas, nên chúng tôi cần tính đến điều này khi ánh xạ cảm ứng tới vị trí của màn hình
Đầu tiên, chúng ta cần trừ phần bù từ tọa độ
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
9Sau đó, chúng ta cần tính đến yếu tố mà canvas đã được chia tỷ lệ để chúng ta có thể vẽ biểu đồ cho canvas thực tế [vẫn là 320 × 480]
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
0Nếu đầu bạn bắt đầu đau, một ví dụ thực tế sẽ giúp xoa dịu đôi chút. Hãy tưởng tượng người chơi chạm vào canvas 500 × 750 ở trên tại
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
16. Chúng tôi cần dịch nó thành 480 × 320 vì theo như JavaScript có liên quan, đó là các kích thước của khung vẽ. Vì vậy, tọa độ thực tế của // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
17 là 400 chia cho tỷ lệ; . 56 = 320. 5Thay vì tính toán điều này trên mỗi sự kiện chạm, chúng tôi có thể tính toán chúng sau khi thay đổi kích thước. Thêm đoạn mã sau vào đầu chương trình, cùng với các khai báo biến khác
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
0Trong chức năng thay đổi kích thước của chúng tôi, sau khi điều chỉnh chiều rộng và chiều cao của canvas, chúng tôi ghi lại tỷ lệ và độ lệch hiện tại
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
1Bây giờ, chúng ta có thể sử dụng chúng trong phương thức
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
18 của lớp // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
19 của chúng ta// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
24. Trong vòng
Một vòng lặp trò chơi điển hình diễn ra như thế này
- Thăm dò ý kiến người dùng đầu vào,
- Cập nhật ký tự và xử lý va chạm,
- Kết xuất các ký tự trên màn hình,
- Nói lại
Tất nhiên, chúng ta có thể sử dụng
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
80, nhưng có một món đồ chơi mới sáng bóng trong thị trấn tên là // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
81. Nó hứa hẹn hình ảnh động mượt mà hơn và tiết kiệm pin hơn. Tin xấu là nó không được hỗ trợ nhất quán trên các trình duyệt. Nhưng Paul Ailen đã đến giải cứu với một miếng chêm tiện dụngHãy tiếp tục và thêm shim vào đầu cơ sở mã hiện tại của chúng tôi
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
3Và hãy tạo một vòng lặp trò chơi thô sơ
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
4Chúng tôi gọi vòng lặp ở cuối
// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
1. Hàm // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
83 lần lượt gọi các phương thức // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
84 và // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
85 của chúng ta. // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
86 đảm bảo rằng vòng lặp được gọi lại, tốt nhất là ở 60 khung hình mỗi giây. Lưu ý rằng chúng tôi không phải lo lắng về việc kiểm tra đầu vào trong vòng lặp của mình vì chúng tôi đã lắng nghe các sự kiện chạm và nhấp, có thể truy cập thông qua lớp // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
19 của chúng tôiVấn đề bây giờ là các thao tác chạm của chúng ta từ bước cuối cùng ngay lập tức bị xóa khỏi màn hình. Chúng ta cần một cách tiếp cận tốt hơn để ghi nhớ những gì được vẽ trên màn hình và vị trí
5. Spritely sẽ làm điều đó
Đầu tiên, chúng tôi thêm một mảng thực thể để theo dõi tất cả các thực thể. Mảng này sẽ giữ một tham chiếu đến tất cả các lần chạm, bong bóng, hạt và bất kỳ thứ động nào khác mà chúng tôi muốn thêm vào trò chơi
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
5Hãy tạo một lớp
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
88 vẽ một vòng tròn tại điểm tiếp xúc, làm mờ nó đi và sau đó loại bỏ nó// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
6Lớp
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
88 thiết lập một số thuộc tính khi bắt đầu. Các tọa độ x và y được truyền dưới dạng đối số và chúng tôi đặt bán kính // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
90 thành 5 pixel. Chúng tôi cũng đặt độ mờ ban đầu thành 1 và tốc độ cảm ứng mờ dần thành 0. 05. Ngoài ra còn có một cờ // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
91 cho biết vòng lặp trò chơi chính có xóa phần này khỏi mảng thực thể hay khôngĐiều quan trọng, lớp có hai phương thức chính.
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
92 và // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
93. Chúng tôi sẽ gọi chúng từ phần tương ứng của vòng lặp trò chơi của chúng tôiSau đó, chúng tôi có thể sinh ra một phiên bản mới của
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
88 trong vòng lặp trò chơi, sau đó di chuyển chúng qua phương thức cập nhật// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
7Về cơ bản, nếu
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
95 là // abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
9, thì chúng tôi thêm một phiên bản mới của // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
97 vào mảng thực thể của chúng tôi. Sau đó, chúng tôi duyệt qua mảng thực thể, gọi phương thức // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
92 cho từng thực thể. Cuối cùng, nếu thực thể được gắn cờ để loại bỏ, chúng tôi sẽ xóa nó khỏi mảngTiếp theo, chúng tôi hiển thị chúng trong hàm
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
85// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
8Tương tự như chức năng cập nhật của chúng tôi, chúng tôi duyệt qua các thực thể và gọi phương thức
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
93 của chúng để vẽ chúng lên màn hìnhCàng xa càng tốt. Bây giờ chúng ta sẽ thêm một lớp
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
01 sẽ tạo bong bóng nổi lên để người dùng bật// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
9Lớp
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
02 rất giống với lớp // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
88, điểm khác biệt chính là nó không mờ dần mà di chuyển lên trên. Chuyển động đạt được bằng cách cập nhật vị trí // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
04, // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
05, trong chức năng cập nhật. Tại đây, chúng tôi cũng kiểm tra xem bong bóng có tắt màn hình hay không; Ghi chú. Chúng ta có thể đã tạo một lớp cơ sở
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
06 mà cả // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
88 và // this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
01 đều kế thừa từ. Tuy nhiên, tôi không muốn mở một hộp sâu khác về kế thừa nguyên mẫu JavaScript so với cổ điển vào thời điểm này// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
10Ở trên, chúng tôi đã thêm một bộ đếm thời gian ngẫu nhiên vào vòng lặp trò chơi của chúng tôi sẽ tạo ra một phiên bản của
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
01 ở một vị trí ngẫu nhiên. Khi bắt đầu trò chơi, chúng tôi đặt // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
00 với giá trị là 100. Số tiền này bị trừ đi trên mỗi lần đánh dấu trò chơi và khi nó đạt đến 0, chúng tôi sẽ tạo ra một bong bóng và đặt lại bộ đếm // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
006. Đặt nó lại với nhau
Trước hết, chưa có bất kỳ khái niệm nào về phát hiện va chạm. Chúng ta có thể thêm nó với một chức năng đơn giản. Toán đằng sau điều này là hình học cơ bản, mà bạn có thể tìm hiểu tại Wolfram MathWorld
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
11Bong bóng khá nhàm chán; . Làm cho bong bóng di chuyển với tốc độ ngẫu nhiên là một nhiệm vụ đơn giản
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
12Và hãy làm cho chúng dao động từ bên này sang bên kia để chúng khó bị đánh hơn
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
13Một lần nữa, chúng tôi đang sử dụng một số hình học cơ bản để đạt được hiệu ứng này; . Mặc dù bạn không cần phải là một chuyên gia toán học để tạo trò chơi, nhưng sự hiểu biết cơ bản sẽ giúp ích rất nhiều. Bài viết “Tìm hiểu nhanh về toán học hoạt ảnh với JavaScript” sẽ giúp bạn bắt đầu
Hãy cũng hiển thị một số thống kê trên màn hình. Để làm điều này, chúng tôi sẽ cần theo dõi các hành động khác nhau trong suốt trò chơi
Đặt đoạn mã sau cùng với tất cả các khai báo biến khác vào đầu chương trình
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
14Bây giờ, trong lớp
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
01, chúng ta có thể theo dõi // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
03 khi bong bóng biến mất trên màn hình// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
15Trong vòng cập nhật chính, chúng tôi tăng
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
04 tương ứng// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
16Để thống kê chính xác, chúng tôi cần ghi lại tất cả các lần nhấn mà người dùng thực hiện
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
17Độ chính xác có được bằng cách chia số lần truy cập cho số lần nhấn, nhân với 100, cho chúng tôi một tỷ lệ phần trăm đẹp. Lưu ý rằng
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
05 là một cách nhanh chóng [tôi. e. a hack] để làm tròn số float xuống số nguyên// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
18Cuối cùng, chúng tôi sử dụng
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
06 để hiển thị điểm số trong chức năng cập nhật chính// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
197. nhổ và đánh bóng
Mọi người thường hiểu rằng một bản demo có thể chơi được có thể được thực hiện trong vài giờ, nhưng một trò chơi bóng bẩy phải mất nhiều ngày, nhiều tuần, nhiều tháng hoặc thậm chí nhiều năm
Chúng tôi có thể làm một vài điều để cải thiện sự hấp dẫn trực quan của trò chơi
hiệu ứng hạt
Hầu hết các trò chơi đều có một số dạng hiệu ứng hạt, rất tốt cho các vụ nổ. Điều gì sẽ xảy ra nếu chúng ta làm cho một bong bóng nổ thành nhiều bong bóng nhỏ khi nó bị vỡ, thay vì biến mất ngay lập tức?
Hãy xem lớp học
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
07 của chúng tôi// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
0Nó khá rõ ràng những gì đang xảy ra ở đây. Sử dụng một số gia tốc cơ bản để các hạt tăng tốc khi tiếp cận bề mặt là một điểm nhấn tuyệt vời. Một lần nữa, toán học và vật lý này nằm ngoài phạm vi của bài viết này, nhưng đối với những người quan tâm, Skookum Digital Works sẽ giải thích sâu về nó
Để tạo hiệu ứng hạt, chúng tôi đẩy một số hạt vào mảng
// namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
08 của mình bất cứ khi nào bong bóng bị va chạm// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
1Sóng
Với chủ đề dưới nước của trò chơi, việc thêm hiệu ứng sóng vào phía trên màn hình sẽ là một điểm nhấn tuyệt vời. Chúng ta có thể làm điều này bằng cách vẽ một số vòng tròn chồng lên nhau để tạo ảo giác về sóng
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
2Thêm đoạn mã trên vào hàm
// abstracts various canvas operations into
// standalone functions
POP.Draw = {
clear: function[] {
POP.ctx.clearRect[0, 0, POP.WIDTH, POP.HEIGHT];
},
rect: function[x, y, w, h, col] {
POP.ctx.fillStyle = col;
POP.ctx.fillRect[x, y, w, h];
},
circle: function[x, y, r, col] {
POP.ctx.fillStyle = col;
POP.ctx.beginPath[];
POP.ctx.arc[x + 5, y + 5, r, 0, Math.PI * 2, true];
POP.ctx.closePath[];
POP.ctx.fill[];
},
text: function[string, x, y, size, col] {
POP.ctx.font = 'bold '+size+'px Monospace';
POP.ctx.fillStyle = col;
POP.ctx.fillText[string, x, y];
}
};
1. // namespace our game
var POP = {
// set up some initial values
WIDTH: 320,
HEIGHT: 480,
// we'll set the rest of these
// in the init function
RATIO: null,
currentWidth: null,
currentHeight: null,
canvas: null,
ctx: null,
init: function[] {
// the proportion of width to height
POP.RATIO = POP.WIDTH / POP.HEIGHT;
// these will change when the screen is resized
POP.currentWidth = POP.WIDTH;
POP.currentHeight = POP.HEIGHT;
// this is our canvas element
POP.canvas = document.getElementsByTagName['canvas'][0];
// setting this is important
// otherwise the browser will
// default to 320 x 200
POP.canvas.width = POP.WIDTH;
POP.canvas.height = POP.HEIGHT;
// the canvas context enables us to
// interact with the canvas api
POP.ctx = POP.canvas.getContext['2d'];
// we're ready to resize
POP.resize[];
},
resize: function[] {
POP.currentHeight = window.innerHeight;
// resize the width in proportion
// to the new height
POP.currentWidth = POP.currentHeight * POP.RATIO;
// this will create some extra space on the
// page, allowing us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
// set the new canvas style width and height
// note: our canvas is still 320 x 480, but
// we're essentially scaling it with CSS
POP.canvas.style.width = POP.currentWidth + 'px';
POP.canvas.style.height = POP.currentHeight + 'px';
// we use a timeout here because some mobile
// browsers don't fire if there is not
// a short delay
window.setTimeout[function[] {
window.scrollTo[0,1];
}, 1];
}
};
window.addEventListener['load', POP.init, false];
window.addEventListener['resize', POP.resize, false];
10 có một số giá trị mà chúng ta sẽ cần để vẽ sóngThêm phần sau vào chức năng cập nhật chính. Nó sử dụng sóng hình sin để điều chỉnh vị trí của sóng và tạo ảo giác về chuyển động
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
3Tất cả những gì còn lại phải làm là vẽ các sóng, việc này sẽ được đưa vào chức năng kết xuất
// this will create some extra space on the
// page, enabling us to scroll past
// the address bar, thus hiding it.
if [POP.android || POP.ios] {
document.body.style.height = [window.innerHeight + 50] + 'px';
}
4Ở đây, chúng tôi đã sử dụng lại giải pháp sóng hình sin của mình cho bong bóng để làm cho sóng di chuyển nhẹ nhàng qua lại. Cảm thấy say sóng chưa?
Suy nghĩ cuối cùng
Phù. Đó là niềm vui. Hy vọng bạn thích phần tổng hợp ngắn này về các thủ thuật và kỹ thuật để tạo trò chơi HTML5. Chúng tôi đã quản lý để tạo một trò chơi rất đơn giản hoạt động trên hầu hết các điện thoại thông minh cũng như các trình duyệt hiện đại. Dưới đây là một số điều bạn có thể cân nhắc thực hiện
- Lưu trữ điểm cao bằng bộ nhớ cục bộ
- Thêm màn hình giật gân và màn hình “Trò chơi kết thúc”
- Kích hoạt tăng sức mạnh
- thêm âm thanh. Trái ngược với những gì tôi đã nói ở đầu bài viết này, điều này không phải là không thể, chỉ là hơi đau đầu mà thôi. Một kỹ thuật là sử dụng các họa tiết âm thanh [giống như các họa tiết hình ảnh CSS];
- Hãy để trí tưởng tượng của bạn được bay bổng hoang dại
Đọc thêm trên SmashingMag.
- Xây dựng lại một trò chơi HTML5 trong sự thống nhất
- Nhà thiết kế web có thể học được gì từ trò chơi điện tử
- Tiếp thị qua email cho người tạo ứng dụng di động
- Thiết kế thân thiện với ngón tay. Kích thước mục tiêu màn hình cảm ứng di động lý tưởng
Nếu bạn quan tâm đến việc khám phá thêm các khả năng của trò chơi HTML5 trên thiết bị di động, tôi khuyên bạn nên chạy thử một vài khung để xem cái nào phù hợp với bạn. Juho Vepsäläinen cung cấp một bản tóm tắt hữu ích về hầu hết các công cụ trò chơi. Nếu bạn sẵn sàng đầu tư một ít tiền mặt, thì Impact là điểm khởi đầu tuyệt vời, với tài liệu kỹ lưỡng và diễn đàn hữu ích sinh động. Và X-Type ấn tượng chứng minh những gì có thể. Không tệ nhỉ?