<?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>thiết kế game &#8211; AnonyViet</title>
	<atom:link href="https://anonyviet.com/tag/thiet-ke-game/feed/" rel="self" type="application/rss+xml" />
	<link>https://anonyviet.com</link>
	<description>Webiste chia sẻ kiến thức công nghệ thông tin, mạng máy tính, bảo mật phổ biến nhất Việt Nam. Luôn cập nhật tin tức, thủ thuật nóng hổi nhất</description>
	<lastBuildDate>Thu, 24 Jul 2025 11:01:54 +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>thiết kế game &#8211; AnonyViet</title>
	<link>https://anonyviet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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 fetchpriority="high" 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 6"></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 7"> <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 8"></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 9"></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 10"></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 24"></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 25"></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 26"></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 27"></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 28"></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 29"></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 30"></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 31"></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 32"><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 33"><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 34"></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 35"></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 36"></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 38"></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 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 53"></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 46" width="300" height="132" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 54"></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 47" width="300" height="125" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 55"></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 48" width="295" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 56"></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 49" width="282" height="247" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 57"></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 50" width="300" height="78" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 58"></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 51" width="300" height="65" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 59"> <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 52" width="300" height="267" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 60"></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 53" width="157" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 61"></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 54" width="300" height="223" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 62"></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 55" width="295" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 63"></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 56" width="280" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 64"></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 57" width="300" height="61" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 65"></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 58" width="218" height="220" title="[Tạo 2D Platformer Game với Godot] Phần 25: Tạo Menu khi hết Level 66"></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 99" width="326" height="90" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 107"></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 100" width="284" height="120" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 108"></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 101" width="236" height="199" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 109"></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 102" width="297" height="311" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 110"></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 103" width="241" height="463" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 111"></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 104" width="236" height="153" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 112"></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 105" width="428" height="314" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 113"></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 106" width="334" height="128" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 114"> <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 107" width="330" height="81" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 115"></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 108" width="530" height="323" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 116"></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 109" width="291" height="340" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 117"></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 110" width="259" height="458" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 118"></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 111" width="249" height="224" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 119"></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 112" width="325" height="101" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 120"> <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 113" width="144" height="491" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 121"></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 114" width="640" height="326" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 122"></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 115" width="267" height="171" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 123"></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 116" width="286" height="114" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 124"></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 117" width="399" height="375" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 125"></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 118" width="295" height="86" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 126"></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 119" width="292" height="175" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 127"></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 120" width="456" height="136" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 128"></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 121" width="264" height="281" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 129"></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 122" width="451" height="110" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 130"></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 123" width="260" height="211" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 131"></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 124" width="386" height="402" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 132"></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 125" width="324" height="519" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 133"></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 126" width="300" height="66" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 134"> <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 127" width="300" height="245" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 135"></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 128" width="300" height="238" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 136"></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 129" width="300" height="77" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 137"></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 130" width="198" height="300" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 138"></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 131" width="300" height="293" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 139"></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 132" width="283" height="258" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 140"></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 133" width="222" height="82" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 141"></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 134" width="282" height="239" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 142"> <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 135" width="155" height="138" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 143"></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 136" width="300" height="72" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 144"> <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 137" width="300" height="87" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 145"></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 138" width="199" height="148" title="[Tạo 2D Platformer Game với Godot] Phần 24: Tạo Pause Menu 146"></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 167"></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 158" width="261" height="228" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 168"></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 159" width="269" height="270" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 169"></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 160" width="166" height="183" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 170"> <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 161" width="282" height="162" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 171"></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 162" width="198" height="202" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 172"></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 163" width="337" height="163" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 173"></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 164" width="347" height="199" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 174"></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 165" width="207" height="213" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 175"> <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 166" width="271" height="336" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 176"></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 167" width="433" height="510" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 177"></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 168" width="342" height="315" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 178"></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 169" width="310" height="62" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 179"> <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 170" width="369" height="397" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 180"></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 171" width="292" height="114" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 181"></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 172" width="343" height="153" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 182"></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 173" width="292" height="140" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 183"> <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 174" width="277" height="119" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 184"></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 175" width="346" height="188" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 185"></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 176" width="172" height="130" title="[Tạo 2D Platformer Game với Godot] Phần 23: Chọn Level 186"></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. 205"></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. 194" width="309" height="108" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 206"></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. 195" width="191" height="99" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 207"></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. 196" width="480" height="225" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 208"></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. 197" width="307" height="147" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 209"></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. 198" width="173" height="138" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 210"></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. 199" width="167" height="155" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 211"></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. 200" width="215" height="296" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 212"></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. 201" width="206" height="184" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 213"></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. 202" width="211" height="155" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 214"></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. 203" width="172" height="330" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 215"></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. 204" width="177" height="264" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 216"></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. 205" width="324" height="250" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 217"></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. 206" width="249" height="247" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 218"></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. 207" width="289" height="130" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 219"></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. 208" width="288" height="199" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 220"></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. 209" width="499" height="549" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 221"></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. 210" width="1038" height="621" title="[Tạo 2D Platformer Game với Godot] Phần 22: Thiết kế Level Map. 222"></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 245"></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 232" width="284" height="184" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 246"> <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 233" width="270" height="81" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 247"></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 234" width="260" height="159" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 248"></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 235" width="443" height="462" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 249"></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 236" width="353" height="184" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 250"></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 237" width="274" height="270" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 251"></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 238" width="270" height="353" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 252"></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 239" width="284" height="173" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 253"></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 240" width="598" height="229" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 254"></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 241" width="295" height="306" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 255"> <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 242" width="296" height="282" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 256"></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 243" width="273" height="132" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 257"></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 244" width="615" height="206" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 258">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 245" width="310" height="262" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 259"> <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 246" width="260" height="63" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 260"> <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 247" width="281" height="278" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 261"> <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 248" width="470" height="469" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 262"></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 249" width="471" height="156" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 263"></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 250" width="874" height="163" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 264"></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 251" width="253" height="324" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 265"></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 252" width="607" height="321" title="[Tạo 2D Platformer Game với Godot] Phần 20: Thiết kế Custom Fonts 266"></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>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-18-su-dung-cac-nut/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-18-su-dung-cac-nut/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Tue, 23 Nov 2021 07:54:05 +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=37028</guid>

					<description><![CDATA[Trong phần này mình sẽ hướng dẫn bạn cách để sử dụng các nút như bắt đầu, thoát game bằng cách kết nối tín hiệu và 1 vài dòng code nha. Sử dụng Add script Bạn add thêm cho mình 1 cái script mới ở scene Menu. Kết nối tín hiệu Mình sẽ kết nối [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Trong phần này mình sẽ hướng dẫn bạn cách để sử dụng các nút như bắt đầu, thoát game bằng cách kết nối tín hiệu và 1 vài dòng code nha.</p>
<h2>Sử dụng</h2>
<h3>Add script</h3>
<p><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-04-31.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút" width="312" height="113" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 279"></p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-04-42.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 264" width="375" height="306" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 280"></p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-04-50.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 265" width="214" height="92" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 281"></p>
<p>Bạn add thêm cho mình 1 cái script mới ở scene Menu.</p>
<h3>Kết nối tín hiệu<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-05-08.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 266" width="227" height="80" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 282"></h3>
<p>Mình sẽ kết nối tín hiệu của node NutBatDau để có thể là khi nhấn vào thì sẽ di chuyển tới scene level 1</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-05-17.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 267" width="277" height="166" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 283"></p>
<p>Tìm và kết nối tín hiệu pressed(). Tín hiệu này sẽ thực hiện lệnh khi button được người dùng nhấn vào.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-05-30.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 268" width="541" height="465" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 284"></p>
<p>Nhấn vào connect<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-05-37.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 269" width="376" height="76" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 285"></p>
<p>Connect thành công.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-08-38.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 270" width="258" height="83" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 286"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-08-44.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 271" width="300" height="186" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 287"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-08-53.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 272" width="579" height="453" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 288"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-09-02.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 273" width="368" height="86" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 289"></p>
<p>Bạn sẽ làm tương tự cho mình đối với nút thoát game.</p>
<h3>Code</h3>
<p>&nbsp;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Control




func _on_NutBatDau_pressed():
    pass # Replace with function body.


func _on_NutThoatGame_pressed():
    pass # Replace with function body.
</pre>
<p>Đây là code ban đầu.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends Control




func _on_NutBatDau_pressed():
    get_tree().change_scene("res://Scences/Map/Map.tscn")
    pass # Replace with function body.


func _on_NutThoatGame_pressed():
    get_tree().quit()
    pass # Replace with function body.
</pre>
<p>Còn đây là code mà mình đã thêm vào và nó chỉ thêm có 2 dòng thôi.</p>
<p>Ở nút bắt đầu mình sẽ thêm hàm change_sence() để thay đổi qua scene mà mình muốn và change_scene() chỉ có thể được gọi thông qua get_tree() nhé.</p>
<p>Ở nút thoát game thì mình dùng lênh quit() lệnh này sẽ tự đóng game của bạn lại</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-13-32.png" alt="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 274" width="345" height="247" title="[Tạo 2D Platformer Game với Godot] Phần 18: Sử dụng các nút 290"></p>
<p>Sau đó bạn nhấn <strong>F6 </strong>chạy game và sẽ thấy khi nhấn BAT DAU bạn sẽ được di chuyển qua scene khác và khi nhấn THOAT GAME thì game của bạn sẽ bị thoát ra ngoài.</p>
<h2>Tổng kết</h2>
<p>Phần này thì nó toàn mấy cái khá là dễ để thực hiện.</p>
<p>Ở phần tiếp, mình sẽ hướng dẫn bạn cách để design , trang trí lại cái giao diện Menu sao cho đẹp và hợp lý nha. Dự tính phần Menu sẽ kéo dài thêm 2,3 phần và sau đó là sẽ tạo Menu dừng game khi đang chơi game.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Làm thế nào để kết nối tín hiệu của nút với một hàm trong Godot?</h3>
<p>Bạn cần kết nối tín hiệu &#8220;pressed()&#8221; của nút (button) trong editor của Godot với một hàm tương ứng trong script của bạn.  Hàm này sẽ được gọi khi người dùng nhấn vào nút.</p>
<h3>Hàm nào dùng để chuyển đổi scene trong Godot?</h3>
<p>Sử dụng <code>get_tree().change_scene("path/to/your/scene.tscn")</code>, thay thế &#8220;path/to/your/scene.tscn&#8221; bằng đường dẫn đến scene bạn muốn chuyển đến.</p>
<h3>Làm thế nào để thoát game bằng GDScript?</h3>
<p>Sử dụng hàm <code>get_tree().quit()</code>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-18-su-dung-cac-nut/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu</title>
		<link>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-17-tao-menu/</link>
					<comments>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-17-tao-menu/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Mon, 22 Nov 2021 07:54:03 +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=36992</guid>

					<description><![CDATA[Trong phần này, mình sễ hướng dẫn bạn cách để có thể tạo Menu game cho con game Platformer này. Trong phần này mình sẽ chỉ cho bạn thêm 1 vài node mới của U.I của Godot. Menu Thì điều đầu tiên là bạn tạo cho mình 1 scene mới với Control Node là node [&#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 Menu game cho con game Platformer này. Trong phần này mình sẽ chỉ cho bạn thêm 1 vài node mới của U.I của Godot.</p>
<h2>Menu</h2>
<p><img decoding="async" class="aligncenter  size-full" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-27-01.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu" width="441" height="170" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 316"></p>
<p>Thì điều đầu tiên là bạn tạo cho mình 1 scene mới với Control Node là node gốc và rename lại thành Menu.</p>
<p>Và add thêm 1 node mới đó là Vboxcontanier.</p>
<p><strong>VBoxContainer</strong>: đây là node mà nó sẽ tạo ra 1 cái vùng giống như 1 cái container và nó làm cho những node bên trong nó đều được sắp xếp theo thứ tự đường dọc.</p>
<p><strong>HBoxContainer: </strong>Hbox thì ngược lại với Vbox là nó sắp xếp theo đường ngang.</p>
<p>Nếu bạn để ý thì có chữ  V và H ở đầu tên, và V &#8211; H này chính là tên của 2 trục hoành và độ theo tiếng anh.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-26-08.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 299" width="153" height="551" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 317"></p>
<p>Sau đó bạn chọn Layout ở phía cuối thanh công cụ và chọn full rect<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-42-43.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 300" width="436" height="280" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 318"></p>
<p>Sau khi bạn chọn full rect nó sẽ ra như này.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-43-25.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 301" width="140" height="62" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 319"></p>
<p>Mình sẽ rename lại cho dễ nhận biết.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-44-09.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 302" width="308" height="156" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 320"></p>
<p>Và mình add thêm 2 Vbox rồi rename nó 1 cái là PhanDau và 1 là PhanCuoi.</p>
<p>Về lý do mình thêm 2 cái này là vì mình muốn PhanDau là phần mình sẽ thêm Text vào VD như là tên game.vv. Còn PhanCuoi là mình sẽ thêm nút để bấm.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-45-58.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 303" width="278" height="145" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 321"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-46-08.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 304" width="286" height="123" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 322"></p>
<p>Mình sẽ add thêm 1 node Hbox và rename là TieuDe.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-46-19.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 305" width="273" height="114" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 323"></p>
<p>Vì mình muốn tạo 1 cái tiêu đề game cho nên mình sẽ sử dụng 1 node cho phép mình hiển thị text đó là <strong>Label.</strong></p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-46-38.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 306" width="277" height="188" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 324"></p>
<p>Ở bên phải có cái ô text.<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-46-51.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 307" width="311" height="137" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 325"></p>
<p>Và cái label của bạn sẽ bị di chuyển sang góc trái mà mình muốn di chuyển sang phải, à và bạn không thể chỉnh thủ công được nha.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-47-02.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 308" width="280" height="116" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 326"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-47-11.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 309" width="284" height="121" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 327"></p>
<p>&nbsp;</p>
<p>Để chỉnh lại thì chọn node TieuDe bên Inspector chọn Center ở Aligment.<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-47-30.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 310" width="555" height="161" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 328"></p>
<p>Sau đó nó sẽ được di chuyển ra giữa<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-51-05.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 311" width="284" height="112" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 329"></p>
<p>Nếu bạn để ý thì có thể thấy rằng là cái TieuDe nó bị ở sát trên tít màn hình do đó mình sẽ làm cho nó rộng ra.</p>
<p>Bạn add thêm node là NinePatchRect ( và bỏ lên đầ ) thì ở đây bạn có thể dùng node khác để có thể tạo khoảng trống như Vbox,vv. Ở đây, mình chỉ chọn đại thôi.<br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-51-22.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 312" width="307" height="234" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 330"></p>
<p>&nbsp;</p>
<p>Ở phần Rect của NinePatchRect bạn chỉnh Min Size lên 50.</p>
<p><strong>Lưu ý chỉnh ở Min size chứ không phải size vì có 1 số trường hợp chỉnh size nhưng nó sẽ reset về size ban đầu.</strong><br />
<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-51-34.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 313" width="610" height="121" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 331"></p>
<p>Sau khi chỉnh.<img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-55-12.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 314" width="303" height="127" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 332"></p>
<p>Tiếp đến là phần nút bấm. Cũng như Tieude mình add 1 cái Hbox và thêm 1 node cho phép chúng ta bấm nút đó là Button.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-56-25.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 315" width="292" height="132" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 333"></p>
<p>Mình rename lại.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-57-02.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 316" width="272" height="158" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 334"></p>
<p>Bạn sẽ phải căn chỉnh nó ra giữa như cách đã làm với Tieude.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-57-12.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 317" width="281" height="135" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 335"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-57-19.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 318" width="326" height="178" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 336"></p>
<p>Mình add thêm NinePatchRect để tạo khoảng trống.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-59-21.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 319" width="280" height="203" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 337"> <img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-12-59-27.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 320" width="327" height="268" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 338"></p>
<p>Tương tự như vậy, mình add thêm 1 nút thoát game.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-00-59.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 321" width="287" height="162" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 339"></p>
<p>Lưu scene vào thư mục mói tên UI.</p>
<p><img decoding="async" class="size-full  aligncenter" src="https://anonyviet.com/wp-content/uploads/2021/11/19-11-2021-01-01-47.png" alt="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 322" width="344" height="253" title="[Tạo 2D Platformer Game với Godot] Phần 17: Tạo Menu 340"></p>
<h2>Tổng kết</h2>
<p>Vậy trong phần này, mình đã chỉ bạn các để tạo 1 cái menu cơ bản cho game.</p>
<h2>Câu hỏi thường gặp</h2>
<h3>VBoxContainer và HBoxContainer là gì và chúng khác nhau như thế nào?</h3>
<p>VBoxContainer là node sắp xếp các node con theo chiều dọc, còn HBoxContainer sắp xếp các node con theo chiều ngang.  Sự khác biệt nằm ở hướng sắp xếp các thành phần UI.</p>
<h3>Làm thế nào để căn chỉnh các nút và văn bản trong menu cho chính giữa?</h3>
<p>Chọn node chứa các nút hoặc văn bản (ví dụ: HBoxContainer), trong Inspector, tìm thuộc tính Alignment và chọn Center.</p>
<h3>NinePatchRect được sử dụng để làm gì trong việc thiết kế menu này?</h3>
<p>NinePatchRect được sử dụng để tạo khoảng trống hoặc tạo vùng nền cho các phần tử khác trong menu, giúp cho bố cục trở nên cân đối và đẹp mắt hơn.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/tao-2d-platformer-game-voi-godot-phan-17-tao-menu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
