Godot教程中文版-一个简单的2D游戏(Simple 2D Game,Pong!)

本文介绍如何使用Godot游戏引擎创建一个基本的2D乒乓球游戏。包括场景搭建、输入动作配置及游戏逻辑实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

乒乓球 Pong

在这个简单的教程中,我们会创建一个基本的乒乓球游戏。在引擎的演示中有很多复杂的例子,但是这里应该介绍一个具备基本功能的2D游戏。

资源 Assets

这个教程包含以下资源:乒乓垫,乒乓球,临界线

场景设置 Scene Setup

在以前,游戏是设定在640*400的分辨率的。分辨率的设置可以在工程配置project setting中进行设置。默认背景颜色应该设置为黑色:


在工程的根目录创建一个Node2D类型的节点,它是2D引擎中最基础的节点类型。然后,添加一些精灵(Sprite 类型节点)以及它们自身的纹理,最后的场景是很下面的相同的(注意:乒乓球是在中间的)


场景的树层级结构,看起来和下面的是相同的:


保存场景为“pong.scn”,并且设置它为工程属性的主场景(main_scene)

Input Actions Setup 输入动作配置

有很多输入的方法是专为游戏准备的,如Keyboard,Joypad,Mouse,TouchScreen(MutiTouch)。然而,这只是一个乒乓球游戏,它只需要控制乒乓球垫的上下移动。

处理所有的输入方法可能会令人诅丧并且需要写很多的代码。事实是,因为很多游戏允许控制者自定义从而导致了处理输入变得糟糕的。在这里,Godot创建了输入动作,一个动作被定义,那么对应激活它的方法就会被添加。

再次打开工程属性对话框,但是这次选择“Input Map”标签,并且在上面添加4个动作:

"left_move_up","left_move_down","right_move_up","right_move_down",绑定你需要使用的键值。左边的是A/Z,右边的是Up/Down

如下图:


Script

为当前的场景的根节点创建一个脚本并且打开它(前面的课程已经讲过),脚本会继承自Node2D:

extends Node2D

func _ready():
    pass
在构造函数中,两件事需要完成。一是使得processing可以进行,而是保存一些有用的值。例如窗口Screen和Pad的尺寸大小。
extends Node2D

var screen_size
var pad_size

func _ready():
    screen_size = get_viewport_rect().size
    pad_size = get_node("left").get_texture().get_size()
    set_process(true)
然后在游戏中添加一些需要使用到的值:
#speed of the ball (in pixels/second0

var ball_speed = 80
#direction of the ball (normal vector)

var direction = Vector2(-1,0)
#constant for pad speed (also in pixels/second)

const PAD_SPEED = 150
最后,处理函数:
func _process(delta):
获得一些计算需要使用的值,首先是球的位置,还有垫的矩形(Rect2)区域,精灵Sprites是以纹理的中心点为参考的,所以一个小的调整(size/2)是需要添加的:
  var ball_pos = get_node("ball").get_pos()
    var left_rect = Rect2( get_node("left").get_pos() - pad_size/2, pad_size )
    var right_rect = Rect2( get_node("right").get_pos() - pad_size/2, pad_size )
由于球的坐标可以获取,所以整合它应该会简单了:
 ball_pos+=direction*ball_speed*delta
然后,球就会有一个新的坐标了,它应该检测所有的东西,首先是地板和屋顶:
if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)):
        direction.y = -direction.y
如果一个垫被触碰到了,那么改变球的方向并且增加一点速度:
if ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)):
        direction.x=-direction.x
        ball_speed*=1.1
        direction.y=randf()*2.0-1
        direction = direction.normalized()
如果球跑出了屏幕外,那么游戏结束。游戏重新开始:
if (ball_pos.x<0 or ball_pos.x>screen_size.x):
        ball_pos=screen_size*0.5 #ball goes to screen center
        ball_speed=80
        direction=Vector2(-1,0)
当关于球的东西都完成了,更新球的节点的位置:
get_node("ball").set_pos(ball_pos)
根据玩家的输入更新垫的位置,在这里,输入类就变得很重要了:
 #move left pad  
    var left_pos = get_node("left").get_pos()

    if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")):
        left_pos.y+=-PAD_SPEED*delta
    if (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")):
        left_pos.y+=PAD_SPEED*delta

    get_node("left").set_pos(left_pos)

    #move right pad 
    var right_pos = get_node("right").get_pos()

    if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")):
        right_pos.y+=-PAD_SPEED*delta
    if (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")):
        right_pos.y+=PAD_SPEED*delta

    get_node("right").set_pos(right_pos)
这就是一个简单的2D游戏!在这里,一个简单乒乓球游戏通过几行代码就完成了。
所上传的为Eclipse工作空间 在一片广阔的草地上。。。被无数的树精入侵。。。 而出生在这片草地的你。。必然要拯救这片草地^^ 哈哈。。。我也会编泡菜剧情拉。。。。 这个。。测试版地游戏。。。 只有这一个地图。。。再加上BOSS和其他的地图。。就可以成为一款完整的游戏了 在游戏中数字键1使用火球术 数字键2使用抗拒火环(如果已经习得的话),该技能攻击人物附近的所有敌人,并推开敌人,随着等级的增长攻击力越高,对于这个之后树精的地图。。我特别推荐这个技能。。吼吼 数字键3使用雷电术(如果已经习得的话),该技能攻击屏幕内的3个敌人,并使其晕悬1秒,随着等级的增长攻击的人数越多,攻击力也越高,晕悬时间越长。。。在未来的地图中。。大量的远程怪。。这个技能就显的很有用拉。。。而在这个地图上。。。呵呵。。。一点用处没有-- 按F1键 使用气血丹,补充气血(如果有的话) 按F2键 使用凝神丹,补充技力(如果有的话) 按F3键。。。哈哈。。。。当地图上的所有怪都杀光之后你是否觉得没杀够呢。。不要紧。。按F3键就会重新再刷出一地图的树精!!!哈哈哈。。 ESC键可以查看人物属性 和使用道具 嘿嘿。。道具是如何获得的呢。。。每杀死一个怪物就会得到2G。。。。而所有的道具都是在NPC那买地 NPC在哪呢???在地图的中央 。。自己去找吧。。。哦。。对。。。站在NPC的身上 按空格键。。就可以购买物品拉。。。。。ESC键退出和NPC的对话。。。 恩。。。已经介绍的差不多拉。。。。 本引擎是完全由本人制作。。。。一点点的摸索。。花了尽1个月的时间哦。。。 接受高手的批评。。。QQ89631718,群18978079 喜欢用JAVA做游戏的朋友+我的QQ,或者群大家一起讨论。。。自己摸索实在摸索不出个所以然来。。更欢迎高手光临指导~~~ (提醒。。。本游戏为javaApplet,bin目录下start.html执行游戏。。。。没有JAVA平台和浏览器支持是运行不了的)
学习 Godot 引擎的零基础入门,可以通过以下几个关键方面来逐步掌握核心知识并进行开发实践。 ### 一、了解 Godot 的基础概念 在开始学习之前,首先需要理解 Godot 的基本架构和设计思想。Godot 使用**节点(Node)**作为构建游戏逻辑的基本单位,多个节点可以组成一个**场景(Scene)**,场景之间可以相互嵌套和管理。此外,Godot 中的**资源(Resource)**用于存储数据,如图像、音频、脚本等。**信号(Signal)**机制允许节点之间进行通信和事件响应,是实现游戏逻辑的重要方式[^2]。 ### 二、安装 Godot 引擎 前往 [Godot 官网](https://godotengine.org/) 下载适合你操作系统的版本(支持 Windows、macOS、Linux)。安装完成后,启动编辑器并熟悉其界面布局,包括: - 场景树(Scene Tree)面板 - 资源浏览器(FileSystem) - 属性检查器(Inspector) - 2D/3D 编辑视图 熟悉这些界面元素将有助于更高效地组织和管理游戏资源与逻辑。 ### 三、学习官方文档与社区资源 Godot 的官方文档非常详尽,涵盖了从基础操作到高级功能的使用说明,是学习过程中不可或缺的参考资料。此外,活跃的社区提供了丰富的教程、插件和示例项目,可以帮助解决开发中遇到的具体问题。访问 [Godot 官方文档](https://docs.godotengine.org/) 和 [Godot 社区论坛](https://godotengine.org/qa/) 可获取最新信息和交流经验[^1]。 ### 四、实践项目:制作一个简单2D 游戏 从实践角度出发,建议从一个简单2D 游戏开始,例如“移动小球”或“跳跃平台”。以下是实现基础控制的步骤: 1. 创建一个新的 2D 场景,添加一个 `KinematicBody2D` 节点作为玩家角色。 2. 在该节点下添加 `Sprite` 和 `CollisionShape2D` 组件,设置好纹理和碰撞体。 3. 编写脚本控制角色移动,使用 `Input` 类检测按键输入。 例如,使用 GDScript 实现角色移动控制: ```gdscript extends KinematicBody2D var speed = 200 func _process(delta): var direction = Vector2.ZERO if Input.is_action_pressed("ui_right"): direction.x += 1 if Input.is_action_pressed("ui_left"): direction.x -= 1 if Input.is_action_pressed("ui_down"): direction.y += 1 if Input.is_action_pressed("ui_up"): direction.y -= 1 move_and_slide(direction * speed) ``` 4. 在“项目设置”中配置输入映射,将键盘按键绑定到对应的动作(如 `ui_left`、`ui_right` 等),以便脚本可以识别玩家输入[^3]。 ### 五、持续学习与进阶路径 完成基础项目后,可以逐步学习以下内容: - 动画系统(AnimationPlayer) - 粒子系统(Particles2D- UI 界面设计(Control 节点) - 场景切换与加载 - 保存与读取游戏数据 - 打包发布游戏到不同平台 通过不断实践和查阅文档,能够逐步掌握 Godot 的高级功能,并提升开发能力。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值