<?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>lập trình game &#8211; AnonyViet</title>
	<atom:link href="https://anonyviet.com/tag/lap-trinh-game/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>Thu, 24 Jul 2025 17:06:53 +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>lập trình game &#8211; AnonyViet</title>
	<link>https://anonyviet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Có nên dùng Unity để lập trình game không?</title>
		<link>https://anonyviet.com/co-nen-dung-unity-de-lap-trinh-game-khong/</link>
					<comments>https://anonyviet.com/co-nen-dung-unity-de-lap-trinh-game-khong/#comments</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Thu, 07 Apr 2022 01:01:38 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Kiến thức]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[unity engine]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=40026</guid>

					<description><![CDATA[Bạn đang muốn bước vào ngành công nghiệp game nhưng không biết bắt đầu từ đâu nên bạn đã tra google sau đó bạn lại phân vân không biết chọn Engine nào? Unity, Unreal Engine, Cocos2D, Game Maker Studio, Godot Engine,v.v có quá nhiều lựa chọn cho bạn để có thể bắt đầu. Để giải [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Bạn đang muốn bước vào ngành công nghiệp game nhưng không biết bắt đầu từ đâu nên bạn đã tra google sau đó bạn lại phân vân không biết chọn Engine nào? Unity, Unreal Engine, Cocos2D, Game Maker Studio, Godot Engine,v.v có quá nhiều lựa chọn cho bạn để có thể bắt đầu.</strong></p>
<p>Để giải đáp câu hỏi trên mình sẽ viết ra bài để nêu ra những ưu và nhược của Unity và để xem nó có đáng để bạn học tập và sử dụng nó hay không.</p>
<h2>Unity là gì?</h2>
<p><img fetchpriority="high" decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2022/02/28-02-2022-02-55-06.png" alt="Có nên sử dụng Unity để lập trình game trong năm 2022 hay không?" width="523" height="296" title="Có nên dùng Unity để lập trình game không? 2"></p>
<h3>Sơ lược</h3>
<p><a href="https://unity.com/" target="_blank" rel="noopener">Unity</a> đã và đang là một Engine làm mưa làm gió trên nền công nghiệp game, với sức mạnh tối ưu, hỗ trợ các game tốt về hiệu năng, các API, framework,.. Có thể nói rằng Unity là 1 Engine đầy đủ với mọi thứ để bạn có thể <a href="https://anonyviet.com/tag/lap-trinh-game/">lập trình game</a>. Đã có rất rất nhiều các game được tạo ra bởi Unity và hình như chiếm tổng số các game đứng top thế giới.</p>
<p>Và Unity cũng đang là Engine đứng top 1 trong các Engine làm game.</p>
<h3>Có nên học Unity ? Nếu có thì học ở đâu?</h3>
<p>Câu trả lời của mình là <strong>CÓ</strong>, bạn nên học Unity ngay và luôn nếu có ý định theo ngành game, có máy tính chạy được Unity. Với các yếu tố ở phần Sơ Lược thì chắc chắn không có lý do nào mà mình lại nói không rồi.</p>
<p>Về vấn đề học ở đâu thì có rất nhiều cách để bạn có thể học các làm game với Unity. Bạn có thể kiếm ở trên Udemy, Youtube, các khóa học được share lại trên mạng,v.v. Có rất nhiều nhưng quan trọng bạn có thể học được hay không mới là chuyện.</p>
<p>Bạn có thể ra các trung tâm dạy lập trình game bằng Unity để học cũng là 1 phương án hay.</p>
<h3>Cơ hội việc làm ?</h3>
<p>Về việc làm thì Unity chắc chắn không thiếu bởi vì do nhu cầu về việc đầu tư vào ngành công nghiệp game ở Việt Nam các công ty, studio sản xuất game hầu như đều đang kiếm cho mình 1 lập trình viên Unity về bên họ cả. Rất là nhiều và nhiều job về Unity, nếu bạn không tin thì có thể lên các trang như TopCV thấy người ta tuyển rất rất nhiều.</p>
<p>Mặc dù nhiều thật đấy nhưng bạn có biết tại sao lại tuyển nhiều không? Theo mình, ở các đại học Việt Nam ít nơi có các giáo trình về lập trình game bằng Unity,Unreal Engine, v.v. Chủ yếu là đều tự học rồi bồi đắp kinh nghiệm qua các dự án chứ không hề thông qua các trường lớp đào tạo nào cả. Do đó, nó dẫn tới việc thiếu rất nhiều slot.</p>
<h3>Điểm mạnh và yếu</h3>
<p>Unity có nhiều điểm mạnh và một số điểm yếu như:</p>
<h4>Ưu điểm:</h4>
<ul>
<li>Với nền công nghệ hiện đại, Unity cho phép bạn thiết kế game theo các thể loại 2D, 3D, AR, VR và có thể xuất game ra bất kì nền tảng nào như: Linux, Windows,MacOS,iOS,v.v</li>
<li>Có đầy đủ các SDK,API, Tutorial để bạn có thể hoàn thành game của mình mà không bị thiếu thốn gì cả.</li>
<li>Cung cấp 1 hiệu năng rất tốt cho game của bạn nhất là nền tảng 3D.</li>
<li>Dễ làm việc theo nhóm.</li>
<li>Có một cộng đồng vô cùng lớn mạnh.</li>
</ul>
<h4>Nhược điểm:</h4>
<ul>
<li>Unity vẫn phải trả phí.</li>
<li>Doanh thu của bạn sẽ bị giới hạn.</li>
<li>Sử dụng C#, C++ và nếu bạn chưa có căn bản về lập trình thì sẽ rất khó để thích ứng, làm việc với nó.</li>
</ul>
<h3>Tổng kết</h3>
<p>Hi vọng qua bài này bạn đã có thể quyết định việc tiến hành học và làm với Unity. Nếu có góp ý thì bạn có thể comment cho mình biết nhé.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Unity có khó học không?</h3>
<p>Mức độ khó phụ thuộc vào kiến thức lập trình sẵn có của bạn.  Nếu bạn đã có kinh nghiệm lập trình C#, việc học Unity sẽ dễ dàng hơn. Tuy nhiên, ngay cả người mới bắt đầu cũng có thể học được Unity với nhiều tài liệu và khóa học sẵn có.</p>
<h3>Cơ hội việc làm cho lập trình viên Unity tại Việt Nam như thế nào?</h3>
<p>Cơ hội việc làm rất tốt.  Ngành công nghiệp game Việt Nam đang phát triển mạnh, dẫn đến nhu cầu cao về lập trình viên Unity.  Tuy nhiên, sự cạnh tranh cũng cao do nguồn cung lập trình viên Unity vẫn còn hạn chế.</p>
<h3>Unity có phù hợp với người mới bắt đầu lập trình game không?</h3>
<p>Hoàn toàn phù hợp.  Unity có giao diện thân thiện, cộng đồng hỗ trợ lớn và nhiều tài liệu hướng dẫn dành cho người mới.  Tuy nhiên, bạn cần kiên trì và sẵn sàng học hỏi liên tục.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/co-nen-dung-unity-de-lap-trinh-game-khong/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Có nên học Godot Engine để lập trình Game không?</title>
		<link>https://anonyviet.com/co-nen-hoc-godot-engine-de-lap-trinh-game-khong/</link>
					<comments>https://anonyviet.com/co-nen-hoc-godot-engine-de-lap-trinh-game-khong/#comments</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Tue, 15 Mar 2022 00:07:49 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[GODOT ENGINE]]></category>
		<category><![CDATA[lập trình]]></category>
		<category><![CDATA[lập trình game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=40023</guid>

					<description><![CDATA[Nói đôi chút về lập trình game, ngành thì có đấy nhưng làm sao để tham gia cái ngành này thì bạn có biết không? Và câu trả lời của mình đó là đơn giản thôi, bạn chỉ cần tải các Engine hỗ trợ thiết kế game về tiến hành quá trình học, training với [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nói đôi chút về lập trình game, ngành thì có đấy nhưng làm sao để tham gia cái ngành này thì bạn có biết không? Và câu trả lời của mình đó là đơn giản thôi, bạn chỉ cần tải các Engine hỗ trợ thiết kế game về tiến hành quá trình học, training với nó. Nhưng câu hỏi được nhiều bạn đặt ra là bạn nên chọn Engine nào cho việc bắt đầu quá trình học hỏi, có quá nhiều Engine xoay quanh Internet, người thì recommend cái này cái kia lúc Unity, UE, Gms,v.v khiến cho bạn lúng ngúng và dẫn đến việc đắn đo sau đó có khi là bỏ không làm nữa.</p>
<p>Vậy thì để trả lời cho các câu hỏi ở trên mình sẽ viết 1 bài để đánh giá khả năng của 1 Engine đó là Godot Engine.</p>
<h2>Godot Engine</h2>
<p><a href="https://anonyviet.com/wp-content/uploads/2022/03/godot-lap-trinh-game.jpg"><img decoding="async" class="aligncenter size-full " src="https://anonyviet.com/wp-content/uploads/2022/03/godot-lap-trinh-game.jpg" alt="godot lap trinh game" width="616" height="353" title="Có nên học Godot Engine để lập trình Game không? 4"></a></p>
<h3>Sơ lược</h3>
<p>Nếu nói sơ qua về Godot thì đây là 1 Engine được phát triển vào những năm 2007 của 2 thập kỉ trước, và trước đó Godot gần như là 1 Engine vô danh, ít người biết đến và dở. Nhưng rồi kể từ phiên bản 3.x đây là 1 sự lột xác hoàn toàn cho Godot với các mode, function,v.v đã được cải tiến, thêm vào và biến nó trở thành 1 Engine tiềm năng đáng để sử dụng trong thập kỉ 202x.</p>
<h3>Có nên học Godot để lập trình Game không?</h3>
<p>Câu trả lời của mình là CÓ, với những bản cập nhật từ phiên bản 3.x , và hơn hết là phiên bản 4.x dang được phát triển và cho ra bản alpha test trong thời điểm mình viết bài này với nền tảng công nghệ đồ họa Vulkan, nó đã biến Godot 4.x trở thành 1 Engine có khả năng tốt về 3D và 2D với sự đầu tự của các tổ chức như: Heroic Labs,Gamblify,v.v</p>
<p>Godot Engine đã đáng để bạn bỏ thời gian ra và sử dụng nó.</p>
<h3>Cơ hội việc làm với Godot</h3>
<p>Với cơ hội để làm việc với Engine này thì hầu như ở VN rất ít và có thể đếm trên đầu ngón tay nhưng ở bên ngoài nước ngoài họ đã và đang sử dụng Godot Engine này để phát triển các thể loại game 2D. Và tất nhiên trong vài năm tới thị trường game Việt Nam sẽ bắt đầu sử dụng Godot cho việc sản xuất game cho nên nếu như bạn muốn đánh cược tương lai của mình thì hãy lập trình game bằng Godot.</p>
<h3>So sánh Godot với Unity</h3>
<p>Unity thì chắc chắn sẽ trên kèo nhưng bù lại Godot Engine có thể làm được nhiều thứ mà Unity khó làm được.</p>
<p>+ Đầu tiên đó chính là thời gian làm 1 tựa game, mình đã sử dung 2 Engine này và đưa ra kết quả là Cùng 1 newbie sử dụng 2 Engine này thì việc thiết kế game với Godot sẽ nhanh hơn Unity khi mà  nósử dụng các cú pháp tương tự như Python, các chức năng như Camera,v.v đều được có sẵn để làm game.</p>
<p>+ Nhưng bù lại điểm thứ nhất mặc dù làm nhanh nhưng hiệu năng của Godot nó sẽ yếu hơn Unity, nhưng vẫn tùy vào thể loại game mà bạn thực hiện, nếu game 2D thì Godot vẫn nhỉnh hơn Unity 1 xíu nhưng nếu là 3D thì Godot hoàn toàn thua.</p>
<h3>Vậy có nên sử dụng Godot Engine?</h3>
<p>Câu trả lời của mình là <strong>CÓ</strong>, nó rất thích hợp với các indie game developer hay các studio sản xuất game muốn có sản phẩm nhanh thì Godot Engine là 1 lựa chọn thích hợp. Mặc dù vẫn còn ít các tutorial nhưng Godot vẫn rất dễ để có thể sử dụng. Hiện nay AnonyViet đã có 1 <a href="https://anonyviet.com/?s=godot">seri học Godot hơn 100 bài</a> có thể giúp bạn tạo được 1 Game cơ bản trên máy tính. Hãy tham khảo thử nhé.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Godot Engine có dễ học không?</h3>
<p>Godot Engine được đánh giá là khá dễ học, đặc biệt với người mới bắt đầu, nhờ cú pháp tương tự Python và các chức năng sẵn có.</p>
<h3>Có nhiều cơ hội việc làm khi sử dụng Godot Engine không?</h3>
<p>Hiện nay, thị trường việc làm liên quan đến Godot Engine tại Việt Nam còn hạn chế, nhưng đang có xu hướng phát triển.  Thị trường quốc tế có nhiều cơ hội hơn, đặc biệt là trong lĩnh vực game 2D.</p>
<h3>Godot Engine phù hợp với loại game nào?</h3>
<p>Godot Engine rất phù hợp cho các dự án game 2D và các indie game.  Đối với game 3D, hiệu năng của Godot có thể kém hơn so với các engine khác như Unity, nhưng vẫn đáp ứng được nhiều yêu cầu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/co-nen-hoc-godot-engine-de-lap-trinh-game-khong/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Học lập trình Game dễ không? Tiềm năng của ngành lập trình game?</title>
		<link>https://anonyviet.com/hoc-lap-trinh-game-de-khong/</link>
					<comments>https://anonyviet.com/hoc-lap-trinh-game-de-khong/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Tue, 08 Mar 2022 23:32:29 +0000</pubDate>
				<category><![CDATA[Kiến thức]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[lập trình]]></category>
		<category><![CDATA[lập trình game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=39986</guid>

					<description><![CDATA[Lập trình game đang là 1 trong những ngành rộ lên rất nhiệt tình ở Việt Nam trong các năm trở lại đây, khi mà công nghệ thông tin đã tiếp xúc với hấu hết mọi người, khi mà các app đã quá nhiều ý tưởng, quá nhiều gamer, Các yếu tố đó đã đem [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Lập trình game đang là 1 trong những ngành rộ lên rất nhiệt tình ở Việt Nam trong các năm trở lại đây, khi mà công nghệ thông tin đã tiếp xúc với hấu hết mọi người, khi mà các app đã quá nhiều ý tưởng, quá nhiều gamer, Các yếu tố đó đã đem lại cho chúng ta những chàng trai trẻ tuổi đôi mươi có thể là cấp 2 hoặc cấp 3 đam mê làm game vì thích chơi game.</strong></p>
<p>Trong bài này với tư cách là 1 indie game với 4 năm kinh nghiệm thì mình có 1 chút kiến thức, hiểu biết của mình qua các năm qua và chia sẻ lại cho các bạn. Và tất nhiên kiến thức của mình sẽ không hoàn hảo cho lắm cho nên mình vẫn sẽ nhận thêm phản hồi của mọi người.</p>
<p><a href="https://anonyviet.com/wp-content/uploads/2022/02/hoc-lap-trinh-game-de-khong.jpg"><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2022/02/hoc-lap-trinh-game-de-khong.jpg" alt="Học lập trình Game dễ không?" width="645" height="359" title="Học lập trình Game dễ không? Tiềm năng của ngành lập trình game? 6"></a></p>
<h2>Lập trình game</h2>
<h3>Khái niệm làm game</h3>
<p>Về cơ bản, lập trình game hay làm game chính là sáng tạo ra các trò chơi và để người khác chơi trò chơi của mình để kiếm thêm thu nhập hoặc là danh tiếng gì đó.</p>
<h3>Mục đích khi bắt đầu lập trình game</h3>
<h4>Mục đích hầu hết của mọi người</h4>
<p>Về mục đích chắc chắn sẽ có rất nhiều bạn trả lời mục đích của việc theo ngành lập trình game đó là thích chơi game. Theo mình cái lý do này là không chính đáng và với mục đích này thì không nên vào cái ngành làm game và tất nhiên mình sẽ có 2 ý kiến là không đồng tình và đồng tình, minh sẽ gọi lần lượt là (1) và (2).</p>
<p>(1): Với ý kiến không đồng tình của mình trong đây đó là hầu hết mọi người chỉ thích làm game vì đơn giản họ chơi game nhiều chứ họ không tiếp xúc tới những app, web, ( chỉ nói riêng trong dev game thôi nha chứ nói chung vẫn có nhiều người với nhiều lựa chọn mà mình kể ) và đam mê làm nó mà chủ yếu là do đã tiếp xúc với game từ sớm sau đi công nghệ thông tin thì chọn làm game. Nhưng khi đến lúc học thấy nó khó khăn và bỏ rồi chuyển theo nghề khác và cũng từ đó giấc mơ làm game đã bị tiêu tán.</p>
<p>(2): Mình đồng tình ở chỗ là có nhiều người đã chuyển từ cái &#8220;thích&#8221; làm game của họ sang cái gọi là &#8220;đam mê&#8221;. Mà mọi người cũng biết đó đam mê chính là 1 phần mạnh mẽ giúp bạn theo đuổi ngành này lâu và dễ dàng hơn. Nhiều người họ đã tự tìm tòi và học dev game chứ không phải như các thanh niên ở (1) lên các group lập trình hỏi xong lại kệ bỏ đó rồi 1 ngày nào đó tự nhiên thấy đam mê xong lại đi hỏi.</p>
<p>Và thêm 1 cái mục đích nữa đó là vì tiền.</p>
<h4>Mục đích của mình</h4>
<p>Nếu nói về mục đích làm game của mình thì nó chả phải mình thích chơi game cũng chả phải vì tiền mà đơn giản là vì <strong>mình muốn tạo ra 1 thế giới của riêng mình, nơi mà mọi thứ đều như cách mình muốn</strong>.</p>
<p>Mình có cái đam mê như vậy thì là 1 câu chuyện dài từ nhiều năm về trước và trước. Ngày đó mẹ mình đi làm, mình ở nhà 1 mình và trong lúc chán nản mình đã tự làm ra các trò chơi với các đồ vật trong nhà để cho vui đỡ chán. Từ cái thời đó mình luôn mong ước là mình có mấy cái bộ chơi game như gundam hay gì ấy nó biến thành thế giới thức và mình điểu khiến lính đánh nhau trong đó, rồi từ đó mình đã mang trong mình 1 đam mê làm game mãnh liệt với những thế giới trong trí tưởng tượng của mình.</p>
<h3>Tiềm năng</h3>
<p>Ngành game ở Việt Nam chỉ đang phát triển những năm gần đây thôi cho nên cơ hội việc làm với các bạn rất là nhiều và lương rất cao và cao cao cao cao hơn nữa nếu game có thu nhập tốt. VD: chẳng hạn như Rise of Kingdoms, Warpath, Lords Mobile,&#8230; Những cái tên này đã kiếm được hơn 100 tỷ VND và bạn nghĩ xem nếu như là 1 game developer trong đó bạn sẽ được thưởng bao nhiêu?</p>
<h3>Bạn nên sử dụng Engine nào? Ngôn ngữ nào?</h3>
<h4>Bạn</h4>
<p>Vấn đề này mình thấy nó đang được nhiều bạn hỏi đấy.</p>
<p>Mình sẽ có vài lời khuyên cho các bạn:</p>
<p>+ Bạn sẽ phải xem vào điều kiện máy của bạn, thời gian của bạn, mức độ bạn có thể học. Những thứ này đều sẽ ảnh hưởng mạnh đến việc trở thành 1 lập trình viên game của bạn.</p>
<p>+ Nếu máy bạn yếu + ít thời gian + khó học được ngôn ngữ lập trình hãy dùng Game Maker Studio, Cocos2D, Godot -&gt; làm game 2D.</p>
<p>+ Nếu máy trung bình + mạnh thì bạn có thể chọn Unity or UE nhưng đương nhiên với các Engine này bạn sẽ phải học rất khó và lâu nhưng nếu học đúng cách thì bạn có thể học được 1 cách dễ dàng.</p>
<p>+ Unity vẫn đang được tuyển nhiều cho nên mình vẫn khuyên các bạn nên học dev game bằng Unity</p>
<h4>Mình</h4>
<p>Còn mình thì khác, mình đã đánh cược tương lai của mình vào 1 Engine tên là <a href="https://anonyviet.com/tag/godot/">Godot</a>. Godot thì làm game cũng dễ thôi, mình đã và đang làm game với Engine này và đã có 4 năm kinh nghiệm với nó nhưng mà ở Việt Nam vẫn chưa có ai tuyển Engine này cho nên mình chỉ ước sau này ở Việt Nam người ta tuyển để đi làm.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Học lập trình game khó không?</h3>
<p>Độ khó phụ thuộc vào nhiều yếu tố như nền tảng lập trình của bạn, engine và ngôn ngữ lập trình bạn chọn, cũng như thời gian và nỗ lực bạn bỏ ra.  Có những engine dễ học như Game Maker Studio, nhưng cũng có những engine phức tạp hơn như Unity hay Unreal Engine.</p>
<h3>Tiềm năng nghề nghiệp của lập trình viên game ở Việt Nam như thế nào?</h3>
<p>Ngành game Việt Nam đang phát triển mạnh mẽ, tạo ra nhiều cơ hội việc làm với mức lương hấp dẫn, đặc biệt là với các lập trình viên có kỹ năng tốt và kinh nghiệm trong các dự án thành công.</p>
<h3>Tôi nên bắt đầu học lập trình game với engine nào?</h3>
<p>Lựa chọn engine phụ thuộc vào cấu hình máy tính, thời gian học tập và mục tiêu của bạn.  Nếu máy tính yếu và bạn muốn học nhanh, hãy chọn Game Maker Studio hoặc Godot.  Nếu máy tính mạnh hơn và bạn muốn làm game 3D, Unity là một lựa chọn phổ biến.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/hoc-lap-trinh-game-de-khong/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Có nên dùng Game Maker Studio để làm Game trong năm không?</title>
		<link>https://anonyviet.com/co-nen-dung-game-maker-studio-de-lam-game-trong-nam-khong/</link>
					<comments>https://anonyviet.com/co-nen-dung-game-maker-studio-de-lam-game-trong-nam-khong/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Thu, 03 Mar 2022 05:32:49 +0000</pubDate>
				<category><![CDATA[Kiến thức]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[Game Maker Studio]]></category>
		<category><![CDATA[gms]]></category>
		<category><![CDATA[lập trình game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=40034</guid>

					<description><![CDATA[Nếu bạn đang muốn học game nhưng lại không biết bắt đầu từ đâu, bạn tìm thấy Engine Game Maker Studio và muốn học nó nhưng lại không biết có nên hay không? Vậy mình sẽ trả lời cho bạn câu hỏi này trong bài viết này. Game Maker Studio Sơ lược Game Maker Studio [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Nếu bạn đang muốn học game nhưng lại không biết bắt đầu từ đâu, bạn tìm thấy Engine Game Maker Studio và muốn học nó nhưng lại không biết có nên hay không? Vậy mình sẽ trả lời cho bạn câu hỏi này trong bài viết này.</strong></p>
<p><img decoding="async" class="aligncenter " src="https://anonyviet.com/wp-content/uploads/2022/02/download-1.jpg" alt="Có nên sử dụng Game Maker Studio để làm game trong năm 2022 không?" width="575" height="250" title="Có nên dùng Game Maker Studio để làm Game trong năm không? 8"></p>
<h2>Game Maker Studio</h2>
<h3>Sơ lược</h3>
<p>Game Maker Studio thì có 2 phiên bản đó là 1 và 2, mình gọi chung là Game Maker Studio. Con Engine này hồi trước cũng là 1 trong những Engine 2D mạnh mẽ và có cộng đồng lớn cho tới thời điểm hiện tại. Các dự án game được hoàn thành với Engine này cũng có rất nhiều game có tên tuổi như:  Police Stories,  Undertale,v.v</p>
<h3>Bạn có nên học cách sử dụng nó hay không?</h3>
<p>Câu trả lời của mình là <strong>KHÔNG</strong> và 10% là <strong>CÓ</strong>, ở bên dưới mình sẽ giải thích lý do tại sao:</p>
<p><strong>+ Không:</strong></p>
<ul>
<li>Như bạn thấy đấy vào thời điểm mình viết bài này, tức là sau thời kì hoàng kim của Game Maker Studio. Đã có nhiều Engine cập nhật, phát triển vượt bậc so với Game Maker Studio với 1 ví dụ đó chính là Godot. Những Engine này đã vượt qua rất nhiều so với Game Maker Studio.</li>
<li>Nếu như bạn học các Engine khác như Godot, Unity nó sẽ tốt hơn nhiều lần so với Game Maker Studio và vì sao? Đơn giản là vì Game Maker Studio chỉ có thể làm game ở nền tảng 2D, không thể làm game ở nền tảng 3D. Nếu như bạn làm game 2D ở GMS và làm game 3D ở Unity thì khi làm bạn sẽ phải nhớ của cái này rồi của cái kia dẫn đến việc bị rối bởi vì 2 Engine này nó hoạt động khác nhau. Cho nên bạn vẫn chỉ nên sử dụng Engine nào có cả 2 thôi.</li>
<li>Nếu bạn không biết chứ trước kia tầm 2021 đổ xuống Game Maker Studio vẫn đang là 1 Engine trả phí nhưng sau này vì sự phát triển của các Engine free khác đã khiến vị thế của GMS lung lay cho nên họ đã quyết định miễn phí sử dụng nó.</li>
</ul>
<p><strong>+ Có:</strong></p>
<ul>
<li>Trên thực thế, GMS vẫn là 1 Engine mạnh với nhiều chức năng như drag &#8211; drop,v.v rất mạnh mẽ để có thể làm game. Nếu bạn chỉ muốn làm 1 mình game 2D thì có thể chọn nó.</li>
<li>Game Maker Studio cũng có các API, SDK,Tools hỗ trợ cho bạn làm game như Vẽ hình ảnh  trong Engine, Muliplayer,v.v</li>
</ul>
<p>Vậy nói chung lại là nếu bạn muốn có 1 công việc làm game developer ổn định trong tương lai thì không nên sử dụng Game Maker Studio, còn nếu bạn muốn làm một indie game partime thì cũng hơi nên nên sử dụng nha 🙂</p>
<h3>Cơ hội việc làm</h3>
<p>Về việc làm thì mình thấy chủ yếu là ở nước ngoài họ mới tuyển thôi chứ ở Việt Nam thì có cái nịt nha, có thể có nhưng rất rất ít. Mình thấy trong tương lai Engine này cũng không có việc làm đâu bởi vì hầu hết ở Việt Nam đã có Cocos2D thay thế vị trí thiết kế game 2D của Game Maker Studio, nhưng mà đó là nhận định của mình, nếu có gì sai mình xin nhận góp ý bên dưới phần bình luận.</p>
<h3>Tổng Kết</h3>
<p>Hi vọng qua bài này bạn đã có thể rút ra được thứ mình cần và định hướng được nên đi con đường nào. Nếu bạn có thắc mắc hay ý kiến thì bạn có thể nhắn ở phần bình luận mình sẽ phản hồi lại sớm nhất.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Game Maker Studio có còn phù hợp để làm game hiện nay không?</h3>
<p>Tùy thuộc vào mục tiêu của bạn.  Nếu bạn hướng đến sự nghiệp game developer chuyên nghiệp và ổn định, hoặc muốn làm game 3D, thì nên cân nhắc các engine khác hiện đại hơn.  Nếu chỉ làm game 2D cá nhân hoặc indie game bán thời gian, Game Maker Studio vẫn là lựa chọn khả thi.</p>
<h3>Game Maker Studio có nhiều cơ hội việc làm không?</h3>
<p>Cơ hội việc làm với Game Maker Studio ở Việt Nam hiện nay khá hạn chế.  Các engine khác phổ biến hơn, đặc biệt là trong mảng 2D. Cơ hội việc làm nhiều hơn ở nước ngoài.</p>
<h3>Tôi nên chọn Game Maker Studio thay vì các engine khác như Unity hay Godot không?</h3>
<p>Nếu bạn cần làm game 3D hoặc muốn có nhiều cơ hội việc làm hơn, Unity và Godot là lựa chọn tốt hơn. Game Maker Studio mạnh về 2D và dễ sử dụng, nhưng khả năng mở rộng và tương lai nghề nghiệp có thể hạn chế hơn.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/co-nen-dung-game-maker-studio-de-lam-game-trong-nam-khong/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-29-luu-va-load-du-lieu-game/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-29-luu-va-load-du-lieu-game/#comments</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Thu, 09 Dec 2021 02:32:24 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[thiết kế game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=37457</guid>

					<description><![CDATA[Trong phần này, mình sẽ hướng dẫn bạn cách để lưu và load dữ liệu người dùng cho game. Save and load Các bước Về các bước thực hiện mình sẽ mô tả ở bên dưới: + Đầu tiên, mình sẽ cần 1 autoload script mới có trọng trách là xử lý vấn đề lưu [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này, mình sẽ hướng dẫn bạn cách để lưu và load dữ liệu người dùng cho game.</p>
<h2>Save and load</h2>
<h3>Các bước</h3>
<p>Về các bước thực hiện mình sẽ mô tả ở bên dưới:</p>
<p>+ Đầu tiên, mình sẽ cần 1 autoload script mới có trọng trách là xử lý vấn đề lưu dữ liệu game và load dữ liệu game. Mình xài autoload cho nó dễ + không lằng nhằng rồi mình tạo 2 hàm đó là luu_game() và load_game() .</p>
<p>+Ở hàm luu_game() mình sẽ lưu dưới type ConfigFile thay vì Json file như mấy kênh Youtube hay làm bởi vì nó gọn không dài dòng như json file.</p>
<p>+ Khi lưu game mình sẽ có thể chọn lưu bình thường và lưu dưới dạng mã hoá. Vậy lưu mã hoá là gì? Đó là khi bạn lưu dưới dạng mã hoá file lưu game của bạn sẽ được mã hoá lại và người dùng không thể mở nó ra rồi edit nhằm việc gian lận.</p>
<p>+ Hàm load_game() thì mình sẽ tạo 1 biến và biến này có 2 trách nhiệm đó là vừa kiểm tra rằng file lưu dữ liệu có tồn tại và load file lưu dữ liệu.</p>
<h3>Autoload</h3>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-04-05-10.png" alt="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 5" width="232" height="259" title="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 14"></p>
<p>Mình tạo 1 script mới tên là DuLieu.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-04-05-29-300x20.png" alt="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 6" width="300" height="20" title="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 15"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-04-05-36-300x31.png" alt="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 7" width="300" height="31" title="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 16"></p>
<p>Sau đó vào Autoload và add cái script DuLieu vào.</p>
<h3>Lưu game</h3>
<p>Mình khai báo 1 biến const chứa địa chỉ lưu file dữ liệu. <code class="EnlighterJSRAW" data-enlighter-language="generic">const SAVE_PATH = "user://file_dulieu.data"</code></p>
<p>File dữ liệu bạn có thể lưu với các đuôi khác nhau như data,ini,abc,jqk,cfg,file,&#8230; Và tuỳ vào bạn.</p>
<p>Về phần hàm:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func luu_game():
    var config = ConfigFile.new()
    config.set_value("player","diemso",PlayerData.diemso)
    config.set_value("player","unlocked_maps",PlayerData.Unlocked_map)
    config.save(SAVE_PATH)

</pre>
<p>Mình tạo 1 file Confìg mới rồi mình đưa dữ liệu điểm số và unlocked maps vào file đó.</p>
<p>Ở <strong>set_value() </strong>sẽ có 3 praramters:</p>
<p>+ Cái đâu tiên là <strong>Section</strong>: Đây là khu dữ liệu,mỗi khu dữ liệu sẽ có các giá trị của nó.</p>
<p>+ <strong>Key</strong>: Mình gọi đây là giá trị lưu trong 1 Section, nếu nhìn đoạn code trên thì sẽ thấy key ở đây là diemso,unlockedmap.</p>
<p>+ <strong>value: </strong>Đây là giá trị bạn cần gán cho key.</p>
<p>Sau đó, save file lại.</p>
<h3>Load Game</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func load_game():
    var config = ConfigFile.new()
    var check_file = config.load(SAVE_PATH)
    if check_file != OK: # Neu file khong bi loi hoac khong co
        return  # Huy bo load file
    PlayerData.diemso = config.get_value("player","diemso")
    PlayerData.Unlocked_map = config.get_value("player","unlocked_maps")
</pre>
<p>Ở load game thì mình khai báo 1 biến là check_file rồi gán nó = confg.load(SAVE_PATH) khi chạy thì config nó sẽ load file + với gán file vào check_file.</p>
<p>Rồi mình check nếu file OK thì tiếp tục và sau đó lấy giá trị từ save file.</p>
<h3>Menu</h3>
<p>Ở cái Menu mình sẽ thêm 2 dòng.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _ready():
    DuLieu.load_game()
</pre>
<p>Mình gọi DuLieu sau đó thì load_game() để khi mới chạy game lên thì mình load dữ liệu luôn.</p>
<h3>EndLevelMenu</h3>
<p>Ở EndLevelMenu mình sẽ loại bỏ code tính điểm số và thêm nó vào trong KhuVucDiChuyen cho gọn.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends CanvasLayer


onready var level = get_parent().get_node("KhuVucDiChuyen")
func _on_NutLevelKeTiep_pressed():
    get_tree().paused = false
    get_tree().change_scene(level.LevelKeTiep)
    pass # Replace with function body.

func _on_NutChoiLai_pressed():
    get_tree().paused = false
    get_tree().reload_current_scene()
    pass # Replace with function body.


func _on_NutVeMenu_pressed():
    get_tree().paused = false
    get_tree().change_scene("res://Scences/Map/LevelMap.tscn")
</pre>
<h3>KhuVucDiChuyen</h3>
<p>Trong đây, mình sẽ tính toán hết mọi thứ rồi lưu dữ liệu lại.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Area2D


export (String,FILE) var LevelKeTiep
onready var endlevelmenu = get_parent().get_node("EndLevelMenu")
var diemso
onready var player = get_parent().get_node("Player")
onready var map = get_parent().name
func _on_KhuVucDiChuyen_body_entered(body):
    if body.name == "Player":
        endlevelmenu.get_node("EndLevelMenu").show()	
        get_tree().paused = true
        PlayerData.Unlocked_map[get_parent().name] = true
        diemso = int( float(player.dongxu /player.max_dongxu.size()) * 100)
        if diemso &gt; PlayerData.diemso[map]: 
            PlayerData.diemso[map] = diemso
        DuLieu.luu_game()
</pre>
<h3>Kết quả</h3>
<p>Sau khi chạy game bạn chơi xong 1 ván rồi thoát ra vô lại sẽ thấy nó được lưu và load dữ liệu game.</p>
<p><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-04-38-29.png" alt="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game" width="201" height="103" title="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 17"></p>
<p>Bạn có thể thấy file_dulieu đã được tạo ra.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-04-39-48-300x210.png" alt="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 8" width="300" height="210" title="[Tạo 2D Platformer Game với Godot] Phần 29: Lưu và load dữ liệu game 18"></p>
<p>Bạn có thể tìm thấy vị trí lưu file ở Project -&gt; Open Projec Data Folder</p>
<h2>Tổng Kết</h2>
<p>Vậy là Series lập trình game Platformer với Godot Engine đã hoàn thành, nếu như bạn nào khong hiểu thì có thể lên cộng đồng hỏi nhé.</p>
<p>Mình sẽ để project ở bên dưới:</p>
<p><a href="https://github.com/DeathGM/platformer-game-voi-godot-engine" target="_blank" rel="noopener">DeathGM/platformer-game-voi-godot-engine</a></p>
<h2>Câu hỏi thường gặp</h2>
<h3>Tôi có thể lưu dữ liệu game ở định dạng nào?</h3>
<p>Bài viết sử dụng định dạng ConfigFile vì tính gọn nhẹ.  Bạn cũng có thể dùng các định dạng khác như data, ini, abc, jqk, cfg, file, &#8230;</p>
<h3>Làm thế nào để mã hóa dữ liệu game khi lưu?</h3>
<p>Bài viết không đề cập chi tiết về mã hóa, nhưng gợi ý rằng việc mã hóa có thể được thực hiện để ngăn chặn người dùng chỉnh sửa dữ liệu game.</p>
<h3>Dữ liệu game được lưu ở đâu?</h3>
<p>Dữ liệu game được lưu trong thư mục Project Data của dự án Godot. Bạn có thể tìm thấy nó bằng cách vào Project -> Open Project Data Folder.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-29-luu-va-load-du-lieu-game/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-28-them-am-thanh-giao-dien/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-28-them-am-thanh-giao-dien/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Wed, 08 Dec 2021 02:32:21 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[thiết kế game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=37431</guid>

					<description><![CDATA[Trong phần này mình sẽ hướng dẫn bạn cách thêm âm thanh khi nhấn vào các nút trên giao diện,vv. Âm thanh  Lấy âm thanh Để lấy âm thanh thì ở đây mình sẽ không cần đưa bạn link tải, bạn chỉ cần vô Asset lib tìm Kenney là nó sẽ ra. Bạn có thể [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này mình sẽ hướng dẫn bạn cách thêm âm thanh khi nhấn vào các nút trên giao diện,vv.</p>
<h2>Âm thanh</h2>
<h3> Lấy âm thanh</h3>
<p>Để lấy âm thanh thì ở đây mình sẽ không cần đưa bạn link tải, bạn chỉ cần vô Asset lib tìm Kenney là nó sẽ ra.</p>
<p><img decoding="async" class="aligncenter  size-medium" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-38-07-300x205.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện" width="300" height="205" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 32"></p>
<p>Bạn có thể chọn 1 trong 2 cái đều được.<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-38-46-300x200.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 21" width="300" height="200" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 33"></p>
<p>Rồi nhấn download để tải nó xuống.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-39-45-300x150.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 22" width="300" height="150" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 34"></p>
<p>Tải xong rồi thì bạn nhấn vào Install để cài đặt.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-39-54.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 23" width="156" height="109" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 35"></p>
<p>Nó sẽ hiện lên 1 giao diện hiển thị địa chỉ của addon đó rồi nhấn Install</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-40-18.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 24" width="136" height="86" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 36"></p>
<p>Sau đó 1 thư mục mới đc tạo tên addons và nó chứa âm thành mà mình vừa cài ở trong đó</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-40-46.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 25" width="278" height="152" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 37"></p>
<p>Về các file âm thanh nó cũng được ghi thêm tên đằng trước để bạn có thể nhận biết nên xài cái nào và cái nào.</p>
<h3>Thêm vào scene</h3>
<p>Sau khi cài đặt thành công thì mình tiến hành thêm nó vào game.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-44-15-300x214.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 26" width="300" height="214" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 38"></p>
<p>Kiếm cho mình node AudioStreamPlayer2D<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-44-43-300x135.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 27" width="300" height="135" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 39"></p>
<p>&nbsp;</p>
<p>Ở đây mình đang add vào scene Menu.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-46-05.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 28" width="221" height="159" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 40"><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-46-51.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 29" width="265" height="80" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 41"><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-46-38.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 30" width="267" height="120" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 42"></p>
<p>Ở đây mình đang làm Audio khi nhấn vào nút Bắt đầu cho nên mình sẽ tìm sound có tên click và kéo nó vào dòng Stream của Audio Stream Player 2D.</p>
<p>Sau khi kéo xong thì bạn có thể gọi nó ở trong code với hàm play()</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Control
func _on_NutBatDau_pressed():
    $AudioStreamPlayer2D.play()
    yield(get_tree().create_timer(0,1),"timeout")
    get_tree().change_scene("res://Scences/Map/LevelMap.tscn")
    pass # Replace with function body.
func _on_NutThoatGame_pressed():
    get_tree().quit()
    pass # Replace with function body.
</pre>
<p>Dòng code ở trên mình thêm dòng <code class="EnlighterJSRAW" data-enlighter-language="generic">$AudioStreamPlayer2D.play()</code> là mình sẽ chạy cái âm thanh khi bấm nút bắt đầu</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">yield(get_tree().create_timer(0,1),"timeout")</code>: là mình tạo 1 cái timer với thời gin 0,1s sau khi hết 0,1s nó mới chạy lệnh change_scene(). Ở đây, mình dùng lệnh này là bởi vì khi mình nhấn chỉ thêm dòng play() rồi change_scene nó sẽ không chạy âm thanh ( tuỳ máy có máy không) nên là mình sẽ thêm lệnh yield để sau khi nó chạy âm thanh rồi mới change scene.</p>
<p>Bạn có thể không cần thêm yield() nếu như cái bạn muốn chạy âm thanh không cần phải change scene.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-01-00-09.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 31" width="244" height="123" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 43"></p>
<p>Mình sẽ làm thêm 1 cái nữa ở scene PauseMenu.<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/25-11-2021-12-56-56.png" alt="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 32" width="276" height="118" title="[Tạo 2D Platformer Game với Godot] Phần 28: Thêm âm thanh giao diện 44"></p>
<p>Bạn thêm âm thanh vào.</p>
<p>Sau đó ở hàm hiện âm thanh menu mình có:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_HienPauseMenu_pressed():
    
    get_node("AudioStreamPlayer2D").play()
    $PauseMenu.show()
    get_tree().paused = true
    pass # Replace with function body.
</pre>
<p>Rồi sau khi bạn nhấn và chạy thử sẽ thấy nó có âm thanh click khi nhấn vào.</p>
<h2>Tổng Kết</h2>
<p>Vậy trong phần này mình đã hướng dẫn bạn cách để thêm âm thanh vào trong game.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Tôi tải âm thanh từ đâu?</h3>
<p>Bạn có thể tìm và tải âm thanh miễn phí từ Kenney.nl trên AssetLib của Godot.</p>
<h3>Làm thế nào để thêm âm thanh vào nút trong giao diện?</h3>
<p>Thêm một nút AudioStreamPlayer2D vào scene của bạn. Kéo thả file âm thanh vào thuộc tính &#8220;Stream&#8221; của nút.  Gọi hàm `play()` của nút AudioStreamPlayer2D trong hàm xử lý sự kiện nhấn nút (ví dụ: `_on_NutBatDau_pressed()`).</p>
<h3>Tôi cần sử dụng lệnh `yield()` khi chơi âm thanh không?</h3>
<p>Bạn chỉ cần sử dụng `yield()` nếu bạn cần đảm bảo âm thanh được phát hoàn toàn trước khi thực hiện các hành động khác, đặc biệt là khi chuyển scene.  Nếu không cần chuyển scene, bạn có thể bỏ qua lệnh này.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-28-them-am-thanh-giao-dien/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-27-mo-khoa-level/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-27-mo-khoa-level/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Tue, 07 Dec 2021 05:32:20 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[thiết kế game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=37422</guid>

					<description><![CDATA[Trong phần này mình sẽ hướng dẫn bạn cách để có thể mở khoá level kế tiếp sau khi hoàn thành level trước đó. Chứ không phải là bạn thích nhấn vô level nào là chơi level đó. Unlock level Thuật toán Về phần này thì mình sẽ có thuật toán như sau: + Mình [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này mình sẽ hướng dẫn bạn cách để có thể mở khoá level kế tiếp sau khi hoàn thành level trước đó.</p>
<p>Chứ không phải là bạn thích nhấn vô level nào là chơi level đó.</p>
<h2>Unlock level</h2>
<h3>Thuật toán</h3>
<p>Về phần này thì mình sẽ có thuật toán như sau:</p>
<p>+ Mình sẽ thêm 1 biến ở PlayerData để lưu trữ dữ liêu là đã mở khoá map nào, có cấu trúc như bên dướ:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">var Unlocked_map = {
    "Map1": false,
    "Map2":false,
    "Map3":false,
}</pre>
<p>+ Sau đó ở KhuVucDiChuyen sau khi Player đã đến đó tức là thắng game rồi ý thì mình sẽ set Map đang chơi ở biến Unlocked_map thành true</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_KhuVucDiChuyen_body_entered(body):
        PlayerData.Unlocked_map[get_parent().name] = true
</pre>
<p>+ Sau đó, ở scene Level mình sẽ check nếu như nhấn vào cái Level đó và cái Level đó nếu như là Map1 thì nó sẽ chơi Map1 vì đây là map đầu tiên mình cần chơi mà.</p>
<p>+ Rồi tiếp đó nếu như không phải Map1 tức là bạn đã nhấn vào Level 2 trở lên rồi mình kiểm tra nếu như Map trước Map mà bạn nhấn vào đã hoàn thành thì sẽ chuyển sang chơi Map đó.</p>
<p>VD: Nếu mình chưa chơi Map1 thì Unlocked_map[&#8220;Map1&#8221;] đang = false, mình nhấn vào Level 2 rồi Level2 kiểm tra nếu như Unlocked_map[&#8220;Map1&#8221;] đang = false thì tức là bạn chưa hoàn thành nó và chưa thể chơi level2 và ngược lại.</p>
<h3>PlayerData</h3>
<p>&nbsp;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Node


var diemso = {
    "Map1": 0,
    "Map2":0,
    "Map3": 0,
}
var Unlocked_map = {
    "Map1": false,
    "Map2":false,
    "Map3":false,
}


</pre>
<p>Mình add thêm 1 từ điển chứa dữ liệu các map đã mở khoá.</p>
<h3>KhuVucDiChuyen</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Area2D


export (String,FILE) var LevelKeTiep
onready var endlevelmenu = get_parent().get_node("EndLevelMenu")

func _on_KhuVucDiChuyen_body_entered(body):
    if body.name == "Player":
        endlevelmenu.get_node("EndLevelMenu").show()	
        get_tree().paused = true
        PlayerData.Unlocked_map[get_parent().name] = true
</pre>
<p>Khu vực di chuyển thì mình bỏ thêm 1 dòng nữa ở cuối.</p>
<p>Và nếu như bạn để ý trong phần trước mình có để mấy dòng code thêm điểm số, nhưng mà để thêm điểm số vào PlayerData thì nó lại phải bấm 1 trong 2 nút. Vậy, nếu như người chơi vừa đi vào và hiên menu chiến thắng xong out game thì sao? Thì chắc chắn là phải chơi lại từ đầu rồi.</p>
<p>+ Cho nên mình sẽ đặt 1 bài tập nho nhỏ ở đây là chuyển dòng code thêm điểm số vào PlayerData ở EndLevelMap qua KhuVucDiChuyen.</p>
<h3>Level Scene</h3>
<p>Ở Scene level thì mình chỉ thêm code vào hà Hinhtron_pressed():</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_HinhTron_pressed():
    var level_truocdo = int(Level) - 1
    if MapName != "Map1":
        if PlayerData.Unlocked_map["Map"+ str(level_truocdo)] == true :
            get_tree().change_scene(Scene)
    else: 
        get_tree().change_scene(Scene)
</pre>
<p>Mình tạo thêm 1 biến level_truocdo và mình thêm int() ở Level là vì cái biến Level đang được khai báo là String nếu như bạn không thêm int vào thì nó sẽ là String &#8211; Integer và gây ra lỗi.</p>
<h3>Kết quả</h3>
<p><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-17-23.png" alt="[Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level" width="287" height="208" title="[Tạo 2D Platformer Game với Godot] Phần 27: Mở khoá level 46"></p>
<p>Bây giờ nếu bạn chạy game và bấm vào level sẽ thấy là nó không chuyển qua scene level 2 nữa mà phải hoàn thành level 1.</p>
<p>Vì cái này mình không biết nên lấy hình ảnh kiểu gì cho bạn xem nên là đọc chay nha @@.</p>
<h2>Tổng Kết</h2>
<p>Ở phần này mình đã hướng dẫn bạn cách để có thể thêm tính năng mở khoá level rồi nhé. Ở phần sau thì sẽ add âm thanh.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm sao để lưu trữ thông tin level đã mở khoá?</h3>
<p>Sử dụng một biến từ điển (dictionary) trong PlayerData, ví dụ:  <code>Unlocked_map = {"Map1": false, "Map2": false, "Map3": false}</code>.  Mỗi key là tên level, và value là boolean (true nếu đã mở khoá, false nếu chưa).</p>
<h3>Khi nào thì một level được đánh dấu là đã mở khoá?</h3>
<p>Khi người chơi hoàn thành level (ví dụ, chạm vào vùng &#8220;KhuVucDiChuyen&#8221;),  giá trị tương ứng trong <code>Unlocked_map</code> sẽ được cập nhật thành <code>true</code>.</p>
<h3>Làm thế nào để kiểm tra xem người chơi có thể chơi level tiếp theo hay không?</h3>
<p>Trước khi chuyển sang level tiếp theo, kiểm tra xem level trước đó (level_truocdo) đã được mở khoá hay chưa (<code>PlayerData.Unlocked_map["Map" + str(level_truocdo)] == true</code>).  Nếu chưa, không cho phép chuyển scene.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-27-mo-khoa-level/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-26-them-diem-so-khi-het-game/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-26-them-diem-so-khi-het-game/#comments</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Tue, 30 Nov 2021 08:31:20 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[thết kế game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=37383</guid>

					<description><![CDATA[Trong phần này thì mình sẽ hướng dẫn bạn cách để thêm điểm số vào cái LevelMap để nó có thể cập nhật số sao sau khi hết game. Điểm số Cách giải quyết Về cách xử lý vấn đề của phần này thì mình sẽ giải thích như sau: + Đầu tiên mình sẽ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này thì mình sẽ hướng dẫn bạn cách để thêm điểm số vào cái LevelMap để nó có thể cập nhật số sao sau khi hết game.</p>
<h2>Điểm số</h2>
<h3>Cách giải quyết</h3>
<p>Về cách xử lý vấn đề của phần này thì mình sẽ giải thích như sau:</p>
<p>+ Đầu tiên mình sẽ cần 1 script và script đó có thể được truy cập vào mọi nơi, script này sẽ chịu trách nhiệm cho việc lưu trữ dữ liệu cụ thể ở đây là điểm số của từng map.</p>
<p>+ Mình sẽ tính điểm số đạt được của 1 map ở trong script của EndLevelMenu, điểm số này nếu muốn tính sẽ cần có: (số đồng xu đã thu thập được / tổng số đồng xu trong map ) * 100.</p>
<p>+ Để lấy được tổng số đồng xu thì mình sẽ thêm cái scene đồng xu vào 1 group gọi là dongxu và mình có hàm get_tree().get_nodes_in_group(&#8220;dongxu) sẽ cho phép mình lấy tất cả số đông xu đang có trên scene và hàm này sẽ trả về kiểu array.</p>
<p>+ Rồi ở LevelMap mấy child Level1,2,.. mình sẽ gán biến SoDiem đã làm ở phần trước bằng với điểm số ở trong script chứa dữ liêu.</p>
<h3>Autoload script</h3>
<p>Đây là 1 tính năng của Godot cho phép bạn biến 1 script nào đó thành script autoload tức là nó luôn luôn chạy cho dù bạn đang ở bất kỳ scene nào và có thể được truy cập ở mọi nơi.</p>
<p><img decoding="async" class="aligncenter  size-medium" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-50-21-300x269.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Thêm điểm số khi hết game" width="300" height="269" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 64"></p>
<p>Bạn tao cho mình 1 script mới tên là PlayerData ở Scenes</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-50-39-300x74.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 49" width="300" height="74" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 65"></p>
<p>Rồi vô Project -&gt; project settings -&gt; Autoload</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-50-52-300x47.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 50" width="300" height="47" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 66"></p>
<p>Nhấn vô icon thư mục.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-51-07-300x184.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 51" width="300" height="184" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 67"></p>
<p>Tìm script vừa tạo<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-51-27-300x16.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 52" width="300" height="16" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 68"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-51-44-300x18.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 53" width="300" height="18" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 69">Nhấn vô add và bạn sẽ thấy nó hiển thị ở ô bên dưới.</p>
<h3>Add group scene đồng xu</h3>
<h3><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-54-30-300x96.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 54" width="300" height="96" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 70"></h3>
<p>Qua scene đồng xu</p>
<h3><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-54-41.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 55" width="283" height="129" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 71"></h3>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-55-05.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 56" width="294" height="122" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 72"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-55-16-300x148.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 57" width="300" height="148" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 73">Ở bên phải bên cạnh signals bạn nhán vô group rồi gõ tên group -&gt; nhấn add để thêm node vô group</p>
<h3>Map</h3>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-58-01-300x168.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 58" width="300" height="168" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 74"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-58-10-300x130.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 59" width="300" height="130" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 75"></p>
<p>Ở scene Map1 mình sẽ add thêm 1 Node2D để chứa các node DongXu để nhìn cho nó gọn.</p>
<p>Rồi mình chỉnh sao cho dễ để thu thập</p>
<p>Bạn chỉnh đồng xu bao nhiêu là tuỳ bạn nhé không nhất thiết phải giống mình.</p>
<h3>Player</h3>
<p>Ở script của Player bạn chỉ cần thêm cho mình 1 biến đó là:</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">onready var max_dongxu = get_tree().get_nodes_in_group("dongxu")</code></p>
<p>Biến này mình dùng để xác định tổng số lượng đồng xu có trong map.</p>
<h3>PlayerData</h3>
<p>Ở Script autoload Playerdata mà mình vừa tạo trên nãy thì mình thêm 1 biến thuộc Dictonary tên là điểm số và nó có trách nhiệm là mang điểm số của từng map.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Node


var diemso = {
    "Map1": 0,
    "Map2":0,
    "Map3:": 0,
}


</pre>
<h3>EndLevelMenu</h3>
<p>&nbsp;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends CanvasLayer



onready var level = get_parent().get_node("KhuVucDiChuyen")
onready var map = get_parent().name
onready var player = get_parent().get_node("Player")
var diemso 
func _on_NutLevelKeTiep_pressed():
    get_tree().paused = false
    get_tree().change_scene(level.LevelKeTiep)
    diemso = int(( float(player.dongxu) /player.max_dongxu) * 100)
    if diemso &gt; PlayerData.diemso[map]: 
        PlayerData.diemso[map] = diemso
    pass # Replace with function body.

func _on_NutChoiLai_pressed():
    get_tree().paused = false
    get_tree().reload_current_scene()
    print("choi lai")
    pass # Replace with function body.


func _on_NutVeMenu_pressed():
    get_tree().paused = false
    get_tree().change_scene("res://Scences/Map/LevelMap.tscn")
    diemso = int(( float(player.dongxu) /player.max_dongxu.size()) * 100)
    if diemso &gt; PlayerData.diemso[map]: 
        PlayerData.diemso[map] = diemso
    pass # Replace with function body.
</pre>
<p>Ở đây, mình khai báo thêm 3 biến là:</p>
<p>+ map: để mình xác định được tên của map mình đang chơi.</p>
<p>+ player: để mình có thể lấy được số lượng đồng xu đã thu thập và tổng số đồng xu trong map.</p>
<p>+ diemso: tính điểm số mà bạn đạt được.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_NutLevelKeTiep_pressed():
    get_tree().paused = false
    get_tree().change_scene(level.LevelKeTiep)
    diemso = int(( float(player.dongxu) /player.max_dongxu) * 100)
    if diemso &gt; PlayerData.diemso[map]: 
        PlayerData.diemso[map] = diemso</pre>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">diemso = int(( float(player.dongxu) /player.max_dongxu) * 100)</code>: là công thức mình tính điểm số.</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">if diemso &gt; PlayerData.diemso[map]:</code> là mình check nếu như diemso của màn này mà lớn hơn điểm số đã có sẵn thì nó sẽ thêm điểm số này vào và ngược lại.</p>
<p>Mình sẽ làm tương tự như bên hàm NutVeMenu vì khi bạn show cái EndLevelMenu là bạn đã hoàn thành nó rồi cho nên thoát ra hay chơi tiếp đều tính và nếu như nhấn chơi lại thì không.</p>
<h3>Level Script</h3>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-08-18-300x80.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 60" width="300" height="80" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 76"></p>
<p>Bạn qua cho mình cái scene Level ở LevelMap ấy.</p>
<p>Và ở hàm _process mình thêm 1 dòng để cập nhật điểm số.</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">SoDiem = PlayerData.diemso[MapName]</code></p>
<p>Mình sẽ có full code như bên dưới:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Control

export (String) var MapName
export (String,FILE) var Scene
export (String) var Level
onready var ngoisaovang = preload("res://Assets/LevelMap/3 UI/Star1.png")
var SoDiem = 0

func _ready():
    $SoLevel.text = Level
func _process(delta):
    SoDiem = PlayerData.diemso[MapName]
    if SoDiem &gt;= 1 and SoDiem &lt;= 30:
        $NgoiSao1.texture = ngoisaovang
    elif SoDiem &gt;= 30 and SoDiem &lt;= 95:
        $NgoiSao1.texture = ngoisaovang
        $NgoiSao2.texture = ngoisaovang
    elif SoDiem &gt;= 95:
        $NgoiSao1.texture = ngoisaovang
        $NgoiSao2.texture = ngoisaovang
        $NgoiSao3.texture = ngoisaovang


func _on_HinhTron_pressed():
    get_tree().change_scene(Scene)
    pass # Replace with function body.
</pre>
<h3>Kết quả</h3>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-11-14.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 61" width="247" height="189" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 77"></p>
<p>Vậy sau khi thu thập hết đồng xu mình thêm vào và quay về Level Mênu mình sẽ được 3 sao.</p>
<h3>Lưu ý</h3>
<p>Ở cái Menu ấy, bạn chỉnh code chỗ nút Bắt đầu, cái change_scene thành cái scene Level Map nha.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-14-51-300x49.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 62" width="300" height="49" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 78"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-15-05.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 63" width="183" height="102" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 79"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/24-11-2021-12-15-57-300x40.png" alt="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 64" width="300" height="40" title="[Tạo 2D Platformer Game với Godot] Phần 26: Thêm điểm số khi hết game 80"></p>
<h2>Tổng Kết</h2>
<p>Vậy là mình đã hướng dẫn xong bạn cách thêm số sao đạt được rồi, trong phần tiếp mình sẽ hướng dẫn bạn cách để khoá level lại và unlock level kế tiếp.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm thế nào để lưu trữ điểm số của mỗi màn chơi?</h3>
<p>Sử dụng một Autoload script (ví dụ: PlayerData) chứa một dictionary để lưu trữ điểm số của từng màn chơi (ví dụ: {&#8220;Map1&#8221;: 0, &#8220;Map2&#8221;: 0, &#8230;}).  Điểm số sẽ được cập nhật sau khi kết thúc mỗi màn.</p>
<h3>Điểm số được tính toán như thế nào?</h3>
<p>Điểm số được tính bằng công thức:  (số đồng xu thu thập được / tổng số đồng xu trong màn) * 100.  Chỉ khi điểm số hiện tại cao hơn điểm số đã lưu của màn chơi đó thì điểm số mới được cập nhật.</p>
<h3>Tôi cần thêm các nhóm đối tượng nào vào trong project?</h3>
<p>Cần thêm một nhóm đối tượng (group) tên là &#8220;dongxu&#8221; để quản lý các đồng xu trong mỗi màn chơi.  Việc này giúp dễ dàng truy xuất và đếm số lượng đồng xu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-26-them-diem-so-khi-het-game/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-25-tao-menu-khi-het-level/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-25-tao-menu-khi-het-level/#comments</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Mon, 29 Nov 2021 08:31:19 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[thiết kế game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=37363</guid>

					<description><![CDATA[Trong phần này, mình sẽ hướng dẫn bạn cách để tạo menu khi ban chơi xong một level và nó sẽ có thể di chuyển sang level kế tiếp, chơi lại và quay về menu Level Map. &#160; Menu khi hết level Copy Scene Thì thay vì phải tạo lại từ đầu, bạn có thể [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này, mình sẽ hướng dẫn bạn cách để tạo menu khi ban chơi xong một level và nó sẽ có thể di chuyển sang level kế tiếp, chơi lại và quay về menu Level Map.</p>
<p>&nbsp;</p>
<h2>Menu khi hết level</h2>
<h3>Copy Scene</h3>
<p>Thì thay vì phải tạo lại từ đầu, bạn có thể duplicate 1 scene mới từ scene pause menu.</p>
<p><img decoding="async" class="aligncenter  size-medium" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-35-56-300x157.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level" width="300" height="157" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 95"></p>
<p>Bạn tìm pause menu ở filesystem chuột phải nhấn duplicate</p>
<p style="text-align: center;"><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-36-15-300x132.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 78" width="300" height="132" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 96"></p>
<p style="text-align: center;"><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-36-50-300x125.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 79" width="300" height="125" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 97"></p>
<p>&nbsp;</p>
<p>Mình sẽ rename nó lại là EndLevelMenu<br />
<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-38-38-295x300.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 80" width="295" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 98"></p>
<p>&nbsp;</p>
<p>Rồi bạn xoá mấy node kia và chừa lại như hình, mình đổi tên luôn NutTepTuc thành LevelKeTiep</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-47-15.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 81" width="282" height="247" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 99"></p>
<p>&nbsp;</p>
<p>Chỉnh lại text ở TieuDe<br />
<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-38-58-300x78.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 82" width="300" height="78" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 100"></p>
<p>Bạn sẽ clear cái script cũ đi bằng cách nhấn nút có cái tờ giấy mà có dấu x<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-39-41-300x65.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 83" width="300" height="65" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 101"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-39-50-300x267.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 84" width="300" height="267" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 102"></p>
<p>Sau đó tạo cái mới.<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-40-15-157x300.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 85" width="157" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 103"></p>
<p>Rồi 3 cái nút thì bạn disconnect đi vì nó đang kết nối với script cũ.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-46-34-300x223.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 86" width="300" height="223" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 104"></p>
<p>Rồi connect lại 3 cái mới.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-52-50-295x300.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 87" width="295" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 105"></p>
<p>Rồi Instance EndLevelMenu vào Map.</p>
<p>Rồi các bạn nhớ là hide cái EndLevelMenu mà thuộc loại Control Node đi ấy.</p>
<h3>Script</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends CanvasLayer



onready var level = get_parent().get_node("KhuVucDiChuyen")

func _on_NutLevelKeTiep_pressed():
    get_tree().paused = false
    get_tree().change_scene(level.LevelKeTiep)
    pass # Replace with function body.

func _on_NutChoiLai_pressed():
    get_tree().paused = false
    get_tree().reload_current_scene()
    print("choi lai")
    pass # Replace with function body.


func _on_NutVeMenu_pressed():
    get_tree().paused = false
    get_tree().change_scene("res://Scences/Map/LevelMap.tscn")
    pass # Replace with function body.
</pre>
<p>Đây là đoạn code của script EndLevelMenu.</p>
<p>2 tín hiệu của nút chơi lại và về menu mình sẽ giữ nguyên.</p>
<p>Đối vơi LevelKeTiep để tiết kiệm thời gian thay vì mình phải tự setup coi nó di chuyển đến level nào kế tiếp thì mình sẽ lấy nó luôn. Ở node KhuVucDiChuyen mình đã có tạo 1 biến là LevelKeTiep và nó mang dữ liệu của scene kế tiếp nên là mình sẽ gọi cái biến đó thay vì làm thủ công.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-10-57-26-280x300.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 88" width="280" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 106"></p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">onready var level = get_parent().get_node("KhuVucDiChuyen")</code>: là mình khai báo xong gán nó bằng nút parent của EndLevelMenu ( như trên ảnh) và từ nút parent đó mình có thể truy cập vào node KhuVucDiChuyen để lấy dữ liệu của biến LevelKeTiep.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Area2D


export (String,FILE) var LevelKeTiep
onready var endlevelmenu = get_parent().get_node("EndLevelMenu")

func _on_KhuVucDiChuyen_body_entered(body):
    if body.name == "Player":
#		get_tree().change_scene(LevelKeTiep)
        endlevelmenu.get_node("EndLevelMenu").show()
        get_tree().paused = true
</pre>
<p>Ở phần script của KhuVucDIChuyen mình có đổi lại 1 xíu.</p>
<p>Ở đây, thay vì là di chuyển sang level kế tiếp như thường lệ thì mình sẽ cho nó hiển thị cái EndLevelMenu lên và sau đó thì dừng tree lại như ở pausemenu.</p>
<p>Nếu bạn nào thắc mắc tại sao mình lại get_node() 2 cái EndLevelMenu thì hãy nhìn vào như hình dưới.<img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-07-38-300x61.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 89" width="300" height="61" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 107"></p>
<p>Mình gọi 2 cái EndLevelMenu là vì mình có 2 node đó :).</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/23-11-2021-11-13-02.png" alt="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 90" width="218" height="220" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 108"></p>
<p>Và đây là kết quả của mình</p>
<h2>Tổng Kết</h2>
<p>Trong phần tiếp, mình sẽ hướng dẫn bạn cách để thống kê điểm số sau khi thu thập đồng xu và khi ra ngoài LevelMap bạn sẽ có được số sao tương ứng với số điểm.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm sao để tạo menu khi hết level trong Godot?</h3>
<p>Bạn có thể tạo một menu mới bằng cách sao chép (duplicate) scene của menu tạm dừng (pause menu), chỉnh sửa nội dung và script cho phù hợp. Sau đó, instance menu này vào scene của level và hiển thị khi người chơi hoàn thành level.</p>
<h3>Script nào được sử dụng để điều khiển menu khi hết level?</h3>
<p>Script sử dụng các hàm `_on_NutLevelKeTiep_pressed()`, `_on_NutChoiLai_pressed()`, và `_on_NutVeMenu_pressed()` để xử lý các sự kiện nhấn nút &#8220;Level Kế Tiếp&#8221;, &#8220;Chơi Lại&#8221; và &#8220;Về Menu&#8221;.  Script khác được sử dụng để kích hoạt hiển thị menu khi người chơi hoàn thành level.</p>
<h3>Làm thế nào để chuyển sang level kế tiếp từ menu khi hết level?</h3>
<p>Script sử dụng `get_tree().change_scene()` để chuyển đến scene level kế tiếp.  Thông tin về scene level kế tiếp được lưu trữ trong biến `LevelKeTiep` trong một node khác của scene level hiện tại.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-25-tao-menu-khi-het-level/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-24-tao-pause-menu/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-24-tao-pause-menu/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Sun, 28 Nov 2021 08:31:18 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[thiết kế game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=37283</guid>

					<description><![CDATA[Trong phần này, mình sẽ hướng dẫn bạn các để tạo 1 cái pause menu khi đang chơi game và nhấn vào pause sau đó thì game dừng lại và bạn có thể chơi tiếp, chơi lại, thoát. Và tạo menu khi kết thúc game nó gồm: Level kế tiếp, Chơi lại, thoát ra ngoài [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này, mình sẽ hướng dẫn bạn các để tạo 1 cái pause menu khi đang chơi game và nhấn vào pause sau đó thì game dừng lại và bạn có thể chơi tiếp, chơi lại, thoát.</p>
<p>Và tạo menu khi kết thúc game nó gồm: Level kế tiếp, Chơi lại, thoát ra ngoài menu.</p>
<h2>Pause Menu</h2>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-01-40.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 131" width="326" height="90" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 149"></p>
<p>&nbsp;</p>
<p>Mình add CanvasLayer là node gốc và rename là PauseMenu</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-02-35.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 132" width="284" height="120" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 150"></p>
<p>Vì nó khá nhỏ nên mình chỉnh min size lên.<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-02-41.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 133" width="236" height="199" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 151"></p>
<p>&nbsp;</p>
<p>Nó đã to hơn khi chỉnh min size là và ở ô text mình thêm 2 dấu | |</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-03-29.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 134" width="297" height="311" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 152"></p>
<p>Sau đó thì mình add thêm cái Custom Font cho nó đẹp.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-04-37.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 135" width="241" height="463" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 153"></p>
<p>Color id: a77322</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-04-44.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 136" width="236" height="153" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 154"></p>
<p>Rồi làm thêm cái custom Styles cho nó vừa mắt.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-04-52.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 137" width="428" height="314" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 155"></p>
<p>Và mình có kết quả như trên<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-08-57.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 138" width="334" height="128" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 156"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-09-07.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 139" width="330" height="81" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 157"></p>
<p>&nbsp;</p>
<p>Mình thêm cái Control node mới và rename nó lại là PauseMenu và thêm cái Panel để làm Background sau đó rename nó lại.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-09-14.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 140" width="530" height="323" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 158"></p>
<p>Sau đó căn chỉnh ra giữa<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-09-27.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 141" width="291" height="340" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 159"></p>
<p>Mình tạo cái Custom styles mới.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-10-55.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 142" width="259" height="458" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 160"></p>
<p>Color: a89d24<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-11-07.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 143" width="249" height="224" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 161"></p>
<p>Ở trên là thông số.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-13-46.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 144" width="325" height="101" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 162"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-13-58.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 145" width="144" height="491" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 163"></p>
<p>Bạn thêm node MarginConTainer ở dưới Background.</p>
<p>Mình sử dụng margincontainer là để căn lề cho nó đẹp mắt.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-14-15.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 146" width="640" height="326" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 164"></p>
<p>Chọn Full rect</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-14-43.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 147" width="267" height="171" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 165"></p>
<p>Sau đó Theme Overriides -&gt; Constants các bạn điền khoảng là 10 và tuỳ chỉnh theo game của bạn.<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-16-30.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 148" width="286" height="114" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 166"></p>
<p>&nbsp;</p>
<p>Add thêm cái Vboxcontainer</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-16-39.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 149" width="399" height="375" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 167"></p>
<p>Add xong bạn sẽ thấy Vboxcontainer bị thụt vào trong 10mm từ margincontainer.</p>
<p style="text-align: center;"><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-18-38.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 150" width="295" height="86" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 168"></p>
<p>Add thêm cái Label rename là TieuDe</p>
<p style="text-align: center;"><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-19-17.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 151" width="292" height="175" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 169"></p>
<p style="text-align: center;"><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-19-22.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 152" width="456" height="136" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 170"></p>
<p>Chỉnh align là Center để căn giữa</p>
<p>&nbsp;</p>
<p style="text-align: center;"><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-19-49.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 153" width="264" height="281" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 171"></p>
<p>Add thêm cái custom fonts cho nó đẹp mắt<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-20-32.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 154" width="451" height="110" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 172"></p>
<p>Kết quả như trên.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-24-07.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 155" width="260" height="211" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 173"></p>
<p>Mình add thêm 3 nút như ảnh và 3 Ninepatchrect làm khoảng trống.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-28-21.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 156" width="386" height="402" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 174"></p>
<p>Rồi các bạn add custom fonts và custom styles cho button.</p>
<p>Bạn có thể add hoặc không add đều được.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-29-23.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 157" width="324" height="519" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 175"></p>
<p>Bạn save scene lại</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-30-49-300x66.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 158" width="300" height="66" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 176"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-31-03-300x245.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 159" width="300" height="245" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 177"></p>
<p>Add thêm cái script ở node PauseMenu</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-34-25-300x238.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 160" width="300" height="238" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 178"></p>
<p>Rồi connect 4 cái signal của 4 nút vào.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-49-07-300x77.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 161" width="300" height="77" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 179"></p>
<p>Rồi hide cái pause menu đi vì mình chỉ hiện nó khi mà mình bấm nút hiện thôi.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_NutTiepTuc_pressed():
    get_tree().paused = false
    $PauseMenu.hide()
</pre>
<p>Code ở nút tiếp tục.</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">get_tree().paused = false</code> : mình sẽ bảo cái tree là tiếp tục hoạt động.</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">$PauseMenu.hide()</code> : mình sẽ ẩn cái PauseMenu đi vì mình muốn tiếp tục chơi game.</p>
<p>&nbsp;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_NutChoiLai_pressed():
	get_tree().paused = false
	get_tree().reload_current_scene()
	pass # Replace with function body.

</pre>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">get_tree().reload_current_scene()</code> : mình sẽ kêu cái tree chạy lại cái scene.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_NutVeMenu_pressed():
    get_tree().paused = false
    get_tree().change_scene("res://Scences/Map/LevelMap.tscn")
    pass # Replace with function body.
</pre>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">get_tree().change_scene("res://Scences/Map/LevelMap.tscn")</code>: là mình sẽ di chuyển sang scene Level Map.</p>
<p>&nbsp;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _on_HienPauseMenu_pressed():
    $PauseMenu.show()
    get_tree().paused = true
    pass # Replace with function body.</pre>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">$PauseMenu.show()</code> : là mình sẽ hiển thị cái PauseMenu lên vì nó đang ẩn.</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">get_tree().paused = true</code> :là mình sẽ gọi cái tree hiện tại và kêu nó dừng lại. Khi dừng lại là mọi node trên tree sẽ ngưng hoạt động.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends CanvasLayer



func _on_NutTiepTuc_pressed():
    get_tree().paused = false
    $PauseMenu.hide()



func _on_NutChoiLai_pressed():
    get_tree().paused = false
    get_tree().reload_current_scene()
    pass # Replace with function body.


func _on_NutVeMenu_pressed():
    get_tree().paused = false
    get_tree().change_scene("res://Scences/Map/LevelMap.tscn")
    pass # Replace with function body.


func _on_HienPauseMenu_pressed():
    $PauseMenu.show()
    get_tree().paused = true
    pass # Replace with function body.
</pre>
<p>Vậy mình sẽ có full code là như này.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-01-55-27-198x300.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 162" width="198" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 180"></p>
<p>Và ở PauseMenu bên Inspector bạn cần chỉnh pause mode về Process để khi cái tree nó pause nhưng mà PauseMenu vẫn hoạt động được.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-07-57-300x293.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 163" width="300" height="293" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 181"></p>
<p>Sau đó Instance vào Map.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-07-33.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 164" width="283" height="258" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 182"></p>
<p>Đây là kết quả của mình</p>
<p>&nbsp;</p>
<h3>Level Map</h3>
<p>À mình quên mất ở mấy phần trước đó là add thêm cái nút quay về ở scene Level map để quay về Menu chính.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-02-30.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 165" width="222" height="82" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 183"></p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-04-19.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 166" width="282" height="239" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 184"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-04-24.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 167" width="155" height="138" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 185"></p>
<p>Bạn thêm cái node Button rồi rename lại. Sau đó, thêm custom fonts, custom styles.</p>
<p><img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-05-04-300x72.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 168" width="300" height="72" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 186"> <img decoding="async" class="size-medium  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-05-24-300x87.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 169" width="300" height="87" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 187"></p>
<p>Tạo cho mình cái script ở Level Map.</p>
<p>Sau đó kết nối tín hiệu ở node QuayVe vào.</p>
<p>&nbsp;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Node2D


func _on_QuayVe_pressed():
    get_tree().change_scene("res://Scences/UI/Menu.tscn")
    pass # Replace with function body.
</pre>
<p>Về code mình có như trên.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-02-06-54.png" alt="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 170" width="199" height="148" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 188"></p>
<p>Và mình có kết quả như trên</p>
<h2>Tổng Kết</h2>
<p>Vậy trong phần này mình đã hướng dẫn bạn cách để có thể tạo pause menu cho game.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm thế nào để tạo một menu tạm dừng trong game Godot 2D Platformer của tôi?</h3>
<p>Bạn cần tạo một CanvasLayer, thêm các nút (buttons) và các phần tử giao diện người dùng (UI elements) khác vào đó.  Sau đó, viết script để hiển thị và ẩn menu, đồng thời điều khiển trạng thái tạm dừng của game bằng <code>get_tree().paused = true/false</code>.</p>
<h3>Tôi có cần phải sử dụng các kiểu tùy chỉnh (custom styles) và font chữ không?</h3>
<p>Không bắt buộc, nhưng sử dụng các kiểu tùy chỉnh sẽ giúp menu của bạn trông chuyên nghiệp và hấp dẫn hơn.  Bạn có thể tùy chỉnh màu sắc, phông chữ, và kích thước để phù hợp với phong cách game của bạn.</p>
<h3>Menu tạm dừng có thể thực hiện các chức năng nào ngoài tiếp tục, chơi lại và thoát?</h3>
<p>Tùy thuộc vào thiết kế game của bạn. Bạn có thể thêm các chức năng khác như chỉnh âm thanh, xem hướng dẫn,  hoặc truy cập vào menu cài đặt.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-24-tao-pause-menu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
