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

<channel>
	<title>lập trình game với godot &#8211; AnonyViet</title>
	<atom:link href="https://anonyviet.com/tag/lap-trinh-game-voi-godot/feed/" rel="self" type="application/rss+xml" />
	<link>https://anonyviet.com</link>
	<description>Webiste chia sẻ kiến thức công nghệ thông tin, mạng máy tính, bảo mật phổ biến nhất Việt Nam. Luôn cập nhật tin tức, thủ thuật nóng hổi nhất</description>
	<lastBuildDate>Thu, 24 Jul 2025 07:59:26 +0000</lastBuildDate>
	<language>vi</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://anonyviet.com/wp-content/uploads/2018/10/cropped-ico-logo-75x75.png</url>
	<title>lập trình game với godot &#8211; AnonyViet</title>
	<link>https://anonyviet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[Godot Shooter] #2: Tạo Nhân Vật &#038; Bắn Đạn</title>
		<link>https://anonyviet.com/godot-shooter-2-tao-nhan-vat-ban-dan/</link>
					<comments>https://anonyviet.com/godot-shooter-2-tao-nhan-vat-ban-dan/#respond</comments>
		
		<dc:creator><![CDATA[AnonyViet]]></dc:creator>
		<pubDate>Mon, 10 Aug 2020 01:13:55 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[godot 2d game]]></category>
		<category><![CDATA[GODOT ENGINE]]></category>
		<category><![CDATA[lập trình game với godot]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=21190</guid>

					<description><![CDATA[Trong bài này mình sẽ hướng dẫn các bạn tạo nhân vật cho Shooter game với Godot nhé. TẠO NHÂN VẬT Trước hết các bạn tải art về nha. Link: https://opengameart.org/content/animated-top-down-survivor-player AnimatedSprite Đầu tiên các bạn xoá cái Sprite đi rồi thêm cho mình lại node AnimatedSprite. Rồi Tạo Frame mới Rồi add cho mình [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><em>Trong bài này mình sẽ hướng dẫn các bạn tạo nhân vật cho Shooter game với Godot nhé.</em></p>
<h2><span style="font-size: 24pt;">TẠO NHÂN VẬT</span></h2>
<p>Trước hết các bạn tải art về nha.</p>
<p>Link: <a href="https://opengameart.org/content/animated-top-down-survivor-player" target="_blank" rel="noopener">https://opengameart.org/content/animated-top-down-survivor-player</a></p>
<h3>AnimatedSprite</h3>
<p>Đầu tiên các bạn xoá cái Sprite đi rồi thêm cho mình lại node AnimatedSprite.<img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/1-1.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 22" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 22"></p>
<p>Rồi Tạo Frame mới</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/2-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 23" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 23"></p>
<p>Rồi add cho mình</p>
<p>3 animation là : idle – move – shoot</p>
<p>Handgun – Rifle – Shotgun bạn có thể lấy ở trong</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/3-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 24" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 24"></p>
<p>Kéo hết vô 3 cái nhé</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/4-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 25" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 25"></p>
<p>Set CollisionShape2D lại nhé.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/5-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 26" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 26"></p>
<h3>Code:</h3>
<p>Tiếp đế là code. Chúng ta sẽ kiểm tra nếu như player di chuyển thì sẽ chạy animation move và đứng im chạy animation idle, bắn thì chạy animation shoot.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/6-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 27" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 27"></p>
<p>Tiếp theo vì đây là game bắn súng chúng ta phải để nhân vật nó xoay theo hướng chuột thì chúng ta có câu lệnh: <code>look_at(get_global_mouse_position())</code></p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/7-3.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 28" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 28"></p>
<p>Tiếp theo set camera nhé nhìn cho dễ:</p>
<p>Thêm node camera2D ở Zoom chỉnh lại cho nó dễ nhìn nhé mấy bạn.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/8-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 29" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 29"></p>
<h2><span style="font-size: 24pt;">BẮN ĐẠN</span></h2>
<p>Tiếp theo chúng ta sẽ tạo đạn để bắn  piu piu</p>
<p>Link down: <a href="https://drive.google.com/file/d/1fr4xNtR-s5qS49G5N98in3oTVlVJyxAN/view?usp=sharing" target="_blank" rel="noopener">https://drive.google.com/file/d/1fr4xNtR-s5qS49G5N98in3oTVlVJyxAN/view?usp=sharing</a></p>
<p>Bạn tải về nhé.</p>
<p>Xong sau đó tạo sence mới</p>
<p>Nút gốc là Area 2D để kiểm tra khi bullet va chạm</p>
<p>CollisionShape2D</p>
<p>Sprite</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/9-1.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 30" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 30"></p>
<p>Các bạn kéo cái ảnh viên đạn vào Sprite</p>
<p>Rồi set collisionShape2D luôn</p>
<p>Rồi đổi tên thành Bullet</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/10-3.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 31" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 31"></p>
<p>Tạo Script mới</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/11-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 32" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 32"></p>
<p>Ở đây mình sẽ thêm 1 hàm để viên đạn có thể spawn ở vị trí nào đó mà bạn muốn và Sát thương (damage)</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func start_at(pos, dir):
position = pos
rotation = dir
velocity = Vector2(speed, 0).rotated(dir)</pre>
<p>position =pos : nghĩa là vị trí của cái viên đạn sẽ bác cái pos</p>
<p>rotation = độ xoay của viên đạn</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/12-2.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 33" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 33"></p>
<p>Tiếp theo thì sẽ tạo 1 hàm để gán tốc độ cho viên đạn để nó có thể fly</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">func _physics_process(delta):
position += velocity * delta</pre>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/13-1.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 34" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 34"></p>
<p>À các bạn nhớ quay 2 nút <strong>Sprite</strong> và <strong>Collishape</strong> sang ngang nhé nếu không muốn nó bắn dọc</p>
<p>Rồi tiếp theo chúng ta phải check xem nếu như viên đạn ra khỏi màn hình thì nó tự huỷ để không thể tích lại gây lag.</p>
<p>Rồi các bạn thêm nút <strong>VisibilityNotifier2D</strong> sau đó chỉnh sao chó ổn là được. Rồi sau đó connect tín hiệu <code>screen_exit</code>  (thoát khỏi màn hình)</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/15-5.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 35" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 35"></p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/16-3.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 36" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 36"></p>
<p>Rồi ở câu đó chúng ta thêm câu lệnh : <code>queue_free()</code></p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/17-1.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 37" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 37"></p>
<p>Rồi tiếp theo chúng ta  sẽ bắn nó.</p>
<p>Trước đó bạn cần phải có sence của bullet để có thể add nó vào và dùng onready là khi chạy thì nó sẽ được load luôn</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/18.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 38" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 38"></p>
<p>Rồi sau đó check nếu nhấn phím <strong>F</strong> nó sẽ bắn</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/19-1.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 39" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 39"></p>
<p><code>get_parent().add_child(b)</code>: nghĩa là nó sẽ lấy bố mẹ rồi add_child tức là thêm cái nút đạn vào nếu có video thì mình sẽ minh hoạ dễ hơn.</p>
<p><code>b.start_at(global_position,rotation)</code> : global_position = vị trí của nhân vật, rotation là cái góc xoay.</p>
<p>Khi bắn bạn sẽ thấy nó xuất hiện ở giữa player, chúng ta cần phải chỉnh cho nó ra ngoài cây súng.Vậy thì làm như sau.</p>
<p>Bạn thêm nút Position2D rồi kéo nó vô chỗ mà bạn muốn viên đạn xuất hiện</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/20-1.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 40" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 40"></p>
<p>Tiếp theo thì đơn giản thôi bạn chỉ cần thêm $Position2D vào trước cái global_position để spawn ở cái chỗ trên</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/21-1.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 41" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 41"></p>
<p>Và nếu chạy thì bạn sẽ gặp trường hợp như ảnh</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/08/22.jpg" alt="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 42" title="[Godot Shooter] #2: Tạo Nhân Vật &amp; Bắn Đạn 42"></p>
<p>Và bài sau sẽ có cách fix</p>
<p><strong>Code Player:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">extends KinematicBody2D




export var speed = 200




onready var bullet = preload("res://Canh/Bulet.tscn")

func _physics_process(delta):

look_at(get_global_mouse_position())

laydau_nhapvao(delta)




func laydau_nhapvao(delta):

var vector_dauvao = Vector2.ZERO

vector_dauvao.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")

vector_dauvao.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")

vector_dauvao = vector_dauvao.normalized()

if vector_dauvao != Vector2.ZERO:

$AnimatedSprite.play("move")

else:

$AnimatedSprite.play("idle")

var dichuyen = vector_dauvao * speed * delta

if Input.is_key_pressed(KEY_F):

shoot()

dichuyen = move_and_collide(dichuyen)

func shoot():

var b = bullet.instance()

get_parent().add_child(b)

b.start_at($Position2D.global_position,rotation)</pre>
<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 làm theo hướng dẫn?</h3>
<p>Bạn cần tải về bộ ảnh nhân vật và viên đạn từ các liên kết được cung cấp trong bài viết.  Đảm bảo bạn đã cài đặt Godot Engine.</p>
<h3>Làm thế nào để nhân vật xoay theo hướng chuột?</h3>
<p>Sử dụng hàm <code>look_at(get_global_mouse_position())</code> trong script của nhân vật.</p>
<h3>Nếu viên đạn không xuất hiện đúng vị trí mong muốn thì sao?</h3>
<p>Thêm một node Position2D vào scene của nhân vật và sử dụng <code>$Position2D.global_position</code> thay cho <code>global_position</code> khi tạo viên đạn để xác định vị trí xuất phát chính xác hơn.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/godot-shooter-2-tao-nhan-vat-ban-dan/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Lập Trình Top Down Game] #1: Di chuyển Top Down</title>
		<link>https://anonyviet.com/lap-trinh-top-down-game-1-di-chuyen-top-down/</link>
					<comments>https://anonyviet.com/lap-trinh-top-down-game-1-di-chuyen-top-down/#respond</comments>
		
		<dc:creator><![CDATA[DeathGM]]></dc:creator>
		<pubDate>Tue, 21 Jul 2020 01:34:29 +0000</pubDate>
				<category><![CDATA[Godot]]></category>
		<category><![CDATA[godot 2d game]]></category>
		<category><![CDATA[godot di chuyển]]></category>
		<category><![CDATA[GODOT ENGINE]]></category>
		<category><![CDATA[godot hướng dẫn]]></category>
		<category><![CDATA[godot tutorial]]></category>
		<category><![CDATA[lập trình game]]></category>
		<category><![CDATA[lập trình game với godot]]></category>
		<category><![CDATA[lập trình top down game]]></category>
		<guid isPermaLink="false">https://anonyviet.com/?p=20733</guid>

					<description><![CDATA[Giới Thiệu Chào các bạn, chào mừng đã đến với series tiếp theo về lập trình game với Godot Engine. Hôm nay mình sẽ hướng dẫn các bạn lập trình game Top Down với Godot nhé.Trong bài này mình sẽ hướng dẫn các bạn di chuyển nhân vật cho top down game. Với Top Down [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>Giới Thiệu</h2>
<p>Chào các bạn, chào mừng đã đến với series tiếp theo về lập trình game với Godot Engine. Hôm nay mình sẽ hướng dẫn các bạn lập trình game Top Down với Godot nhé.Trong bài này mình sẽ hướng dẫn các bạn di chuyển nhân vật cho top down game.</p>
<p>Với Top Down game thì chúng ta không cần trọng lực như cái series đầu mà chỉ cần di chuyển 4 hướng là được.Thường thì các bạn search youtube các bài về basic top down game sẽ thấy người ta thường dùng lệnh if để check Input và di chuyển, làm kiểu thế rất mất thời gian nên mình sẽ làm 1 kiểu nhanh gọn lẹ luôn nhé :3.</p>
<p><span style="font-size: 18pt;"><strong>Note: Đây sẽ là bài 1 cho cả 2 seires</strong></span></p>
<h2>Tạo Project</h2>
<p>Thì như thường thôi chúng ta sẽ tạo project mới.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-05-48.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 59" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 59"></p>
<p>Project Name: Tên Project</p>
<p>Project Path: Đường dẫn</p>
<p>Renderer:</p>
<p>Chọn OpenGL 3.0 nếu bạn muốn làm game PC &amp; Android &#8211; Chọn OpenGL 2.0 nếu bạn muốn làm game web.</p>
<p>Sau khi có đường dẫn xong các bạn nhấn Create Folder rồi nhấn Create &amp; Edit để bắt đầu</p>
<h2>Tạo Sence</h2>
<p>Như mấy bài trước với Godot chúng ta sẽ tạo Sence mới sẽ chứa nhân vật và những thứ khác</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-18-30.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 60" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 60"></p>
<p>Bạn có thể sử dụng Node Đen hoặc 2D Node đều được. Mình sẽ xài 2D Node và đặt tên nó là World sau đó các bạn nhấn Ctrl + S để lưu nó lại.Mình sẽ lưu nó lại vào folder chứa Cảnh(Sence).</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-19-32.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 61" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 61"></p>
<h2>Tạo Nhân Vật</h2>
<p>Các bạn nhấn vào dấu + bên cạnh cái tên của Sence để tạo sence mới</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-22-27.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 62" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 62"></p>
<p>Rồi nhấn Other Node hoặc Dấu + Dưới chữ Sence để thêm Node. Các bạn tìm cho mình Node <strong>KinematicBody2D</strong>. Đây là một nút &#8221; Cơ thể động học&#8221;giúp chúng ta có thể di chuyển và thực hiện dễ dàng hơn.</p>
<p>Rồi các bạn Thêm cho mình 2 Node là &#8220;<strong>Sprite</strong>&#8221; và &#8220;<strong>CollisionShape2D</strong>&#8220;.</p>
<p>Sprite: Là node hình ảnh cho node bố mẹ nói ngắn gọn là node hiện thị hình ảnh cho cái KinematicBody2D ý</p>
<p>CollisionShape2D: là node đại diện cho dữ liệu va chạm trong không gian 2D tức là mấy cái hình dùng để va chạm ý. Bạn nào từng tiếp xúc qua sẽ hiểu.</p>
<p>Nói chung trong Godot nó là: KinematicBody2D là linh hồn &#8211; Sprite là hình dáng bên ngoài &#8211; CollisionShape2D là bộ xương</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-27-19.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 63" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 63"></p>
<p>Mình sẽ đổi tên cái KinematicBody2D thành Player cho dễ nhận diện.</p>
<p>Với Sprite hiện mình chưa có asset nên chúng ta xài tạm cái icon.png có sẵn trong filesystem của godot nha :v bài sau mình sẽ kiếm cái asset.</p>
<p>Các bạn nhấn vào Sprite rồi nhấn vào cái Icon xong sau đó kéo qua chỗ Texture của Sprite</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-32-47.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 64" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 64"></p>
<p>Tiếp đó chúng ta sẽ set CollisionShape2D cho nó. Nhấn vào node collision rồi chỗ shape các bạn chọn 1 cái shape cho nó, cái nào cũng được tùy bạn ở đây mình chọn hình vuông cho nó vuông với cái Sprite</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-34-26.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 65" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 65"><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-35-57.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 66" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 66"></p>
<p>Vậy là chúng ta đã tạo xong nhân vật cơ bản của cơ bản :&#8217;).</p>
<p>Sau đó các bạn lưu lại nha</p>
<p>Tiếp đến sẽ là phần Script các bạn nhấn vào dấu tờ giấy có dấu + màu xanh để tạo script à nhớ nhấn vào node Player mà tạo nha đừng có tạo ở Sprite hay CollisionShape2D.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-02-37-43.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 67" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 67"></p>
<h2>Code Di Chuyển</h2>
<p>&nbsp;</p>
<p>Chúng ta sẽ xài <a href="https://anonyviet.com/gdscript-godot-engine-co-ban/">GDScript</a> của Godot nhé. Đây là ngôn ngữ riêng của Godot được dựa trên Python và Lua.</p>
<p>Như đã nói ở đầu bài mình sẽ hướng dẫn các bạn di chuyển nâng cao :3.</p>
<h3>Tạo Hàm Lấy Dữ Liệu Đầu Nhập Vào</h3>
<p>Chúng ta sẽ tạo hàm mới gọi là laydau_nhapvao(): tức là hàm sẽ lấy mọi thông tin nhập vào từ bên ngoài. VD như bạn nhấn phím K nó sẽ tấn công thì đó là lấy thông tin từ đầu nhập bên ngoài.</p>
<p>Vậy mình sẽ tạo hàm func laydau_nhapvao():</p>
<p>Trong đó mình sẽ tạo 1 biến là vector_dauvao gán = Vector2.ZERO hoặc Vector2() (2 cái = nhau nhé).</p>
<p>vector_dauvao là biến dùng đến xác định Vector2(x,y) tức là đầu x,y. Nếu nhấn trái sẽ di chuyển qua trái(Vectoc(-1,0)), còn nhấn qua phải sẽ di chuyển qua phải(Vector2(1,0)), lên trên thì (Vector2(0,-1) chứ không phải là Vector2(0,1) như trong toán học, trong game ngược lại).</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="python"><span style="font-size: 10pt;">func laydau_nhapvao():</span><br />
<span style="font-size: 10pt;">var vector_dauvao = Vector2.ZERO</span><br />
<span style="font-size: 10pt;">vector_dauvao.x = Input.get_action_strength("ui_right")- Input.get_action_strength("ui_left")</span><br />
<span style="font-size: 10pt;">vector_dauvao.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")</span></code></p>
<p><span style="font-size: 10pt;">move_and_collide(vector_dauvao)</span></p>
<p>Ở đây:</p>
<p>vector_dauvao.x = Input.get_action_strength(&#8220;ui_right&#8221;) &#8211; Input.get_action_strength(&#8220;ui_left&#8221;): nghĩa là Input(đầu nhậpvào).get_action_strength(&#8220;ui_right&#8221;) (lấy cường độ hành động có thể hiểu là lấy đầu nhập vào khi nhấn phải) sau đó trừ đi  Input.get_action_strength(&#8220;ui_left&#8221;) =&gt; ui_right(Vector(1,0)) và ui_left(Vector(-1,0)) khi nhấn phải mà không nhấn trái thì cái hành động nhấn phải đó Vector2 = Vector2(1,0) và vì bên trái = 0 cho nên 1-0 sẽ = 1 <em><strong>(thì khi di chuyển sang phải Vector(1,0) cái x nó = 1 rồi chúng ta đâu di chuyển sang trái đâu vì vậy nó = 0 khi nào di chuyển sang trái nó mới = -1 vậy 1-0 sẽ = 1 và = 1 thì nó di chuyển sang phải và bên trái thì ngược lại, vector_dauvao.y cũng tương tự)</strong></em></p>
<h3>Áp dụng di chuyển</h3>
<p>Sau đó mình sẽ thêm 1 lệnh để áp dụng di chuyển cho nhân vật đó là move_and_collide(di chuyển và va chạm khác với move_and-slide(di chuyển và lướt) nó còn có công dụng là đẩy vật khác :)) đúng vậy có thể đẩy vật khácnếu là move_and_slide nó chỉ di chuyển và lướt chứ không thể đẩy vậy khác được. Nếu xài Rigdbody2D thì cả slide và collide đều đẩy được nó :3 tính năng khá hay của Godot )</p>
<h3>Gọi hàm lấy dữ liệu</h3>
<p>Rồi tiếp đó chúng ta phải gọi nó vào hàm quá trình vật lý (physical_process(delta)) hoặc quá trình (_process(delta)) bạn có thể xem cơ bản ở đây: Godot <a href="https://anonyviet.com/gdscript-godot-engine-co-ban/">GDScript</a></p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-03-17-45.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 68" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 68"></p>
<h3>Instance Node</h3>
<p>Rồi sau đó qua cái sence world và instance node player vào để test</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-03-18-58.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 69" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 69"></p>
<p>Các bạn nhớ kéo Player ra giữa nha.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/19-07-2020-03-19-38.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 70" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 70"></p>
<p>Rồi các bạn nhấn F5 hoặc F6 chạy game (F5 chọn sence để chạy, F6 chạy sence bạn đang làm việc) khi chạy game bạn nhấn nút mũi tên để di chuyển nhé. Nhưng mà bạn để ý khi di chuyển thẳng ngang với di chuyển chéo thì tốc độ di chuyển chéo nó nhanh hơn chứ không đều như 2 cái di chuyển kia, vì vậy cúng ta có 1 câu lệnh để bình thường hóa tốc độ nó lại là .normalized().</p>
<p>Vậy chúng ta sẽ gõ</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"> vector_dauvao = vector_dauvao.normalized()</pre>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/20-07-2020-12-24-30.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 71" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 71"></p>
<h3>Speed và Delta</h3>
<p>Mình sẽ sử dụng biến export var để xuất ra ngoài bảng Inspector (đây là 1 tính năng khá OK của Godot)</p>
<p>VD:</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/20-07-2020-12-30-43.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 72" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 72"></p>
<p>Đầu tiên chúng ta khai báo</p>
<p>export var speed = 100 đi cho tròn chỉnh bao nhiêu cũng được tùy bạn</p>
<p>Sau đó chúng ta sẽ * nó vào với biến vector_dauvao và * với delta luôn</p>
<p>Bạn có thể làm như này.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/20-07-2020-12-32-57.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 73" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 73"></p>
<p>Nhưng mà với mình thì mình tạo 1 biến mới chứa 3 cái trên cho dễ hiểu.</p>
<p><img decoding="async" class="alignnone size-full " src="https://anonyviet.com/wp-content/uploads/2020/07/20-07-2020-12-33-56.png" alt="[Lập Trình Top Down Game] #1: Di chuyển Top Down 74" title="[Lập Trình Top Down Game] #1: Di chuyển Top Down 74"></p>
<p>Ở laydau_nhapvao không có delta nên mình sẽ tạo 1 delta ngay trên func laydau_nhapvao():</p>
<p>Rồi ở_physical_process(deta): mình chỉ cần gọi nó vô thôi.</p>
<h3>Kết Thúc</h3>
<p>Vậy là đã xong bài 1 trong series lập trình game với Godot, rồi hẹn gặp lạibạn vào bài sau ;3</p>
<h2>Câu hỏi thường gặp</h2>
<h3>Tôi có thể sử dụng loại Node nào để tạo nhân vật trong game Top-Down này?</h3>
<p>Bài viết sử dụng <code>KinematicBody2D</code>.  Đây là lựa chọn phù hợp cho việc di chuyển và xử lý va chạm trong game 2D.</p>
<h3>Sự khác biệt giữa <code>move_and_slide()</code> và <code>move_and_collide()</code> là gì?</h3>
<p><code>move_and_collide()</code> cho phép nhân vật đẩy các vật thể khác, trong khi <code>move_and_slide()</code> chỉ cho phép nhân vật trượt qua các vật thể khác.</p>
<h3>Tôi nên đặt mã di chuyển vào hàm nào trong GDScript?</h3>
<p>Bạn nên đặt mã di chuyển vào hàm <code>_physics_process(delta)</code> để đảm bảo cập nhật di chuyển đúng trong mỗi khung hình.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://anonyviet.com/lap-trinh-top-down-game-1-di-chuyen-top-down/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
