<?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>Godot &#8211; AnonyViet</title>
	<atom:link href="https://anonyviet.com/tag/godot/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:04:57 +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>Godot &#8211; AnonyViet</title>
	<link>https://anonyviet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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? 2"></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>[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 8"></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 9"> <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 10"></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 11"></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 12"></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 26"></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 27"></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 28"></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 29"></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 30"></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 31"></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 32"></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 33"></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 34"><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 35"><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 36"></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 37"></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 38"></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 40"></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 58"></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 59"></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 60"></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 61"></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 62"> <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 63">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 64"></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 65"></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 66"> <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 67">Ở 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 68"> <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 69"></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 70"></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 71"></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 72"> <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 73"> <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 74"></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 89"></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 90"></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 91"></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 92"></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 93"></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 94"></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 95"> <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 96"></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 97"></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 98"></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 99"></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 100"></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 101"></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 102"></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 143"></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 144"></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 145"></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 146"></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 147"></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 148"></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 149"></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 150"> <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 151"></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 152"></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 153"></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 154"></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 155"></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 156"> <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 157"></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 158"></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 159"></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 160"></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 161"></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 162"></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 163"></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 164"></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 165"></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 166"></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 167"></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 168"></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 169"></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 170"> <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 171"></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 172"></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 173"></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 174"></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 175"></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 176"></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 177"></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 178"> <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 179"></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 180"> <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 181"></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 182"></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>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-23-chon-level/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-23-chon-level/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Sat, 27 Nov 2021 08:31:17 +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=37259</guid>

					<description><![CDATA[Trong phần này mình sẽ hướng dẫn các ban tạo cái nút để chọn level kiểu như là trong Map level có mấy cái ô level 1,2,3 rồi sau đó chọn để chơi. Chọn Level Scene Bạn tạo cho mình 1 scene mới có Control là node gốc và 1 TextureButton và 3 Texturect. TextureButton [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này mình sẽ hướng dẫn các ban tạo cái nút để chọn level kiểu như là trong Map level có mấy cái ô level 1,2,3 rồi sau đó chọn để chơi.</p>
<h2>Chọn Level</h2>
<h3>Scene<img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-06-28.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level " width="353" height="201" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 203"></h3>
<p>Bạn tạo cho mình 1 scene mới có Control là node gốc và 1 TextureButton và 3 Texturect.</p>
<p>TextureButton là  mình dùng để tạo hình ành cho cái level và tiện thể check nếu được bấm vào.</p>
<p>3 cái Texture Rect là dùng để hiển thị ngôi sao.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-09-05.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 190" width="261" height="228" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 204"></p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-09-26.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 191" width="269" height="270" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 205"></p>
<p>Bạn copy cái hình tròn ở bên thư mục UI trong Level map vào TextureButton<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-09-32.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 192" width="166" height="183" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 206"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-10-02.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 193" width="282" height="162" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 207"></p>
<p>Rồi cái Texture Rect thì 3 cái kéo ngôi sao vào.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-10-56.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 194" width="198" height="202" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 208"></p>
<p>Sau đó chỉnh ngôi sao theo thứ tự từ trái qua.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-11-45.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 195" width="337" height="163" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 209"></p>
<p>Sau đó mình rename lại.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-13-32.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 196" width="347" height="199" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 210"></p>
<p>Add thêm 1 cái Label tên là SoLevel để hiển thị Level.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-13-41.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 197" width="207" height="213" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 211"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-13-52-1.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 198" width="271" height="336" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 212"></p>
<p>Mình dùng Customs Font ở phần trước.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-17-00.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 199" width="433" height="510" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 213"></p>
<p>Sau đó save scenes lại.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-17-56.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 200" width="342" height="315" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 214"></p>
<p>Rồi add thêm cho nó cái Script.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-36-26.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 201" width="310" height="62" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 215"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-36-35.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 202" width="369" height="397" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 216"></p>
<p>Sau đó connect cái signal pressed của HinhTron.</p>
<h3>Script</h3>
<p>&nbsp;</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):
    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>
<p>&nbsp;</p>
<p>Về phần code mình sẽ 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-12-29-05.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 203" width="292" height="114" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 217"></p>
<p>Ở đây mình sẽ dùng export để xuất 3 biến ra Inspector</p>
<p>Và Sodiem ở đây mình sẽ để theo thang đo 100. SoDiem ở đây sẽ được quy ra từ số sao mà bạn thu thập được khi chơi 1 level nếu đủ tất cả sao thì SoDiem là 100 và $NgoiSao1,2,3 sẽ chuyển sang màu vàng.</p>
<p>dòng có <strong>onready var </strong>là mình dùng để load <strong>trước </strong>hình ảnh của ngôi sao vàng tức là vừa chạy game thì nó load luôn còn nếu ban dùng load() là khi nào đụng tới thì nó mới load hình ảnh</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-32-42.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 204" width="343" height="153" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 218"></p>
<p>Sau đó Instance cái Level vừa tạo vào LevelMap.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-33-26.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 205" width="292" height="140" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 219"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-33-46.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 206" width="277" height="119" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 220"></p>
<p>&nbsp;</p>
<p>Bạn điền thông tin vào.</p>
<p>MapName là tên của node gốc của cái Scene ở bên dưới.</p>
<p>Scene là bạn chọn scene của level đó.</p>
<p>Level là dùng để hiển thị level.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-33-59.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 207" width="346" height="188" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 221"></p>
<p>MapName bằng tên node gốc nha.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-40-51.png" alt="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 208" width="172" height="130" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 222"></p>
<p>Và sau khi chạy game mình sẽ có kết quả nó được như trên.</p>
<p>Sau khi nhấn vào đó mình sẽ được đi chuyển tới Level 1.</p>
<h2>Tổng kết</h2>
<p>Ở trong phần sau mình sẽ hướng dẫn bạn cách để tạo menu dừng và khi chiến thăng 1 level.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm thế nào để tạo nút chọn level trong game?</h3>
<p>Bạn cần tạo một scene mới với Node gốc là Control, chứa một TextureButton (cho hình ảnh level) và ba TextureRect (cho các ngôi sao biểu thị độ hoàn thành).  Kết nối tín hiệu &#8220;pressed&#8221; của TextureButton với một hàm trong script để chuyển scene khi nút được nhấn.</p>
<h3>Script điều khiển nút chọn level hoạt động như thế nào?</h3>
<p>Script sử dụng biến `SoDiem` để theo dõi điểm số và hiển thị số sao tương ứng.  Biến `export` cho phép bạn thiết lập tên scene level, đường dẫn scene và số level từ Inspector. Hàm `_on_HinhTron_pressed()` dùng `get_tree().change_scene()` để chuyển đến scene level đã chọn.</p>
<h3>Làm sao để hiển thị sao vàng dựa trên điểm số?</h3>
<p>Script sử dụng điều kiện `if-elif-else` để kiểm tra giá trị `SoDiem`.  Tùy thuộc vào điểm số, các TextureRect (ngôi sao) sẽ được gán texture sao vàng tương ứng, cho biết mức độ hoàn thành của level.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-23-chon-level/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map.</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-22-thiet-ke-level-map/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-22-thiet-ke-level-map/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Fri, 26 Nov 2021 21:03:04 +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=37218</guid>

					<description><![CDATA[Như đã nói trong phần trước, phần này mình sẽ hướng dẫn bạn cách thiết kế cái Level Map để chọn level game. Art Bạn có thể tải tileset ở đây : Level Map Pixel Art &#124; OpenGameArt.org Sau khi tải về thì bạn copy cho mình Map_tiles.png và 2 Folders là Objects,UI vào thư [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Như đã nói trong phần trước, phần này mình sẽ hướng dẫn bạn cách thiết kế cái Level Map để chọn level game.</p>
<h2>Art</h2>
<p>Bạn có thể tải tileset ở đây : <a href="https://opengameart.org/content/level-map-pixel-art" target="_blank" rel="noopener">Level Map Pixel Art | OpenGameArt.org</a></p>
<p><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2021/11/21-11-2021-11-57-17.png" alt="[Tạo 2D Platformer Game với Godot] Phần 21: Thiết kế Level Map." width="297" height="232" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 241"></p>
<p>Sau khi tải về thì bạn copy cho mình Map_tiles.png và 2 Folders là Objects,UI vào thư mục mới tên là LevelMap ở trong Assets nha.</p>
<h2>Tilemap</h2>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/21-11-2021-11-58-57.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 226" width="309" height="108" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 242"></p>
<p>Như với cách thiết kế level ở phần 2 thì mình làm tương tự là thêm 1 scene mới tên là LevelMap và thêm tilemap vào.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/21-11-2021-11-59-51.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 227" width="191" height="99" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 243"></p>
<p>Tạo 1 tileset mới.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-00-26.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 228" width="480" height="225" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 244"></p>
<p>Rồi thêm file tileset vào.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-12-13.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 229" width="307" height="147" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 245"></p>
<p>Bạn chọn New Single Tile và chọn icon grid để hiển thị grid lên nhé</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-13-02.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 230" width="173" height="138" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 246"></p>
<p>Chọn cho mình 1 cái này<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-13-52.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 231" width="167" height="155" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 247"></p>
<p>Xong nhấn vô New Single tile 1 lần nữa và chọn cái bên dưới.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-14-27.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 232" width="215" height="296" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 248"></p>
<p>Sau khi ra bên ngoài bạn sẽ có 2 cái tile.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-17-39.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 233" width="206" height="184" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 249"></p>
<p>Rồi tạo thêm cho mình 1 tile đất như hình.<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-18-59.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 234" width="211" height="155" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 250"></p>
<p>Tạo cho mình 1 atlas tilemap và bôi trắng 3 cái ô trên.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-19-52.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 235" width="172" height="330" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 251"></p>
<p>Sau khi nhấn vào cái tile mà vừa được tạo bằng atlast nó sẽ hiện ra các ô tile trong đó.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-25-05.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 236" width="177" height="264" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 252"></p>
<p>Mình tạo thêm 1 cái atlas là biển.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-25-44.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 237" width="324" height="250" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 253"></p>
<p>Mình sẽ xoá cái single tile đi để thay thế bằng atlas cho tiên.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-26-25.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 238" width="249" height="247" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 254"></p>
<p>Mình tạo thêm 1 cái atlas là lấy full tile màu xanh.</p>
<p>Rồi bạn có thể thêm các tile khác tương tự.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-44-02.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 239" width="289" height="130" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 255"></p>
<p>Mình sẽ tạo 1 node mới và node này dùng để chứa các object khác như cây, bui cây, đá , cỏ , thuyền,vv mà bạn đã tải xuông.<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-45-00.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 240" width="288" height="199" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 256"></p>
<p>Xong sau đó thì bạn sẽ kéo thả mấy cái ảnh của object vào trong game thôi.<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/22-11-2021-12-54-08.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 241" width="499" height="549" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 257"></p>
<p>Sau đó thì ban lưu lại cho mình, mình sẽ lưu nó lại ở thư mục Map trong Scenes.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/output-onlinepngtools-1.png" alt="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 242" width="1038" height="621" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 258"></p>
<p>Và đây là kết quả của mình sau khi ngồi mày mò thiết kế.</p>
<p>Bạn không được thiết kế theo mình vì mất thời gian và lâu cho nên là nên thiết kế theo ý của bạn nhé.</p>
<h2>Tổng Kết</h2>
<p>Vậy là trong phần này mình đã hướng dẫn xong bạn cách để thiết kế tilemap cho Level Map. Nếu bạn không hiểu thì có thể tham gia Group Cộng Đồng GodotVN để được giải đáp thắc mắc cũng như thông cảm cho mình nếu như viết mà bạn đọc khó hiểu nhé, vì mình viết lúc 1h sáng nên cũng hơi lú lú.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Tôi cần chuẩn bị những gì trước khi bắt đầu thiết kế Level Map?</h3>
<p>Bạn cần tải bộ tileset từ <a href="https://opengameart.org/content/level-map-pixel-art" target="_blank" rel="noopener">Level Map Pixel Art | OpenGameArt.org</a> và đặt các file vào thư mục LevelMap trong Assets của project Godot.</p>
<h3>Làm thế nào để tạo một TileSet mới trong Godot?</h3>
<p>Trong scene LevelMap, thêm một TileMap node.  Tạo một tileset mới, thêm ảnh tileset vào, và tạo các single tile hoặc atlas tile cho các loại địa hình (đất, nước, v.v.) theo ý muốn.</p>
<h3>Tôi có thể thêm các object như cây cối, đá vào Level Map như thế nào?</h3>
<p>Tạo một node con trong TileMap để chứa các object.  Sau đó, bạn có thể kéo thả các hình ảnh object từ thư mục Assets vào node này để thêm chúng vào map.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-22-thiet-ke-level-map/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-20-thiet-ke-custom-fonts/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-20-thiet-ke-custom-fonts/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Thu, 25 Nov 2021 08:31:12 +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=37109</guid>

					<description><![CDATA[Trong phần này mình sẽ hướng dẫn bạn cách để có thể tạo/ thiết kế custom font thay vì sài font mặc định của godot. Custom Fonts Tải xuống Bạn có thể truy cập vào link sau để có thể tải xuống font mà bạn muốn: 39 Free Retro, Video Game Fonts Lưu ý: nếu [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này mình sẽ hướng dẫn bạn cách để có thể tạo/ thiết kế custom font thay vì sài font mặc định của godot.</p>
<h2>Custom Fonts</h2>
<h2>Tải xuống</h2>
<p>Bạn có thể truy cập vào link sau để có thể tải xuống font mà bạn muốn: <a href="https://www.1001fonts.com/retro+video-game-fonts.html" target="_blank" rel="noopener">39 Free Retro, Video Game Fonts</a></p>
<p>Lưu ý: nếu như muốn gõ và hiển thị tiếng việt trên Gôt thì bạn cần phải kiếm 1 cái font tiếng việt nhé.</p>
<p><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-29-29.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Thiết kế Custom Fonts" width="295" height="344" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 281"></p>
<p>Ở đây, mình đã tải xuống 1 font tên Atarian và bỏ nó vào thư mục mới mình vừa tạo tên Fonts nằm trong thư mục Assets.</p>
<h3>Thiết lập</h3>
<p>Thì ở trong phần trước mình đã chỉ bạn cách để có thể tạo custom styles cho game và cái custom fonts này nó cũng ở trong Theme Overrides đối với Godot 3.4 trở lên.</p>
<p>Còn nêú là 3.3 trở xuống thì nó sẽ có 1 mục đó là Custom Fonts.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-32-09.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 264" width="284" height="184" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 282"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-32-17.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 265" width="270" height="81" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 283"></p>
<p>Bạn chọn cho mình Nutbatdau và chọn New Dynamic Font.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-33-03.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 266" width="260" height="159" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 284"></p>
<p>Sau đó vào Font Data và nhấn vào nút Load.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-33-36.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 267" width="443" height="462" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 285"></p>
<p>Sau đó tìm fonts mà bạn muốn sử dụng rồi nhấn vào open để mở nó lên nha.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-34-09.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 268" width="353" height="184" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 286"></p>
<p>Sau khi làm xong thì font đã được apply vào node NutBatDau.<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-34-51.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 269" width="274" height="270" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 287"></p>
<p>Bạn có thể chỉnh Size và Outline, Outlinesize, Color Outline, Mipmap, Filter ở phần Settings của Fonts.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-36-24.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 270" width="270" height="353" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 288"></p>
<p>Ở đây mình sẽ chỉnh size lên 30 cho to và Outline size lên 1, Color Outline thành màu đen<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-37-26.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 271" width="284" height="173" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 289"></p>
<p>Đây là sau khi mình làm xong, và cái chữ nó sát với lề button nên là chỉnh lại nha.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-38-28.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 272" width="598" height="229" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 290"></p>
<p>Mình sẽ chỉnh nó lên 1 xíu.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-39-29.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 273" width="295" height="306" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 291"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-39-51.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 274" width="296" height="282" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 292"></p>
<p>Sau đó copy và paste lại qua nút thoát game giống như ở phần trước khi mà bạn copy cái styles ấy nhé.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-40-32.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 275" width="273" height="132" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 293"></p>
<p>Chỉnh size lên thêm tý nhé.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-41-25.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 276" width="615" height="206" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 294">Sau khi mình chỉnh lên thêm xí thì nhìn nó đã thuận mắt hơn rất nhiều rồi.</p>
<h3>Tiêu đề</h3>
<p>Tiếp theo mình sẽ chỉnh tiêu đề.</p>
<p>Tiêu đề thì các bạn nên xài Font khác với Button nhé, làm như vậy sẽ tránh bị chán, trùng khi nhìn vào.</p>
<p style="text-align: center;"><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-42-58.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 277" width="310" height="262" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 295"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-43-03.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 278" width="260" height="63" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 296"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-43-15.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 279" width="281" height="278" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 297"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-43-28.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 280" width="470" height="469" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 298"></p>
<p>&nbsp;</p>
<p style="text-align: left;">Làm tương tự như với cái trên.</p>
<p>Chọn Label -&gt; New Dymanic Fonts -&gt; Chọn Fonts.</p>
<p style="text-align: center;"><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-43-36.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 281" width="471" height="156" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 299"></p>
<p style="text-align: left;">Sau khi xong mình sẽ có kết quả như sau.<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-43-47.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 282" width="874" height="163" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 300"></p>
<p>Mình chỉnh size lên cho to 1 chút.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-46-19.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 283" width="253" height="324" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 301"></p>
<p>Sau đó mình sẽ chỉnh lại Outline Size, Color và bật Filter lên.</p>
<p style="text-align: left;"><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/20-11-2021-01-44-23.png" alt="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 284" width="607" height="321" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 302"></p>
<p>Đây sẽ là kết quả cuối cùng mà mình có được sau khi hoàn thành tất cả các cái 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 xong cách thêm và thết kế fonts trong Godot. Ở phần tiếp theo mình sẽ hướng dẫn bạn cách thêm background vào cho Menu.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm thế nào để thêm font tùy chỉnh vào Godot?</h3>
<p>Bạn tải font xuống, đặt nó vào thư mục &#8220;Fonts&#8221; trong thư mục &#8220;Assets&#8221; của project Godot. Sau đó, trong Godot Editor, bạn tạo một Dynamic Font mới và tải font đã thêm vào.</p>
<h3>Tôi có thể tùy chỉnh font như thế nào?</h3>
<p>Sau khi tải font, bạn có thể điều chỉnh kích thước, thêm viền (outline), thay đổi màu viền, bật/tắt Mipmap và Filter trong phần Settings của Dynamic Font.</p>
<h3>Nếu tôi muốn sử dụng font hiển thị tiếng Việt, tôi cần làm gì?</h3>
<p>Bạn cần tìm và tải xuống một font hỗ trợ tiếng Việt, sau đó làm theo các bước thêm font tùy chỉnh như đã hướng dẫn.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-20-thiet-ke-custom-fonts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
