下载客户端

如何制作乒乓球

2026-02-14 16:00:13
发布在Godot Engine
转载

AI智能总结导读

这是一份在Godot引擎制作乒乓球游戏的教程,涵盖场景设置,包括配置分辨率、创建并设置各节点位置、保存主场景,动作响应设置,包括配置输入映射,以及编写核心游戏逻辑代码,实现球的移动、碰撞反弹、球拍控制等功能。

我会向你展示如何制作传奇游戏《乒乓球》。 场景设置 游戏分辨率将为640 x 400像素。这可以在项目设置中进行配置。标准背景颜色应为黑色:

在项目根目录创建Node2D节点。Node2D是2D引擎的基础类型。然后为左右球拍、分隔线和球添加精灵(Sprite节点)。你可以为每个节点自定义名称,并在检查器中为每个精灵指定图片。

设置节点位置: “left”节点:(67, 183) “right”节点:(57, 187) “separator”节点:(320, 200) “ball”节点:(320, 188) 上述操作的结果应大致如下【球在中心!】

将此场景保存为“pong.tscn”并在项目设置中将其指定为主场景。 设置动作响应 玩游戏可以使用不同的输入设备:键盘、鼠标、游戏手柄、摇杆、触摸屏等。在Godot中可以使用所有这些设备。无论如何,将输入数据定义为【Input Actions】比将其定义为设备操作并单独控制它们更有趣。因此,任何输入方法都只能通过将按键绑定到您在游戏中定义的操作来使用。 这是《乒乓球》。我们唯一需要的操作就是球拍的上下移动。 再次打开项目设置,但这次请进入“Input Map”(输入映射)选项卡。 在该选项卡中添加4个操作:【left_move_up】、【left_move_down】、【right_move_up】、【right_move_down】。请自行设置按键。A/Z(左侧玩家)和上/下(右侧玩家)在大多数情况下适用。

Код Создайте скрипт для главного узла сцены и откройте его (это показано в Добавление Скрипта). Этот скрипт наследует Node2D: 引用自 Script: extends Node2D func _ready(): passСначала нам нужно определить переменные, в которых мы будем хранить нужные значения. Такие как размер экрана, ракетки и начальное направление мячика 引用自 Script: extends Node2D # Member variables var screen_size var pad_size var direction = Vector2(1.0, 0.0) func _ready(): pass_ready() функция - первая функция, которая будет вызвана (после_enter_tree(),которая нам тут не нужна). В ней будут сделаны две вещи. Первая - начать обработку, это цель set_process(true) функции. Вторая - назначить две наши переменные. 引用自 Script:extends Node2D # Member variables var screen_size var pad_size var direction = Vector2(1.0, 0.0) func _ready(): screen_size = get_viewport_rect().size pad_size = get_node("left").get_texture().get_size() set_process(true)Мы назначили pad_size переменную, запросив одну из ракеток (здесь левая), и получив размер ее спрайта. screen_sizeназначается при помощи вызова get_viewport_rect() , которая возвращает Rect объект, содержащий прямоугольник по размерам окна. Теперь нам нужно добавить чуть больше переменных для того, чтобы заставить наш мячик двигаться. 引用自 Script:extends Node2D # Member variables var screen_size var pad_size var direction = Vector2(1.0, 0.0) # Constant for ball speed (in pixels/second) const INITIAL_BALL_SPEED = 80 # Speed of the ball (also in pixels/second) var ball_speed = INITIAL_BALL_SPEED # Constant for pads speed const PAD_SPEED = 150 func _ready(): screen_size = get_viewport_rect().size pad_size = get_node("left").get_texture().get_size() set_process(true)Итак, функция _process(). Весь код ниже находится в этой функции. Мы создали несколько полезных переменных для вычислений. Первая - позиция мячика(из узла), вторая и третья - прямоугольники(Rect2) для каждой ракетки. Эти прямоугольники будут использоваться для обнаружения столкновений между мячиком и ракетками. Для корректировки центров спрайтов ракеток должен быть добавлен pad_size / 2 : 引用自 Script: func _process(delta): var ball_pos = get_node("ball").get_pos() var left_rect = Rect2( get_node("left").get_pos() - pad_size*0.5, pad_size ) var right_rect = Rect2( get_node("right").get_pos() - pad_size*0.5, pad_size )Теперь, давайте добавим немного движения в функцию _process(). С того момента, как позиция мячика находится в переменной ball_pos, сделать это проще простого: 引用自 Script:# Integrate new ball position ball_pos += direction * ball_speed * deltaЭта строка вызывается на каждой итерации функции _process(). Это значит, что позиция мячика будет обновляться каждый кадр. Теперь, когда у мячика новое положение, нам нужно проверить, не соприкасается ли он с чем либо. Это будут рамки окна и ракетки, но для начала верхнее и нижнее ограничение: 引用自 SOSAL?: # Flip when touching roof or floor if ((ball_pos.y < 0 and direction.y < 0) or (ball_pos.y > screen_size.y and direction.y > 0)): direction.y = -direction.yПотом ракетки. Если мячик соприкоснулся с ракеткой, нам нужно изменить его направление по оси Х, чтобы он двигался обратно, и выбрать случайное направление по Y, используя функцию randf() . Также нам нужно немного увеличить скорость мячика: 引用自 author: # Flip, change direction and increase speed when touching pads 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 direction.y = randf()*2.0 - 1 direction = direction.normalized() ball_speed *= 1.1Наконец, если мячик вышел за пределы экрана, игра заканчивается. То есть мы проверяем позицию мячика по X, меньше она нуля или больше величины экрана. Это так, то игра перезапускается : 引用自 author: # Check gameover if (ball_pos.x < 0 or ball_pos.x > screen_size.x): ball_pos = screen_size*0.5 ball_speed = INITIAL_BALL_SPEED direction = Vector2(-1, 0)Как только все будет сделано, узел обновится с новым положением мячика, которое было рассчитано до этого: 引用自 author: get_node("ball").set_pos(ball_pos) Теперь, мы позволим ракеткам двигаться. Просто обновим их позицию, используя вводные данные игрока: 引用自 author:# 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)Мы используем четыре действия, которые мы определили с вами ранее в разделе Настройка действия. Когда игрок нажимает соответствующую кнопку на клавиатуре, действие срабатывает. Как только это происходит, мы просто вычисляем новое положение для ракетки в нужном направлении и применяем его к узлу. Вот и все, мы сделали игру PingPong за несколько строчек кода ! Конец и подержка Вот я сделал рукаводство ну я проверял своё рукаводство и всё работает (новерное будут руководства у меня по онлайну с друзьями) И НЕ ЗАБЫВАЙТЕ О ПОДЕРЖКУ АВТОРУ можно лайк поставить или очки стима подарить или даже можно подарить игру 0-0

评论

共0条评论
face
inputImg
相关阅读
最新更新

如何成为一名游戏开发者 :D

this guide is from who wanna to get started with gamedev, i have a ton of bookma…

2026-02-14 13:000赞 · 0评论

桌游棋牌 千星奇域大学习1:五子棋的实现方法

上当了,这一口气录完也太费劲了,再也不做这么长的视频了

2026-01-03 03:330赞 · 0评论

零基础 【Unity3D消消乐游戏开发黄金教程】 从零手写水果消消乐/ 雷霆战机游戏| 完整版教程(Unity3D/U3D/C#/游戏)B0426

完整资料和源码+胃:zhaoxi0056免费获取

2025-12-17 17:440赞 · 0评论

游戏开发 unity教程零基础全套2026最新合集(unity游戏开发教程+unity3D游戏教程+unity2D游戏教程)unity小游戏制作教程,unity做游戏教程

unity教程零基础全套2026最新合集(unity游戏开发教程+unity3D游戏教程+unity2D游戏教程)unity小游戏制作教程,unity做游戏教程

2025-12-15 13:070赞 · 0评论

网络游戏 零基础都能学会的MMORPG类传奇网络游戏(基础篇)-Unity2025 |游戏开发|Unity|初级教程|编程

课程资料素材源码领取地址:https://www.sikiedu.com/course/2072?ff=xt unityA计划班级一年期:https://www…

2026-05-01 06:030赞 · 0评论

学习 30分钟教你用JAVA开发扫雷小游戏,允许白嫖,学不会你来找我!附源码+教程

本课程讲解一个扫雷游戏的详细开发过程。只要90分钟就可以完成一个你自己亲手开发出来的Java扫雷游戏!

2025-10-19 15:200赞 · 0评论

游戏开发 我使用godot做了一个完整的老爹汉堡店游戏,可以正常游玩,游戏展示与代码分享

2026-05-02 20:030赞 · 0评论

独立游戏 《AI搞定Godot 》 类土豆兄弟,逐渐形成了规模...

游戏名:还没有 游戏玩法是土豆游戏的换皮,对就是换皮!边开发变理解游戏流程这就是我的目的! 在此感谢@码客二十二 码客二十二@简散 ,陌上竹等AlphaAgen…

2026-05-02 10:100赞 · 0评论

手游 愤怒的小鸟开发-基于Unity2023-2D小白教程-游戏开发|编程|unity3d|u3d|unity基础|手游开发|C#编程|虚幻游戏开发

本课程会使用Unity开发一个2D游戏愤怒的小鸟~ 课程资料免费领取:https://www.sikiedu.com/course/1749?ff=b_siki…

2026-04-30 15:420赞 · 0评论

《读心术格斗》模组制作教程系列

《Yomi Hustle》角色模组制作教程系列 - 第一部分:设置

2026-02-18 22:000赞 · 0评论
暂无更多

最新更新

  • 释放Godot的全部潜能 — 你是否一直想知道Godot引擎能实现什么?更小的构建体积、更简洁的工作流程、更出色的调试选项。在Godot游戏引擎中,你确实可以进行大量自定义设置!每个使用该引…
  • 贝壳纹理制作完全指南4.4 — 这是一份关于在Godot 4.4.1中制作外壳纹理的指南。 截图 链接已屏蔽 链接2已屏蔽
  • Android 导出设置 — 1. 必要工具 首先我们需要Android Studio,因为通过它我们可以安装Godot创建APK所需的SDK。 2. 安装Android Studio和SD…
  • 使用C++在Godot中构建完整游戏! — 在GODOT中使用C++开发游戏?本指南将介绍相关可能性以及各种方法的优缺点,还会讲解使用Godot Engine和C++进行开发所需的一切知识。该指南包含7个…
  • 【新手教程】在Godot引擎中制作真实时钟 — 我们将从头到尾制作一个显示本地时间的时钟。如果你希望更熟悉Godot Engine和GDScript,这是一个不错的起点。
  • 如何在场景之间切换? — 什么是场景 场景在Godot中是游戏的独立元素:关卡、菜单、设置窗口等。 每个场景由节点和资源组成。要让玩家从一种游戏状态切换到另一种状态,需要在场景之间进行切…
  • 为玩家提供最简单的亮度调节方式 — 最简单的亮度调整方法 :3 主要指南 1. 在所需位置创建一个Hslider节点。将通过它进行调节。
  • Godot 中的 Switch-Case(Match) — 我将为你介绍如何在游戏脚本中使用Switch-Case语句 1. 什么是Switch-Case "switch"结构可以替代多个if语句。它是一种更直观的方式,…
  • 如何导出为单个Windows可执行文件 — 如何导出为单个Windows可执行文件(.exe) Godot 4.0及以上版本 1. 打开项目 2. 在应用程序功能区中选择【项目】 3. 选择【导出...】…
  • Godot引擎2.2+中使用KinematicBody2D的玩家控制器 — 展示使用运动学体2D(KinematicBody2D)的简单玩家控制器。