{"id":1601,"date":"2022-09-11T00:46:17","date_gmt":"2022-09-10T15:46:17","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=1601"},"modified":"2025-09-11T18:46:45","modified_gmt":"2025-09-11T09:46:45","slug":"%ec%b2%98%ec%9d%8c-%ec%a0%91%ed%95%98%eb%8a%94-godot-pong-%ea%b2%8c%ec%9e%84%ec%9d%84-%eb%a7%8c%eb%93%a4%ec%96%b4-%eb%b3%b4%ec%9e%90-3","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2022\/09\/11\/1601\/","title":{"rendered":"\ucc98\uc74c \uc811\ud558\ub294 Godot: Pong \uac8c\uc784\uc744 \ub9cc\ub4e4\uc5b4 \ubcf4\uc790 #3"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\"> <strong>\ubcbd \uc138\uc6b0\uae30<\/strong><\/h4>\n\n\n\n<p> \uc800\ubc88\uae00\uc5d0 \uc774\uc5b4 \uc791\uc5c5\uc744 \uacc4\uc18d\ud574\ubcf4\uc790. PlayerStick\uc740 \uc704\uc544\ub798\ub85c \uc6c0\uc9c1\uc774\uae30 \uc2dc\uc791\ud588\uc9c0\ub9cc, \ud654\uba74 \ub118\uc5b4\uae4c\uc9c0 \ub118\uc5b4\uac14\uc5c8\ub2e4. \ud574\uacb0 \ubc29\ubc95\uc740 \uc5ec\ub7ec\uac00\uc9c0\uac00 \uc788\uaca0\uc9c0\ub9cc, \ub098\uc911\uc5d0 \uacf5\ub3c4 \ud295\uaca8\ub0b4\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc544\ub798\ub85c \ubcbd\uc744 \uc138\uc6cc\ubcf4\uc790. Pong Level \uc52c\uc744 \uc5f4\uace0 KinematicBody2D\ub97c \ucd94\uac00\ud55c\ub2e4. \uc55e\uc5d0\uc11c \ub2e4\ub918\ub2e4\uc2dc\ud53c, CollisionShape2D\uac00 \ud544\uc694\ud558\ub2e4. \uc774\ub984\uc744 WallTop\uc73c\ub85c \ubc14\uafd4\uc900 \ud6c4, CollisionShape2D\ub97c \uc790\uc2dd \ub178\ub4dc\ub85c \ucd94\uac00\ud55c\ub2e4. CollisionShape2D\ub97c \uc120\ud0dd\ud55c \ud6c4, Inspector &gt; Shape \ud56d\ubaa9\uc5d0\uc11c RectangleShape2D\ub97c \uc120\ud0dd\ud574\uc900\ub2e4. \uc5ec\uae30\uae4c\uc9c0 \ud558\uba74, \ub178\ub4dc\ud2b8\ub9ac\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\uc77c \uac83\uc774\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"283\" height=\"359\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/walltop-1.png\" alt=\"\" class=\"wp-image-1603\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/walltop-1.png 283w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/walltop-1-236x300.png 236w\" sizes=\"auto, (max-width: 283px) 100vw, 283px\" \/><figcaption class=\"wp-element-caption\">Wall Top<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\uc774\uc81c, \ubdf0\ud3ec\ud2b8\uc5d0\uc11c CollisionShape2D\ub97c \ubcc0\ud615\ud558\uc5ec \uac8c\uc784 \ud654\uba74\uc758 \uc704\ucabd\uc744 \ub9c9\uc544\uc900\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"947\" height=\"394\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/walltop02.png\" alt=\"\" class=\"wp-image-1604\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/walltop02.png 947w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/walltop02-300x125.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/walltop02-768x320.png 768w\" sizes=\"auto, (max-width: 947px) 100vw, 947px\" \/><figcaption class=\"wp-element-caption\">Wall Top<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\ubdf0\ud3ec\ud2b8\uc5d0\uc11c \ud750\ub9bf\ud558\uc9c0\ub9cc \ud30c\ub780\uc0c9 \ub77c\uc778\uc774 \uc2e4\uc81c \uac8c\uc784\ud654\uba74 \ud06c\uae30\uc774\ub2e4. \ub109\ub109\ud558\uac8c \uac8c\uc784\ud654\uba74\uc744 \ub118\uc5b4\uac00\ub3c4\ub85d \uae38\uac8c \ub9cc\ub4e4\uc5b4\uc900\ub2e4. \uc704\uce58\ub294 \uc815\ud655\ud788 \ud0d1 \ub77c\uc778\uc5d0 \uc77c\uce58\ud558\uac8c \ub9cc\ub4e4\uc5b4 \uc92c\ub294\ub370, \uc27d\uac8c \ud55c\ub2e4\uace0 Grid Snap\uc744 \uc0ac\uc6a9\ud558\uac8c \ub418\uba74 \ud0d1 \ub77c\uc778\uc5d0 \ubd99\uc9c0\ub97c \uc54a\ub294\ub2e4. Grid Snap\uc758 \uac04\uaca9\uc774 \ub514\ud3f4\ud2b8\ub85c 8px\ub85c \ub418\uc5b4 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4. \uc774\uac78 \uc870\uc815\ud558\uace0 \uc2f6\ub2e4\uba74, 5px\ub85c \ubc14\uafd4\uc8fc\uba74 \ub41c\ub2e4. Grid Snap\uc740 \ubdf0\ud3ec\ud2b8 \ud234\ubc14\uc5d0 \uc788\uc73c\uba70, \uc606\uc5d0 3\uac1c\uc758 \uc810\uc744 \ud074\ub9ad\ud558\uba74 \uc124\uc815\ubcc0\uacbd\ub3c4 \uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"531\" height=\"406\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/grid_snap.gif\" alt=\"\" class=\"wp-image-1605\"\/><figcaption class=\"wp-element-caption\">grid snap<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\ub610\ub294 Inspector\uc5d0\uc11c \uc815\ud655\ud55c \uac12\uc744 \uc785\ub825\ud574\ub3c4 \ub41c\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"290\" height=\"382\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/walltop03.png\" alt=\"\" class=\"wp-image-1606\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/walltop03.png 290w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/walltop03-228x300.png 228w\" sizes=\"auto, (max-width: 290px) 100vw, 290px\" \/><figcaption class=\"wp-element-caption\">Wall Top<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\uc8fc\uc758\ud560 \uc810\uc740, Shape &gt; Extends\ub294 \uc804\uccb4 \uae38\uc774\uac00 \uc544\ub2c8\uace0 \uc591\ubc29\ud5a5\uc73c\ub85c \ub298\uc5b4\ub098\ub294 \uae38\uc774\ub97c \ub9d0\ud55c\ub2e4. \uc989, 700\uc774\uba74 \ucd1d \uae38\uc774\ub294 1400\uc774 \ub41c\ub2e4. <\/p>\n\n\n\n<p>\uc704\ucabd\uc5d0 \ubcbd\uc744 \uc138\uc6e0\uc73c\ub2c8, \uc544\ub798\ucabd\ub3c4 \uc138\uc6b0\uc790. \ub178\ub4dc\ud2b8\ub9ac\uc5d0\uc11c WallTop\uc744 \uc120\ud0dd\ud55c \ud6c4, \ub9c8\uc6b0\uc2a4 \uc6b0\ud074\ub9ad\uc744 \ud574\ubcf4\uba74 Duplicate \uba54\ub274\uac00 \ubcf4\uc778\ub2e4. \uc774\uac78 \uc120\ud0dd\ud574\uc11c WallTop\uc744 \ubcf5\uc81c\ud574 \uc0dd\uc131\ud558\uc790. \ub2e8\ucd95\ud0a4\ub294 Ctrl+D\uc774\ub2e4. WallTop2 \ub178\ub4dc\uac00 \uc0dd\uc131\ub420\ud150\ub370, \uc774\ub984\uc744 WallBottom\uc73c\ub85c \ubc14\uafd4\uc900\ub2e4. \uc790\uae43\ub178\ub4dc\uc778 CollisionShape2D\ub97c \uc120\ud0dd\ud55c \ud6c4, \ud654\uba74\uc758 \uc544\ub798\ucabd\uc744 \ub9c9\ub3c4\ub85d \uc774\ub3d9\ud55c\ub2e4. \uac04\ub2e8\ud558\uac8c Inspector\uc5d0\uc11c Transform &gt; Position &gt; y \uac12\uc744 \ubc14\uafd4\uc8fc\uba74 \ub41c\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"297\" height=\"230\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/wallbottom02.png\" alt=\"\" class=\"wp-image-1608\"\/><figcaption class=\"wp-element-caption\">Wall Bottom<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\uc774\ub3d9\uc2dc\ud0a4\uba74 \ubdf0\ud3ec\ud2b8\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\uc77c\uac83\uc774\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"879\" height=\"499\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/wallbottom01.png\" alt=\"\" class=\"wp-image-1609\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/wallbottom01.png 879w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/wallbottom01-300x170.png 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/wallbottom01-768x436.png 768w\" sizes=\"auto, (max-width: 879px) 100vw, 879px\" \/><figcaption class=\"wp-element-caption\">Wall Bottom<\/figcaption><\/figure>\n<\/div>\n\n\n<h4 class=\"wp-block-heading\"><strong>\uc88c\ud45c\uacc4<\/strong><\/h4>\n\n\n\n<p>\uc544, \ub0b4\uac00 \uc88c\ud45c\uacc4 \uc598\uae38 \ud588\ub358\uac00? Godot\uc5d0\uc11c\ub294 \ud654\uba74\uc758 \uc88c\uce21 \uc0c1\ub2e8\uc774 (0, 0)\uc774\uace0 \uc624\ub978\ucabd\uc774 +X \ucd95, \uc544\ub798\ucabd\uc774 +Y\ucd95\uc774\ub2e4. <a href=\"https:\/\/docs.godotengine.org\/en\/stable\/tutorials\/math\/vector_math.html?highlight=coordinate#coordinate-systems-2d\">2D \uc88c\ud45c\uacc4\ub294 \uacf5\uc2dd \ubb38\uc11c<\/a>\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"406\" height=\"393\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/vector_axis1.png\" alt=\"\" class=\"wp-image-1611\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/vector_axis1.png 406w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/vector_axis1-300x290.png 300w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><figcaption class=\"wp-element-caption\">2D Coordinate System<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\uc598\uae30\uac00 \ub098\uc628\uae40\uc5d0 3D\ub3c4 \uc0b4\ud3b4\ubcf4\uc790. 3D\ub294 \uc624\ub978\uc190 \uc88c\ud45c\uacc4\uc640 \uc67c\uc190 \uc88c\ud45c\uacc4\ub85c \ub098\ub25c\ub2e4. Godot\uc740 \uc624\ub978\uc190 \uc88c\ud45c\uacc4\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \uc624\ub978\uc190 \uc88c\ud45c\uacc4\uc5d0\uc11c\ub3c4 \ud504\ub85c\uadf8\ub7a8 \ubdf0\ud3ec\ud2b8\uc5d0\uc11c \uc704\ucabd\uc744 \uc5b4\ub5a4 \uc88c\ud45c\ub85c \ub450\ub290\ub0d0\uc5d0 \ub530\ub77c Y-up, Z-up\uc73c\ub85c \uad6c\ubd84\ud558\ub294\ub370, Godot\uc740 Y-up \uc744 \uc0ac\uc6a9\ud55c\ub2e4. \uc989, \ud558\ub298\ub85c \uac00\ub294 \ubc29\ud5a5\uc774 Y\ubc29\ud5a5\uc774\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"358\" height=\"325\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/coordinate_02.webp\" alt=\"\" class=\"wp-image-1612\"\/><figcaption class=\"wp-element-caption\">Godot Coordinate<\/figcaption><\/figure>\n<\/div>\n\n\n<p> \ud63c\ub780\uc744 \uac00\uc911\uc2dc\ud0a4\ub294 \ubd80\ubd84\uc740 \uac01\uc885 3D \ud504\ub85c\uadf8\ub7a8\ub4e4\uc774 \ub2e4 \uc81c\uac01\uac01\uc758 \uc88c\ud45c\uacc4\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4\ub294 \uc0ac\uc2e4\uc774\ub2e4. \ub2e4\uc74c \ud45c\uc5d0 \uc815\ub9ac\ub418\uc5b4 \uc788\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/3d_coordinate-1024x1024.jpg\" alt=\"\" class=\"wp-image-1613\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/3d_coordinate-1024x1024.jpg 1024w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/3d_coordinate-300x300.jpg 300w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/3d_coordinate-150x150.jpg 150w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/3d_coordinate-768x768.jpg 768w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/3d_coordinate.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">3D Coordinate System<\/figcaption><\/figure>\n\n\n\n<p> \uc608\ub97c\ub4e4\uc5b4, Blender\uc5d0\uc11c \ubaa8\ub378\uc744 \uadf8\ub300\ub85c export\ud574\uc11c import \ud574\uc624\uba74, \ubaa8\ub378\uc774 \ub204\uc6cc\uc788\uc744 \uac83\uc774\ub2e4. \uadf8\ub798\ub3c4 \uac19\uc740 \uc624\ub978\uc190 \uc88c\ud45c\uacc4\ub294 \ud68c\uc804\ub9cc \uc2dc\ucf1c\uc8fc\uba74 \ub418\ubbc0\ub85c export\uc2dc \uac04\ub2e8\ud55c \uccb4\ud06c \ud558\ub098\ub9cc \ud574\uc8fc\uba74 \uc27d\uac8c \uc815\uc0c1\uc801\uc73c\ub85c \uac00\uc838\uc62c \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Ball\uc758 \uc6c0\uc9c1\uc784\uc744 \uc2a4\ud06c\ub9bd\ud2b8\ub85c \uad6c\ud604<\/strong><\/h4>\n\n\n\n<p> \uc774\uc81c \uacf5\uc744 \uc6c0\uc9c1\uc5ec \ubcf4\uc790. Pong Level \ub178\ub4dc\ud2b8\ub9ac\uc5d0\uc11c PongBall \ub178\ub4dc\uc5d0 attach script\ub97c \uc774\uc6a9\ud558\uc5ec \uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc77c\uc744 \ucd94\uac00\ud55c\ub2e4. \ub2e4\uc74c\uacfc \uac19\uc740 \ub2e4\uc774\uc5bc\ub85c\uadf8\uac00 \ub728\ub294\ub370, \uadf8\ub300\ub85c \uc0dd\uc131.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"376\" height=\"341\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/pongball_script01.png\" alt=\"\" class=\"wp-image-1617\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/pongball_script01.png 376w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/pongball_script01-300x272.png 300w\" sizes=\"auto, (max-width: 376px) 100vw, 376px\" \/><\/figure>\n<\/div>\n\n\n<p> \uacf5\uc744 \uc6c0\uc9c1\uc774\ub294 \ud568\uc218\ub294 KinematicBody2D\uc5d0 \uc788\ub294 <a href=\"https:\/\/docs.godotengine.org\/en\/stable\/classes\/class_kinematicbody2d.html#class-kinematicbody2d-method-move-and-collide\">move_and_collide()<\/a>\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \uc55e\uc5d0\uc11c \uc598\uae38 \ubabb\ud588\ub294\ub370, <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/tutorials\/physics\/using_kinematic_body_2d.html\">KinematicBody2D\uc5d0 \ub300\ud574 \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud558\ub294\uc9c0 \uacf5\uc2dd \ubb38\uc11c\uc5d0 \uc790\uc138\ud55c \uc124\uba85<\/a>\uc774 \uc788\ub2e4. \ub610\ud55c \uc624\ube0c\uc81d\ud2b8\uac04 \ucda9\ub3cc\uacfc \uc774\uc5d0 \ub300\ud55c \ucc98\ub9ac\ub294 <a href=\"https:\/\/docs.godotengine.org\/en\/stable\/tutorials\/physics\/physics_introduction.html\">Physics introduction<\/a> \ud56d\ubaa9\uc744 \ucc38\uc870\ud558\uba74 \ub3c4\uc6c0\uc774 \ub420 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p>move_and_collide()\ub294 \ucda9\ub3cc\uc2dc, <a href=\"https:\/\/docs.godotengine.org\/en\/stable\/classes\/class_kinematiccollision2d.html#class-kinematiccollision2d\">KinematicCollision2D <\/a>\uc624\ube0c\uc81d\ud2b8\ub97c \ub9ac\ud134\ud574\uc900\ub2e4. \uc5ec\uae30\uc5d0\ub294 \ucda9\ub3cc\uc5d0 \ub300\ud55c \uc5ec\ub7ec \uc815\ubcf4\uac00 \ub2f4\uaca8\uc788\ub294\ub370, \uadf8 \uc911\uc5d0 \ucda9\ub3cc\uc9c0\uc810\uc5d0 \ub300\ud55c nomal vector\ub3c4 \ub4e4\uc5b4\uc788\ub2e4. \uc774\ub97c \uc774\uc6a9\ud574, Vector2\uc758 <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/classes\/class_vector2.html#class-vector2-method-bounce\">bounce(Vector2 normal)<\/a> \uc744 \uc774\uc6a9\ud558\uba74 \ubcbd\uc5d0\uc11c \ud295\uaca8\uc838 \ub098\uc624\ub294 \ubc29\ud5a5\uc744 \uad6c\ud560 \uc218 \uc788\uace0, \uc774\ub97c \uc774\uc6a9\ud574 \ubcbd\uacfc\uc758 \ucda9\ub3cc\uc744 \uad6c\ud604\ud560 \uc218 \uc788\ub2e4. \uc8fc\uc758\ud560 \uc810\uc740, Vector2\uc5d0 <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/classes\/class_vector2.html#class-vector2-method-reflect\">reflect()<\/a>\ub77c\ub294 \uba54\uc18c\ub4dc\ub3c4 \uc788\uc73c\ub098, mirrored \ub610\ub294 symmetric\uc774\ub780 \uc758\ubbf8\ub85c \ubca1\ud130\uc758 \uc218\ud559\uc801\uc778 \ubcc0\ud654\uc77c \ubfd0, \uc6b0\ub9ac\uac00 \uc6d0\ud558\ub294 \ubb3c\ub9ac\uc801\uc778 \ubc18\uc0ac\uac00 \uc544\ub2c8\ub2e4.  \uc774\ub294 \uc544\ub798 \uadf8\ub9bc\uc744 \ucc38\uc870\ud558\uc790.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"280\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/bounce_reflect.png\" alt=\"\" class=\"wp-image-1618\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/bounce_reflect.png 480w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/bounce_reflect-300x175.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><figcaption class=\"wp-element-caption\">bounce vs reflect<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\uc774\ub97c \uc774\uc6a9\ud558\uc5ec PongBall\uc758 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>var speed := 600\nvar direction := Vector2(-1, -1).normalized()\n\nfunc _physics_process(delta):\n\tvar collision_object = move_and_collide(direction * speed * delta)\n\tif collision_object:\n\t\tdirection = direction.bounce(collision_object.normal)\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> speed :<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">600<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> direction :<\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Vector2<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">-1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">-1<\/span><span style=\"color: #ADBAC7\">).<\/span><span style=\"color: #6CB6FF\">normalized<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">_physics_process<\/span><span style=\"color: #ADBAC7\">(delta):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> collision_object <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">move_and_collide<\/span><span style=\"color: #ADBAC7\">(direction * speed * delta)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> collision_object:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t\tdirection <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> direction.<\/span><span style=\"color: #6CB6FF\">bounce<\/span><span style=\"color: #ADBAC7\">(collision_object.normal)<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uc6b0\uc120, \uacf5\uc758 \uc18d\ub3c4\ub97c \uc815\uc758\ud558\uace0 \uc788\ub2e4. \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574, \uacf5\uc758 \uc9c4\ud589 \ubc29\ud5a5\uc740 45\ub3c4 \ubc29\ud5a5\uc73c\ub85c \uc6c0\uc9c1\uc774\ub3c4\ub85d \uc124\uc815\ud588\ub2e4. \uc55e\uc11c KinematicBody\uc758 \uacbd\uc6b0 \ubb3c\ub9ac\uc801 \uacc4\uc0b0\uc774 \ub4e4\uc5b4\uac00\ubbc0\ub85c _process()\ub300\uc2e0 _physics_process()\uc5d0\uc11c \ucc98\ub9ac\ud558\ub77c\ub294 \uac00\uc774\ub4dc\ub97c \uc92c\uc5c8\ub2e4. \ucf5c\ubc31 \ud568\uc218 \ub0b4\ubd80\uc5d0\uc11c\ub294 \ub9d0\ud55c\ub300\ub85c move_and_collide()\ub97c \uc774\uc6a9\ud574 \ucda9\ub3cc\uc2dc normal vector\ub97c \uc789\uc6a9\ud558\uace0 \uc788\uc73c\uba70, direction \ubca1\ud130\uc758 bounce()\ub97c \uc774\uc6a9\ud574 \ucda9\ub3cc \ud6c4 \uc9c4\ud589\ubc29\ud5a5\uc744 \uc0c8\ub85c \uc124\uc815\ud558\uace0 \uc788\ub2e4. \uc8fc\uc758\ud560\uc810\uc740, move_and_slide()\ub294 delta\uac12\uc744 \ud568\uc218 \ub0b4\ubd80\uc801\uc73c\ub85c \uacc4\uc0b0\ud574\uc11c \uc801\uc6a9\ud574 \uc8fc\uc9c0\ub9cc, move_and_collide()\ub294 delta\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294\ub2e4. \uadf8\ub7ec\ubbc0\ub85c delta\uac12\uc744 \uc9c1\uc811 \uacc4\uc0b0\ud558\uc5ec \uc778\uc790\ub85c \ub118\uaca8\uc8fc\uace0 \uc788\ub2e4. \uc77c\uad00\uc131\uc774 \uc5c6\ub294 \ubd80\ubd84\uc740 \uc880 \uc758\uc544\ud558\uc9c0\ub9cc, \uc77c\ub2e8\uc740 \uadf8\ub807\uac8c \ub3d9\uc791\ud558\ub2c8 \ud5f7\uac08\ub9ac\uc9c0 \ub9d0\uc790. \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574 \uc2e4\ud589\ud574\ubcf4\uc790. \uc798 \ub530\ub77c\uc654\ub2e4\uba74, \ubcbd\uc5d0 \ud295\uae30\uace0 \ub9c9\ub300\ub97c \uc6c0\uc9c1\uc5ec \uacf5\uc744 \ubc1b\uc544\ub0bc \uc218\ub3c4 \uc788\uc744 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\ub79c\ub364 \ub118\ubc84 \uc0dd\uc131<\/strong><\/h4>\n\n\n\n<p>\uc774\uc81c \uacf5\uc740 \uc6d0\ud558\ub294\ub300\ub85c \uc6c0\uc9c1\uc778\ub2e4. \ub2e4\ub9cc, \uc2dc\uc791\uc2dc \ubc29\ud5a5\uc774 \uace0\uc815\ub418\uc5b4 \uc788\ub2e4. \uc774\uac78 \ub79c\ub364\ud55c \ubc29\ud5a5\uc73c\ub85c \uc2dc\uc791\ud558\ub3c4\ub85d \uad6c\ud604\ud574\ubcf4\uc790. <\/p>\n\n\n\n<p> \ub79c\ub364\ub118\ubc84 \uc0dd\uc131\uc740 \uac8c\uc784\uc81c\uc791\uc5d0\uc11c \ud544\uc218\uc801\uc778 \uc694\uc18c\uc9c0\ub9cc, \uac8c\uc784\uc774 \uc544\ub2c8\ub354\ub77c\ub3c4 \ubaa8\ub4e0 \ud504\ub85c\uadf8\ub798\ubc0d \uc5b8\uc5b4\uc5d0\uc11c \uac70\uc758 \ub3d9\uc77c\ud558\uac8c \uad6c\ud604\ud558\uc5ec API\ub97c \uc81c\uacf5\ud55c\ub2e4. \ub79c\ub364\uac12\uc744 \uc0dd\uc131\ud558\ub294 \uac83\uc740 \uc774\ub860\uc801\uc73c\ub85c \ub9e4\uc6b0 \uc5b4\ub824\uc6b4 \uc77c\uc774\uc9c0\ub9cc, \uc81c\uacf5\ub418\ub294 API\uc758 \uc0ac\uc6a9\uc740 \uac04\ub2e8\ud558\ub2e4. \ub79c\ub364\uc740 \ud2b9\uc218\ud55c \uc218\uc2dd\uc744 \uc774\uc6a9\ud574\uc11c \ud638\ucd9c\ud560 \ub54c\ub9c8\ub2e4 \uc0c8\ub85c\uc6b4 \ub79c\ub364\uac12\uc744 \uc0dd\uc131\ud574 \ub3cc\ub824\uc8fc\ub294\ub370, \ucd5c\ucd08 \uc0dd\uc131\uc2dc seed\uac12\uc744 \ud544\uc694\ub85c \ud55c\ub2e4. \uac19\uc740 seed\uac12\uc744 \uc8fc\uba74 \ub9e4\ubc88 \ub611\uac19\uc740 \uc21c\uc11c\ub300\ub85c \uac19\uc740 \uac12\uc744 \ub3cc\ub824\uc8fc\ubbc0\ub85c, \ub79c\ub364\uac12\uc744 \uc5bb\uae30 \uc704\ud574\uc120 \uc774 seed\uac12\uc744 \ub2e4\ub974\uac8c \uc918\uc57c\ud55c\ub2e4. \uc774 seed\uac12\uc73c\ub85c \uac00\uc7a5 \uc720\ud6a8\ud55c \uac83\uc740 \ud604\uc7ac \uc2dc\uac04\uc758 \ubc00\ub9ac\uc138\ucee8\ub4dc\uac12\uc774\ub2e4. \uacc4\uc18d \ubcc0\ud654\ud558\ub294 \uac12\uc73c\ub85c \ub79c\ub364\uc758 seed\ub85c\ub294 \ucd5c\uc801\uc774\ub2e4. <\/p>\n\n\n\n<p> <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/tutorials\/math\/random_number_generation.html\">GDScript\uc5d0\uc11c\uc758 \ub79c\ub364\ub118\ubc84 \uc0dd\uc131\uc740 \uacf5\uc2dd \ubb38\uc11c<\/a>\uc5d0 \uc798 \uc18c\uac1c\ub418\uc5b4 \uc788\ub2e4.  \ubcf4\ud1b5 _ready() \ucf5c\ubc31\uc5d0\uc11c randomize()\ub97c \ud638\ucd9c\ud558\uc5ec seed\ub97c \ucd08\uae30\ud654\ud55c\ub2e4. seed\uac12\uc744 \ub530\ub85c \uc548\uc8fc\ub294 \uc774\uc720\ub294 randomize()\ud568\uc218 \ub0b4\ubd80\uc5d0\uc11c \ud604\uc7ac \uc2dc\uac04\uc758 \ud2f1\uac12\uc744 seed\ub85c \uc774\uc6a9\ud558\uc5ec \ub79c\ub364 \ub118\ubc84 \uc0dd\uc131\uae30\ub97c \ucd08\uae30\ud654 \ud574\uc8fc\uae30 \ub54c\ubb38\uc774\ub2e4. seed\uac12\uc744 \uc9c1\uc811 \uc8fc\uace0 \uc2f6\ub2e4\uba74, seed() \ud568\uc218\ub97c \uc774\uc6a9\ud574\ub3c4 \ub41c\ub2e4. \uc77c\ub2e8, randomize()\uac00 \ud55c\ubc88 \uc2e4\ud589 \ub410\ub2e4\uba74, \ub79c\ub364 \ub118\ubc84\ub97c \uc5bb\uc5b4\uc624\ub294 \ud568\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/classes\/class_%40gdscript.html#class-gdscript-method-randi\">randi()<\/a>\ub294 32\ube44\ud2b8 \uc815\uc218\uac12(0~4,294,967,295)\uc744 \ub3cc\ub824\uc900\ub2e4. \uc5ec\uae30\uc5d0 \ub098\uba38\uc9c0 \uc5f0\uc0b0\uc744 \uc0ac\uc6a9\ud558\uba74, \uc6d0\ud558\ub294 \uc815\uc218\ubc94\uc704 \uac12\uc744 \uc5bb\uc744 \uc218 \uc788\ub2e4. <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/classes\/class_%40gdscript.html#class-gdscript-method-randf\">randf()<\/a>\ub294 0~1\uc0ac\uc774\uc758 \uc2e4\uc218\uac12\uc744 \ub3cc\ub824\uc900\ub2e4. \uc6d0\ud558\ub294 \ubc94\uc704\uc758 \uc2e4\uc218\uac12\uc744 \uc5bb\uace0\uc790 \ud55c\ub2e4\uba74, randf()\ub85c\ubd80\ud130 \uc9c1\uc811 \uacc4\uc0b0\uc744 \ud574\ub3c4 \ub418\uc9c0\ub9cc, <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/classes\/class_%40gdscript.html#class-gdscript-method-rand-range\">rand_range(from, to)<\/a>\ub97c \uc774\uc6a9\ud574\ub3c4 \ub41c\ub2e4. <\/p>\n\n\n\n<p> \uc774\uc81c \ub2e4\uc2dc \uacf5\uc758 \uc2a4\ud06c\ub9bd\ud2b8 \ud30c\uc77c\ub85c \ub3cc\uc544\uac00\ubcf4\uc790. \uc6b0\uc120 _ready() \ucf5c\ubc31\ud568\uc218\uc5d0\uc11c randomize()\ub85c \ucd08\uae30\ud654\ud55c \ub4a4\uc5d0, \ub79c\ub364\uac12\uc744 \uc5bb\uc5b4\uc640 \uacf5\uc758 \ubc29\ud5a5\uc744 \uc815\ud574\ubcf4\uc790. \uc0dd\uac01\uc744 \uc870\uae08 \ud574\ubcf4\uc790\uba74, \uacf5\uc774 \uc218\uc9c1\uc73c\ub85c \uc704\uc544\ub798\ub85c \uc774\ub3d9\ud560 \uacbd\uc6b0, \uac8c\uc784\uc774 \ubd88\uac00\ub2a5\ud560 \uac83\uc774\ub2e4. \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc218\ud3c9\uc73c\ub85c \uc774\ub3d9\ud560 \uacbd\uc6b0, \uacf5\uc744 \ud53c\ud558\uc9c0 \uc54a\ub294 \uc774\uc0c1 \uac8c\uc784\uc774 \ub05d\ub098\uc9c0 \uc54a\uc744 \uac83\uc774\ub2e4. \uc6b0\ub9ac\uac00 \uc6d0\ud558\ub294\uac74 \uc801\ub2f9\ud55c \ub300\uac01\uc120 \ubc29\ud5a5\uc73c\ub85c \uc6c0\uc9c1\uc774\ub294 \uac83\uc774\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"409\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/angle.png\" alt=\"\" class=\"wp-image-1621\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/angle.png 500w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/angle-300x245.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n<\/div>\n\n\n<p>\uadf8\ub9bc\uacfc \uac19\uc740 \ubc94\uc704\ub0b4\uc5d0\uc11c\ub9cc \ubc29\ud5a5\uc744 \uc815\ud558\ub824\uba74 \uc800 \ubc94\uc704\ub0b4 \uac01\ub3c4\ub97c \ub79c\ub364\uc73c\ub85c \uc0dd\uc131\ud558\uba74 \ub420 \uac83\uc774\ub2e4. rand_range(30, 70)\uc815\ub3c4\ub97c \uc8fc\uba74, 30\ub3c4\uc5d0\uc11c 70\ub3c4 \uc0ac\uc774 \uac12\uc744 \uc5bb\uc5b4\uc62c \uc218 \uc788\ub2e4. \ub2e4\uc74c\uc740 4\uc0ac\ubd84\uba74\uc758 \ubc29\ud5a5\uc744 \uc815\ud574\uc918\uc57c \ud558\ub294\ub370, (1, 1), (1, -1), (-1, 1), (-1, -1) \uc911\uc5d0\uc11c \ud558\ub098\ub97c \ub79c\ub364\uc73c\ub85c \uace8\ub77c \uacf1\ud574\uc8fc\uba74\ub41c\ub2e4. \uc774\uac78 \ucf54\ub4dc\ub85c \uad6c\ud604\ud574\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func _ready():\n\trandomize()\n\tinit_random_direction()\n...\n\nfunc init_random_direction():\n\tvar angle = deg2rad(rand_range(30, 70))\n\tdirection.x = cos(angle) * &#91;-1, 1&#93;&#91;randi() % 2&#93;\n\tdirection.y = sin(angle) * &#91;-1, 1&#93;&#91;randi() % 2&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">_ready<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #6CB6FF\">randomize<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #6CB6FF\">init_random_direction<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">init_random_direction<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> angle <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">deg2rad<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">rand_range<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">30<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">70<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\tdirection.x <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">cos<\/span><span style=\"color: #ADBAC7\">(angle) <\/span><span style=\"color: #F47067\">*<\/span><span style=\"color: #ADBAC7\"> &#91;<\/span><span style=\"color: #6CB6FF\">-1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">&#93;&#91;<\/span><span style=\"color: #6CB6FF\">randi<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">%<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\tdirection.y <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">sin<\/span><span style=\"color: #ADBAC7\">(angle) <\/span><span style=\"color: #F47067\">*<\/span><span style=\"color: #ADBAC7\"> &#91;<\/span><span style=\"color: #6CB6FF\">-1<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">1<\/span><span style=\"color: #ADBAC7\">&#93;&#91;<\/span><span style=\"color: #6CB6FF\">randi<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">%<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">2<\/span><span style=\"color: #ADBAC7\">&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucf54\ub4dc\ub97c \ubcf4\uba74, \ub79c\ub364 \ubc29\ud5a5\uc744 \uad6c\ud558\ub294 init_random_direction() \ud568\uc218\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. 30~70\ub3c4 \uac12\uc744 rand_range()\ub85c \uc5bb\uc5b4\uc624\ub294\ub370 \uc774\uac12\uc740 degree\uc774\ubbc0\ub85c, \uacc4\uc0b0\uc744 \uc704\ud574 deg2rad()\ub97c \uc774\uc6a9\ud574 radian\uac12\uc73c\ub85c \ubcc0\ud658\ud574\uc92c\ub2e4. \uc774 angle\uac12\uc758 \ucf54\uc0ac\uc778\uac12\uc774 X, \uc0ac\uc778\uac12\uc774 Y\uc778\ub370, \uc5ec\uae30\uc5d0 \ub79c\ub364\ud558\uac8c 1 \ub610\ub294 -1\uc744 \uacf1\ud574\uc918\uc11c \ubc29\ud5a5\uc744 \ub79c\ub364\ud558\uac8c \uc0dd\uc131\ud558\uace0 \uc788\ub2e4. [-1, 1][randi() %2] \ud45c\ud604\uc744 \ud574\uc11d\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.  [-1, 1] \ubc30\uc5f4\uc5d0\uc11c \ubc30\uc5f4 \uc778\ub371\uc2a4\ub97c randi() % 2\ub85c 0 \ub610\ub294 1\uc744 \uc8fc\uac8c \ub41c\ub2e4. \uacb0\uacfc\uc801\uc73c\ub85c [-1, 1][0] \uc774\ub418\uba74 \ubc30\uc5f4\uc758 \uccab\ubc88\uc9f8 \uc778\ub371\uc2a4 \uc774\ubbc0\ub85c -1\uac12\uc774 \ub9ac\ud134\ub418\uace0, [-1,1][1]\uc774 \ub418\uba74 \ubc30\uc5f4\uc758 \ub450\ubc88\uc9f8 \uc778\ub371\uc2a4 \uc774\ubbc0\ub85c 1\uc774 \ub9ac\ud134\ub41c\ub2e4. \uc774\uc81c \uc2e4\ud589\ud574\uc11c \ud14c\uc2a4\ud2b8 \ud574\ubcf4\uba74 \uc801\ub2f9\ud788 \uc798 \ub3d9\uc791\ud558\ub294\uac70 \uac19\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\uac00\uc7a5 \uae30\ucd08\uc801\uc778 \uc0c1\ub300 \uc54c\uace0\ub9ac\uc998\uc758 \uad6c\ud604<\/strong><\/h4>\n\n\n\n<p> \ud50c\ub808\uc774\uc5b4\uc758 \uc2a4\ud2f1\ub3c4 \uc6c0\uc9c1\uc774\uace0 \uacf5\ub3c4 \uc6c0\uc9c1\uc778\ub2e4. \uc774\uc81c, \uc0c1\ub300\ubc29 \ucef4\ud4e8\ud130 \uc2a4\ud2f1\ub3c4 \uc790\ub3d9\uc73c\ub85c \uc6c0\uc9c1\uc774\uac8c \ub9cc\ub4e4\uc5b4\ubcf4\uc790.  \uc0c1\ub300\ubc29 \ucef4\ud4e8\ud130\ub97c AI\ub77c\uace0 \ub9d0\ud558\ub824\ub2e4\uac00 \uc694\uc998 AI\ub294 \uc9c4\uc9dc \ub108\ubb34 \uace0\ub3c4\ud654\ub418\uc11c \uc774\ub7f0 \ud45c\ud604\uc744 \uc4f0\uae30\uac00 \uaebc\ub824\uc9c4\ub2e4. \uc5ec\uae30\uc11c\ub294 \ub300\uc2e0 \uac04\ub2e8\ud55c \uc54c\uace0\ub9ac\uc998\uc774\ub77c\uace0 \ud558\uaca0\ub2e4.  <\/p>\n\n\n\n<p> \uac00\uc7a5 \uae30\ubcf8\uc801\uc778 \uc804\uc81c\ub294 \uc801\ub2f9\ud788 \ubcfc\uc744 \ubc1b\uc544\ub0b4\uc11c \ub7a0\ub9ac\uac00 \uac00\ub2a5\ud558\uac8c \ud574\uc57c\uaca0\uc9c0\ub9cc, \uc644\ubcbd\ud558\uba74 \uc548\ub418\uace0 \ubcfc\uc744 \ud758\ub824\uc11c \ud328\ubc30\uac00 \uac00\ub2a5\ud574\uc57c \ud55c\ub2e4. \ud30c\uace0\ub4e0\ub2e4\uba74 \uc26c\uc6b4\uc77c\uc740 \uc544\ub2cc\ub370, \uc5ec\uae30\uc11c\ub294 <a href=\"https:\/\/www.youtube.com\/watch?v=kr1BoEbuveI&amp;list=RDCMUCznj32AM2r98hZfTxrRo9bQ\">Learn Godot by creating Pong<\/a> \uc601\uc0c1\uc5d0\uc11c \ub098\uc628 \uad6c\ud604\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uaca0\ub2e4. \uae30\ucd08\uc801\uc778 \uc54c\uace0\ub9ac\uc998\uc774\uba70, \uc774 \ubd80\ubd84\uc744 \uc5b4\ub5bb\uac8c \uad6c\ud604\ud558\ub290\ub0d0\uc5d0 \ub530\ub77c Pong\uac8c\uc784\uc774 \ub2ec\ub77c\uc9c8 \uc218\ub3c4 \uc788\uc744 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<p>Pong Level \ub178\ub4dc\ud2b8\ub9ac\uc5d0\uc11c OpponentStick\uc5d0 Attach Script\ub97c \uc774\uc6a9\ud574 Script\ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc900\ub2e4. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"379\" height=\"338\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2022\/09\/op_script.png\" alt=\"\" class=\"wp-image-1624\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/op_script.png 379w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2022\/09\/op_script-300x268.png 300w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/figure>\n<\/div>\n\n\n<p>\ucef4\ud4e8\ud130 \uc0c1\ub300\uc758 \uc54c\uace0\ub9ac\uc998\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \ubcfc\uc744 \ub530\ub77c \uc6c0\uc9c1\uc774\ub294 \uac83\uc774\ub2e4. \uadf8\ub7f4\ub824\uba74 PongBall\uc758 \uc704\uce58\uc815\ubcf4\uac00 \ud544\uc694\ud558\ub2e4. \ub2e4\ub978 \ub178\ub4dc\ub97c \ucc38\uc870\ud558\ub294 \ubc29\ubc95\uc740 Node\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ud568\uc218\ub4e4\uc744 \uc774\uc6a9\ud558\uba74 \ub41c\ub2e4. \uc5ec\uae30\uc5d0\uc120 <a href=\"https:\/\/docs.godotengine.org\/ko\/stable\/classes\/class_node.html#class-node-method-get-node\">get_node(&#8220;node path&#8221;)<\/a>\ub97c \uc774\uc6a9\ud560 \uac83\uc774\ub2e4. \uc774 \ud568\uc218\ub294 \ub9c8\uce58 \ub514\ub809\ud1a0\ub9ac\ub97c \ud0d0\uc0c9\ud558\ub4ef \uacbd\ub85c\ub97c \uc778\uc790\ub85c \ub118\uaca8 \ud574\ub2f9 \ub178\ub4dc\ub97c \uac00\uc838\uc62c \uc218 \uc788\ub2e4. \uc774\ub97c \uc774\uc6a9\ud558\uc5ec \uba3c\uc800 _ready() \ucf5c\ubc31\ud568\uc218\uc5d0\uc11c PongBall\uc758 \ucc38\uc870\ub97c \uad6c\ud55c\ub2e4. \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>export var speed = 300\nvar pongBall : KinematicBody2D\n\nfunc _ready():\n\t#pongBall = get_node(\"..\/PongBall\")\n\tpongBall = $\"..\/PongBall\"\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">export<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> speed <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">300<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> pongBall : <\/span><span style=\"color: #F69D50\">KinematicBody2D<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">_ready<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #768390\">#pongBall = get_node(&quot;..\/PongBall&quot;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\tpongBall <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">$&quot;..\/PongBall&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uba74, \uba3c\uc800 speed \ubcc0\uc218\ub97c \uc815\uc758\ud588\ub2e4. 300\uc740 \uacf5\uc774\ub098 \ud50c\ub808\uc774\uc5b4 \uc2a4\ud2f1\ubcf4\ub2e4 \ub290\ub9b0 \uc18d\ub3c4\uc774\ub2e4. \uba87\ubc88\uc758 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \uc801\uc808\ud55c \uc218\uce58\ub77c \uc0dd\uac01\ub418\uc5b4 \uc124\uc815\ud55c \uac12\uc774\ub2e4. export\ub85c \uc120\uc5b8\ud574\uc11c \ub514\ubc84\uae45 \ubaa8\ub4dc\uc5d0\uc11c \uac12\uc744 \ubcc0\ud654\ud558\uba70 \ud14c\uc2a4\ud2b8\uac00 \uac00\ub2a5\ud558\ub3c4\ub85d \ud558\uc600\uc9c0\ub9cc, \ud604\uc7ac\ub294 \uacf5\uc774 \ub098\uac00\uba74 \uac8c\uc784\uc774 \uc9c4\ud589\uc774 \uc548\ub418\ubbc0\ub85c \ud070 \uc758\ubbf8\ub294 \uc5c6\ub2e4. \uacf5\uc774 \ub098\uac00\uba74 \uac8c\uc784\uc774 \ub2e4\uc2dc \uc2dc\uc791\ub418\ub3c4\ub85d \ud558\ub294\uac78 \ub098\uc911\uc5d0 \uad6c\ud604\ud574\uc57c \ud55c\ub2e4. \ub2e4\uc74c, pongBall\uc740 PongBall\ub178\ub4dc\uc758 \ucc38\uc870\ub97c \uc800\uc7a5\ud560 \ubcc0\uc218\uc774\ub2e4. \uac8c\uc784 \uc2dc\uc791\uc2dc, _ready() \ucf5c\ubc31\ud568\uc218 \ub0b4\uc5d0\uc11c  get_node()\ub85c \ucc38\uc870\ub97c \uac00\uc838\uc628\ub2e4. get_node()\ub294 &#8216;$'(dollar sign)\uc73c\ub85c \ub300\uccb4\ud574\uc11c \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4. \uc774 \uc0ac\uc6a9\ubc95\uc744 \uc124\uba85\ud558\uae30 \uc704\ud574 \uc758\ub3c4\uc801\uc73c\ub85c \uc0ac\uc6a9\ud574\ubd24\ub2e4. &#8216;$&#8217;\ud45c\uc2dc\ubc29\ubc95\uc740 \ub178\ub4dc\ub97c \ucc38\uc870\ud558\ub294 \uc77c\uc740 \uc790\uc8fc \uc788\uae30 \ub54c\ubb38\uc5d0 \ud3b8\uc758\uc0c1 \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\uc774\ub2e4. \ubd80\ubaa8\ub85c \uc62c\ub77c\uac00\uc11c \ucc38\uc870\ud588\uae30 \ub54c\ubb38\uc5d0 &#8220;..\/PongBall&#8221;\ub85c \uc0ac\uc6a9\ud588\uc9c0\ub9cc, \ubc14\ub85c \uc790\uc2dd\ub178\ub4dc\uc5d0 \ub300\ud574\uc120 \ub530\uc634\ud45c \uc5c6\uc774 \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<p>\uc774\uc81c, \uc5bb\uc5b4\uc628 PongBall\uc758 \ucc38\uc870\ub97c \uc774\uc6a9\ud558\uc5ec \uacf5\uc758 \uc2e4\uc2dc\uac04 \uc704\uce58\uc815\ubcf4\ub97c \uc5bb\uc5b4\uc640 \ub530\ub77c\uac00\uc900\ub2e4. \ub808\ud37c\ub7f0\uc2a4 \uc601\uc0c1\uc5d0\uc11c \uc18c\uac1c\ub41c \uc54c\uace0\ub9ac\uc998\uc744 \uc368\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func _physics_process(delta):\n\tmove_and_slide(Vector2(0, get_opponent_direction()) * speed)\n\nfunc get_opponent_direction():\n\tif abs(pongBall.position.y - position.y) > 25:\n\t\tif pongBall.position.y > position.y: return 1\n\t\telse: return -1\n\telse: return 0<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">_physics_process<\/span><span style=\"color: #ADBAC7\">(delta):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #6CB6FF\">move_and_slide<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector2<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">get_opponent_direction<\/span><span style=\"color: #ADBAC7\">()) * speed)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">get_opponent_direction<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">abs<\/span><span style=\"color: #ADBAC7\">(pongBall.position.y - position.y) <\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">25<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t\t<\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> pongBall.position.y <\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> position.y: <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t\t<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">-1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\uacf5\uc744 \ub530\ub77c\uac00\ub294 \uc704\uce58\ub97c \uacc4\uc0b0\ud558\uae30\uc704\ud574 get_opponent_direction() \ud568\uc218\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \uba3c\uc800, 25\ubcf4\ub2e4 \ucc28\uc774\uac00 \ud06c\uc9c0 \uc54a\uc73c\uba74 \uc6c0\uc9c1\uc774\uc9c0 \uc54a\uac8c \ud574\ub1a8\ub2e4. \uc774\uac83\uc740 \uacf5\uc758 \uc791\uc740 \uc6c0\uc9c1\uc784\uc5d0 \ubc18\uc751\ud558\uc9c0 \uc54a\uac8c\ud558\uace0, \ub530\ub77c\uac00\uae30 \uc2dc\uc791\ud558\ub294\ub370 \ub51c\ub808\uc774\ub97c \ub9cc\ub4e4\uc5b4\uc900\ub2e4.  \ucc28\uc774\uac00 25 \uc774\uc0c1\uc73c\ub85c \ubc8c\uc5b4\uc9c0\uac8c \ub418\uba74, \uacf5\uc774 \uc704\ucabd\uc778\uc9c0 \uc544\ub798\ucabd\uc778\uc9c0\uc5d0 \ub530\ub77c +Y\ubc29\ud5a5(1), -Y\ubc29\ud5a5(-1)\uc744 \ub9ac\ud134\ud574\uc900\ub2e4. \uc774 \ubc29\ud5a5\uac12\uc744 \uac00\uc9c0\uace0, _physics_process()\ub0b4\uc5d0\uc11c move_and_slide()\ub97c \uc774\uc6a9\ud558\uc5ec \uc6c0\uc9c1\uc5ec\uc900\ub2e4. \uc644\uc131\ub41c \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>extends KinematicBody2D\n\nexport var speed = 300\nvar pongBall : KinematicBody2D\n\nfunc _ready():\n\t#pongBall = get_node(\"..\/PongBall\")\n\tpongBall = $\"..\/PongBall\"\n\t\nfunc _physics_process(delta):\n\tmove_and_slide(Vector2(0, get_opponent_direction()) * speed)\n\nfunc get_opponent_direction():\n\tif abs(pongBall.position.y - position.y) > 25:\n\t\tif pongBall.position.y > position.y: return 1\n\t\telse: return -1\n\telse: return 0\n\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">extends<\/span><span style=\"color: #6CB6FF\"> KinematicBody2D<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">export<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> speed <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">300<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> pongBall : <\/span><span style=\"color: #F69D50\">KinematicBody2D<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">_ready<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #768390\">#pongBall = get_node(&quot;..\/PongBall&quot;)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\tpongBall <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">$&quot;..\/PongBall&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">_physics_process<\/span><span style=\"color: #ADBAC7\">(delta):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #6CB6FF\">move_and_slide<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">Vector2<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #6CB6FF\">0<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">get_opponent_direction<\/span><span style=\"color: #ADBAC7\">()) * speed)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">func<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">get_opponent_direction<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">abs<\/span><span style=\"color: #ADBAC7\">(pongBall.position.y - position.y) <\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">25<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t\t<\/span><span style=\"color: #F47067\">if<\/span><span style=\"color: #ADBAC7\"> pongBall.position.y <\/span><span style=\"color: #F47067\">&gt;<\/span><span style=\"color: #ADBAC7\"> position.y: <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t\t<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">-1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">\t<\/span><span style=\"color: #F47067\">else<\/span><span style=\"color: #ADBAC7\">: <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p> \uc774 \ub2e8\uc21c\ud55c \uc54c\uace0\ub9ac\uc998\uc5d0\uc11c, \ucef4\ud4e8\ud130\uc758 \ub09c\uc774\ub3c4\ub97c \uc815\ud558\ub294 \uc218\uce58\ub294 speed \uac12\uacfc get_opponent_direction()\uc5d0 \uc788\ub294 \uc704\uce58 \ucc28\uc774 25\uc5d0 \ub530\ub77c\uac08 \uac83\uc774\ub2e4. \ub300\ucda9 \ub3d9\uc791\ud558\uac8c \ub9cc\ub4e0\uac8c speed = 300\uc778\ub370, \uc0c1\uc6a9 \uac8c\uc784\uc774\ub77c\uba74 \uc218\ub9ce\uc740 \ud14c\uc2a4\ud2b8\ub97c \uac70\uce58\uba70 \uc2dc\ud5d8\ud558\uace0 \uad6c\ud604\ud558\uba70 \uc870\uc815\ud574\uc57c \ud560 \uac83\uc774\ub2e4. \uc5ec\uae30\uc11c\ub294 \uc801\ub2f9\ud788 \ub3d9\uc791\ub9cc \ud558\ub294 \uc218\uc900\uc5d0\uc11c \ub9cc\uc871\ud558\uc790.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\uc774 \ub2e4\uc74c\uc5d0 \ud574\uc57c\ud560 \uc77c\uc740?<\/strong><\/h4>\n\n\n\n<p> \uac8c\uc784\uc758 \uae30\ubcf8\uc801\uc778 \ub3d9\uc791\uc740 \uc774\ub807\uac8c \uad6c\ud604\uc774 \ub418\uc5c8\ub2e4. \uc774\uc81c \ub0a8\uc740 \uac83\uc740 UI\ub97c \ucd94\uac00\ud558\uace0 \uac8c\uc784\uc744 \ud3f4\ub9ac\uc2f1\ud560 \ub2e8\uacc4\uc774\uae30 \ub54c\ubb38\uc774\ub2e4. \ubcf4\ud1b5, \uc774\uc815\ub3c4 \uc2dc\uc810\uc774 \uace0\ube44\ub2e4. \uae30\ub2a5\uc740 \uad6c\ud604\ud55c\uac70 \uac19\uace0, \ud3f4\ub9ac\uc2f1 \uc791\uc5c5\uc740 \uc0dd\uac01\ubcf4\ub2e4 \ud6e8\uc52c \uc624\ub798\uac78\ub9ac\uae30 \ub54c\ubb38\uc5d0 \uc815\ub9d0 \uc9c0\ub8e8\ud558\uba70 \ud558\uae30 \uc2eb\uc5b4 \ubbf8\ub8e8\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4. \uc5b4\ub5bb\uac8c \ubcf4\uba74 \uac00\uc7a5 \uc911\uc694\ud55c \ub2e8\uacc4\uc774\uae30 \ub54c\ubb38\uc5d0, \ub9c8\uc9c0\ub9c9 \uc644\uc131\uae4c\uc9c0 \ud3ec\uae30\ud558\uc9c0 \ub9d0\uc790. \uc774\uac74 \ub0b4 \uc2a4\uc2a4\ub85c\uc5d0\uac8c \ud558\ub294 \ub9d0\uc774\uae30\ub3c4 \ud558\ub2e4. <\/p>\n\n\n\n<p> \ud3f4\ub9ac\uc2f1 \uc791\uc5c5\uc740 \uc6d0\ub798 \ud798\ub4e4\uc9c0\ub9cc, \uc774\uac74 \ucf54\ub531\uc9c0\ub9cc\ud55c \ud29c\ud1a0\ub9ac\uc5bc\uc774\uae30 \ub54c\ubb38\uc5d0 \ud574\uc57c\ud560 \uc77c\uc774 \ub9ce\uc9c0 \uc54a\uc73c\ub2c8 \uac71\uc815\ud558\uc9c0 \ub9d0\uc790. \uc77c\ub2e8, \ub4dd\uc810\uc744 \ud558\ub294 \uacbd\uc6b0, \uc2a4\ucf54\uc5b4\ub97c \ud45c\uc2dc\ud574\uc57c \ud558\uba70, \uacf5\uc758 \uc704\uce58\ub97c \ucd08\uae30\ud654\ud574\uc11c \ub2e4\uc2dc \uac8c\uc784\uc774 \uc2dc\uc791\ub418\ub3c4\ub85d \ud574\uc57c \ud55c\ub2e4. \uc774 \ub2e8\uacc4\uc5d0\uc11c \ud0c0\uc774\uba38\ub97c \uc0ac\uc6a9\ud574 \ubcfc \uac83\uc774\ub2e4. \uadf8\ub9ac\uace0 \uc900\ube44\ub41c \uc791\uc740 \uc0ac\uc6b4\ub4dc \ud30c\uc77c\uc744 \ucd94\uac00\ud574 \uc644\uc131\ud558\uc790. \ub9c8\uc9c0\ub9c9 \ub2e8\uacc4\ub294 \ub2e4\uc74c \ud3ec\uc2a4\ud305\uc73c\ub85c~<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ubcbd \uc138\uc6b0\uae30 \uc800\ubc88\uae00\uc5d0 \uc774\uc5b4 \uc791\uc5c5\uc744 \uacc4\uc18d\ud574\ubcf4\uc790. PlayerStick\uc740 \uc704\uc544\ub798\ub85c \uc6c0\uc9c1\uc774\uae30 \uc2dc\uc791\ud588\uc9c0\ub9cc, \ud654\uba74 \ub118\uc5b4\uae4c\uc9c0 \ub118\uc5b4\uac14\uc5c8\ub2e4. \ud574\uacb0 \ubc29\ubc95\uc740 \uc5ec\ub7ec\uac00\uc9c0\uac00 \uc788\uaca0\uc9c0\ub9cc, \ub098\uc911\uc5d0 \uacf5\ub3c4 \ud295\uaca8\ub0b4\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \uc704 \uc544\ub798\ub85c \ubcbd\uc744 \uc138\uc6cc\ubcf4\uc790. Pong Level \uc52c\uc744 \uc5f4\uace0 KinematicBody2D\ub97c \ucd94\uac00\ud55c\ub2e4. \uc55e\uc5d0\uc11c \ub2e4\ub918\ub2e4\uc2dc\ud53c, CollisionShape2D\uac00 \ud544\uc694\ud558\ub2e4. \uc774\ub984\uc744 WallTop\uc73c\ub85c \ubc14\uafd4\uc900 \ud6c4, CollisionShape2D\ub97c \uc790\uc2dd \ub178\ub4dc\ub85c \ucd94\uac00\ud55c\ub2e4. CollisionShape2D\ub97c \uc120\ud0dd\ud55c \ud6c4, Inspector &gt; Shape \ud56d\ubaa9\uc5d0\uc11c RectangleShape2D\ub97c \uc120\ud0dd\ud574\uc900\ub2e4. \uc5ec\uae30\uae4c\uc9c0 \ud558\uba74, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[270],"tags":[272,271,275,188],"class_list":["post-1601","post","type-post","status-publish","format-standard","hentry","category-godot","tag-game","tag-godot","tag-pong","tag-tutorial"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=1601"}],"version-history":[{"count":18,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1601\/revisions"}],"predecessor-version":[{"id":3458,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/1601\/revisions\/3458"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=1601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=1601"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=1601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}