<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Phaser &#8211; AnonyViet</title>
	<atom:link href="https://anonyviet.com/tag/phaser/feed/" rel="self" type="application/rss+xml" />
	<link>https://anonyviet.com</link>
	<description>Webiste chia sẻ kiến thức công nghệ thông tin, mạng máy tính, bảo mật phổ biến nhất Việt Nam. Luôn cập nhật tin tức, thủ thuật nóng hổi nhất</description>
	<lastBuildDate>Sat, 16 Dec 2017 06:51:44 +0000</lastBuildDate>
	<language>vi</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://anonyviet.com/wp-content/uploads/2018/10/cropped-ico-logo-75x75.png</url>
	<title>Phaser &#8211; AnonyViet</title>
	<link>https://anonyviet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser</title>
		<link>https://anonyviet.com/huong-dan-lam-game-javascript-don-gian-bang-thu-vien-phaser/</link>
					<comments>https://anonyviet.com/huong-dan-lam-game-javascript-don-gian-bang-thu-vien-phaser/#comments</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Sun, 17 Dec 2017 11:04:31 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Phaser]]></category>
		<category><![CDATA[tạo game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=7344</guid>

					<description><![CDATA[Nội dung: Chắc tất cả các bạn ai cũng đã từng chơi game BreakOut rồi nhỉ 🙂 Sau đây mình sẽ hướng dẫn các bạn tự tạo game này bằng cách sử dụng các thư viện Javascript có sẵn. Mình sẽ trình bày step-by-step nên các bạn yên tâm là sẽ làm được nhé 🙂 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2><strong><em>Nội dung:</em></strong></h2>
<p>Chắc tất cả các bạn ai cũng đã từng chơi game BreakOut rồi nhỉ 🙂 Sau đây mình sẽ hướng dẫn các bạn tự tạo game này bằng cách sử dụng các thư viện Javascript có sẵn. Mình sẽ trình bày step-by-step nên các bạn yên tâm là sẽ làm được nhé 🙂</p>
<h2><strong><em>Hướng dẫn:</em></strong></h2>
<p>Tạo cấu trúc cây thư mục như sau:</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-08-27.png"><img fetchpriority="high" decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-08-27.png" alt="game javascript đơn giản bằng thư viện Phaser" width="191" height="277" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 12"></a></p>
<p>File <span style="color: #0000ff;">index.html</span> có nội dung như sau:</p>
<pre class="lang:js decode:true">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta charset="utf-8" /&gt;
	&lt;title&gt;Gamedev Phaser Workshop - lesson 01: Initialize the framework&lt;/title&gt;
	&lt;style&gt;* { padding: 0; margin: 0; }&lt;/style&gt;
	&lt;script src="phaser.min.js"&gt;&lt;/script&gt;
	&lt;script src="breakout.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Bây giờ chúng ta sẽ bắt đầu viết code cho game.</p>
<pre class="lang:js decode:true ">var game = new Phaser.Game(480, 360, Phaser.AUTO, null, {
	preload: preload,
	create: create,
	update: update
});

function preload() {}

function create() {}

function update() {}</pre>
<p>Trong file <span style="color: #0000ff;">breakout.js</span>, bạn thêm  code sau:</p>
<p>Khi chạy thử, chúng ta thấy trên màn hình xuất hiện một khu vực có màu đen kích thước 480&#215;360 là được nhé.</p>
<p>Bây giờ chúng ta sẽ thay đổi background  cho game.</p>
<p>Trong hàm preload() thêm dòng code sau:</p>
<pre class="lang:default decode:true "> game.load.image("background", "assets/background.jpeg");</pre>
<p>Đây là câu lệnh giúp load hình ảnh lên. Tuy nhiên nếu bây giờ các bạn load lại trang sẽ thấy không có gì xảy ra cả, bởi vì hình ảnh mới chỉ được load lên chứ chưa được sử dụng.</p>
<p>Thêm đoạn code sau vào hàm create():</p>
<pre class="lang:default decode:true">game.add.tileSprite(0, 0, 1000, 600, 'background');</pre>
<p>Bây giờ bạn hãy thử load lại trang xem :))</p>
<p>Tiếp theo, để chơi game thì chúng ta cần có một trái bóng. Tương tự như background, chúng ta cần phải load hình ảnh trái bòng lên sau đó sau đó dùng nó. Trước tiên tạo một biến toàn cục đặt tên là ball đặt trước hàm preload():</p>
<pre class="lang:default decode:true ">var ball;</pre>
<p>Thêm đoạn code sau vào hàm preload():</p>
<pre class="lang:default decode:true ">game.load.image("ball", "assets/ball.png");</pre>
<p>Trong create() thêm đoạn code:</p>
<pre class="lang:default decode:true">ball = game.add.sprite(game.world.width*0.5, game.world.height-70, "ball");
ball.anchor.setTo(0.5);</pre>
<p>Sau khi có trái bóng, ta cần một thanh ngang để hứng trái bóng đó. Học code mà không thực hành thì chán lắm nhỉ. Bạn hãy thử đặt các dòng code sau vào đúng vị trí xem nào.</p>
<p><span style="color: #0000ff;"><strong>*Gợi ý:</strong></span> Hãy làm tương tự như làm với trái bóng.</p>
<pre class="lang:default decode:true">var paddle;
	game.load.image('paddle', 'assets/paddle.png');
	paddle = game.add.sprite(game.world.width*0.5, game.world.height-50, "paddle");
	paddle.anchor.setTo(0.5);
</pre>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-13-53.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-13-53.png" alt="làm game javascript đơn giản bằng thư viện Phaser" width="569" height="399" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 13"></a></p>
<p>Đây là hình ảnh sau khi bạn đặt các dòng code vào đúng vị trí của nó.</p>
<p>Tiếp theo mình sẽ nói tiếp về các xử lý vật lý trong game.</p>
<p>Bạn hãy thử thêm dòng lệnh sau vào cuối hàm <span style="color: #0000ff;">create()</span></p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-15-55.png"><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-15-55.png" alt="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 2" width="583" height="291" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 14"></a></p>
<p>Thật tuyệt phải không nào. Hãy thử tiếp theo với paddle nhé. Tuy nhiên ta sẽ không muốn paddle cũng rơi xuống giống như ball. Nên sẽ không thêm thuộc tính trọng lượng cho nó, vì vậy cũng không cần thiết phải xử lý va chạm cho nó với khung game. Thay vào đó chúng ta sẽ thiết lập va chạm giữa paddle với ball. Hãy chỉnh sửa code của bạn như sau:</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-17-20.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-17-20.png" alt="javascript đơn giản bằng thư viện Phaser" width="618" height="533" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 15"></a></p>
<p>Hãy xem chuyện gì xảy ra nào. Ta thấy ball va chạm với paddle sau đó paddle rới xuống. Như phân tích ở trước, ta sẽ không muốn paddle bị rơi xuống, vậy hãy thêm dòng code sau vào cuối hàm <span style="color: #0000ff;">create()</span> :</p>
<pre class="lang:default decode:true ">paddle.body.immovable = true;</pre>
<p>Tiếp theo chúng ta cần làm cho thanh paddle di chuyển. Đơn giản bạn chỉ cần thêm đọan code sau vào cuối hàm update() :</p>
<pre class="lang:default decode:true ">paddle.x = game.input.x || game.world.width*0.5;</pre>
<p>Bây giờ thì paddle đã có thể di chuyển được. Tuy nhiên ta để ý thấy đường đi của trái bóng khá là “dị”, nguyên nhân là do ta đã thiết đặt trọng lượng cho trái bóng và điều đó là không cần thiết. Hãy thay thế đoạn code đó bằng dòng lệnh sau:</p>
<pre class="lang:default decode:true ">ball.body.velocity.set(150, -150);</pre>
<p>Ổn hơn nhiều rồi đúng không nào :))</p>
<p>Vậy là chúng ta đã đi được 1/2 chặng đường rồi , ez phải không nào 🙂 Chú ý rằng bạn có thể tham khảo code mẫu, tuy nhiên code mẫu là những gì cuối cùng sau khi hoàn thành nên sẽ có thể không giống những gì mình đang nói ở đây. Vì vậy bạn hãy cố gắng theo dõi bài viết này nhé 🙂</p>
<p>Tiếp theo, chúng ta sẽ tạo ra các khối brick để bắn.</p>
<p>Việc đầu tiên là load các hình ảnh. Hãy thêm đoạn code sau vào cuối hàm <span style="color: #0000ff;">preload()</span> :</p>
<pre class="lang:default decode:true ">game.load.image('brick_blue', 'assets/brick_blue.png');
game.load.image('brick_red', 'assets/brick_red.png');
game.load.image('brick_violet', 'assets/brick_violet.png');
game.load.image('brick_green', 'assets/brick_green.png');
</pre>
<p>Sau đó thêm các biến toàn cục vào đầu chương trình:</p>
<pre class="lang:default decode:true">            var bricks;
            var newBrick;
            var brickInfo;</pre>
<p>Tạo một Function mới có tên là <span style="color: #0000ff;">initBricks</span></p>
<p>Trong hàm này tạo một đối tượng lưu các thông số của brick như sau:</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-20-42.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-20-42.png" alt="javascript đơn giản bằng thư viện Phaser" width="776" height="433" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 16"></a></p>
<p>Tiếp theo chúng ta sẽ sử dụng vòng lặp for để hiển thị các brick lên. Thêm đoạn code sau vào cuối hàm <span style="color: #0000ff;">initBricks()</span>:</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-21-24.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-21-24.png" alt="javascript đơn giản bằng thư viện Phaser" width="754" height="289" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 17"></a></p>
<p>Giải thích:</p>
<p>Trong đối trượng <span style="color: #0000ff;">brickInfo</span>:</p>
<ul>
<li>width: chiều dài của một brick</li>
<li>height: chiều rộng của một brick</li>
<li>count: số brick bằng row*col</li>
<li>offset: tọa độ brick đầu tiên (chọn làm mốc)</li>
<li>color: mảng lưu các giá trị màu</li>
<li>padding: khoảng cách giữa các brick</li>
<li><span style="color: #3366ff;"><em>bricks = game.add.group();</em></span> sẽ tạo ra một nhóm các đối tượng có đặc điểm giống nhau</li>
<li><span style="color: #3366ff;"><em>var rdn = parseInt(Math.random()*4 +1);</em></span> lấy một giá trị ngẫu nhiên từ 1-4 ứng với 4 màu đã quy định</li>
</ul>
<p>Sau khi đã hiển thị được các brick lên màn hình, chúng ta sẽ xử lý va chạm cho ball và brick. Thêm dòng code sau vào hàm <span style="color: #0000ff;">update();</span></p>
<pre class="lang:default decode:true ">game.physics.arcade.collide(ball, bricks, ballHitBrick);</pre>
<p>Khi va chạm, chương trình sẽ gọi đến hàm ballHitBrick, vì vậy hãy tạo thêm hàm mới với nội dung sau:<a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-23-12.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-23-12.png" alt="javascript đơn giản bằng thư viện Phaser" width="411" height="70" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 18"></a></p>
<p>Nếu bạn để ý thì khi bóng va chạm với paddle thì luôn chuyển động với quỹ đạo xác định, như vậy game sẽ không hay cho lắm. Hãy tìm đoạn code xử lý va chạm giữa ball và paddle, sửa lại như sau:</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-23-55.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-23-55.png" alt="javascript đơn giản bằng thư viện Phaser" width="694" height="214" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 19"></a></p>
<p>Đến bước này thì ta đã hoàn thành 80% của game rồi, bạn hãy chơi thử và cảm nhận thành quả nhé 🙂 Bạn hãy để ý, game của chúng ta còn nhiều bug lắm</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-24-53.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-24-53.png" alt="javascript đơn giản bằng thư viện Phaser" width="583" height="374" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 20"></a></p>
<p>Sau khi chơi thử game, bạn có thể sẽ phát hiện ra một số điều như sau:</p>
<ul>
<li>Bóng rơi xuống khỏi paddle không bị  thua.</li>
<li>Sau khi bắn hết brick, game không khởi tạo lại.</li>
</ul>
<p>Ok, bây giờ chúng ta sẽ fix từng bug một nhé 😉</p>
<p>Hãy thêm đoạn code sau vào cuối hàm<span style="color: #0000ff;"> create()</span> :</p>
<pre class="lang:default decode:true">game.physics.arcade.checkCollision.down = false;
ball.checkWorldBounds = true;
ball.events.onOutOfBounds.add(ballLeaveScreen, this);</pre>
<p>Sau đó thêm hàm <span style="color: #0000ff;">ballLeaveScreen()</span> có nội dung như sau:</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-26-00.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-26-00.png" alt="javascript đơn giản bằng thư viện Phaser" width="386" height="102" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 21"></a></p>
<p>Cuối cùng hãy tìm và sửa hàm <span style="color: #0000ff;">ballHitBrick()</span> như sau:</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-26-48.png"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2017/12/14-12-2017-06-26-48.png" alt="javascript đơn giản bằng thư viện Phaser" width="566" height="312" title="Hướng dẫn làm game javascript đơn giản bằng thư viện Phaser 22"></a></p>
<p>Bây giờ bạn hãy chơi lại và cảm nhận nhé :))</p>
<h2><strong><em>Source code:</em></strong></h2>
<p>Source code các bạn có thể download <a href="https://github.com/clbku/game_breakout" target="_blank" rel="noopener">tại đây</a>.</p>
<h2><strong><em>Lời Kết:</em></strong></h2>
<p>Ngoài ra các bạn có thể thêm một số tính năng khác như hiển thị score, mạng, nút start game… Mình sẽ không nói chi tiết vào các chức năng này, các bạn có thể xem trong file source mình đã để ở đầu bài.</p>
<p>Mình vừa hướng dẫn cho các bạn cách để tạo ra một game đơn giản bằng thư viện phaser. Qua bài viết này hi vọng các bạn có cái nhìn tổng qua về các ứng dụng javascript nói chung và game javascript nói riêng. Chúc các bạn thành công.</p>
<p style="text-align: right;">Tác giả: <a href="https://www.facebook.com/cankuro.19?fref=ufi&amp;rc=p" rel="noopener">Hoàng Công Lý</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/huong-dan-lam-game-javascript-don-gian-bang-thu-vien-phaser/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
	</channel>
</rss>
