Godot-放置棋子,实现黑白棋翻转

简介: 本教程介绍如何在Godot引擎中创建一个简单的黑白棋游戏,包含光照设置、棋子动画、点击交互及棋子翻转逻辑,并通过C#脚本实现游戏规则与场景效果展示。

前面的一节,我们发现棋盘本来应该是白色的格子,但是显示的是灰色,这里的原因是缺少光照。我们可以在主场景中添加光照的节点。

添加DirectionalLight3D平行光,Ratation(-60.0,45.0,0,0),添加一个环境光WorldEnvironment用于补光,Environment → 添加 New Environment ,AmbientLight 可以设置自己需要的属性,这里就使用默认的。

创建一个球场景

添加一个Ball.tscn,根节点维Node3D,添加子节点MeshInstance3D,Mesh设置为SphereMesh球体形状,Material Override 新建StandardMaterial3D。

添加脚本,主要实现球(棋子)的颜色变化,跳跃等动画效果,参考代码如下:

using Godot;
using System;
public partial class Ball : Node3D
{
    private StandardMaterial3D material;
    public override void _Ready()
    {
        material = new StandardMaterial3D();
    }
    public void FlipTo(Color targetColor, float duration = 0.4f)
    {
        var tween = GetTree().CreateTween();
        // 旋转动画
        tween.TweenProperty(this, "rotation_degrees", new Vector3(180, 0, 0), duration)
             .SetTrans(Tween.TransitionType.Sine)
             .SetEase(Tween.EaseType.InOut);
        // 缩放动画:放大到 1.2 再回到 1
        tween.TweenProperty(this, "scale", new Vector3(1.2f, 1.2f, 1.2f), duration / 2f)
             .SetTrans(Tween.TransitionType.Sine)
             .SetEase(Tween.EaseType.Out);
        tween.TweenProperty(this, "scale", new Vector3(1, 1, 1), duration / 2f)
             .SetTrans(Tween.TransitionType.Sine)
             .SetEase(Tween.EaseType.In);
        // 跳跃动画(Y轴偏移)
        Vector3 startPos = Position;
        Vector3 peakPos = Position + new Vector3(0, 0.2f, 0);
        tween.TweenProperty(this, "position", peakPos, duration / 2f)
             .SetTrans(Tween.TransitionType.Quad)
             .SetEase(Tween.EaseType.Out);
        tween.TweenProperty(this, "position", startPos, duration / 2f)
             .SetTrans(Tween.TransitionType.Quad)
             .SetEase(Tween.EaseType.In);
        // 颜色过渡
        Color fromColor = material.AlbedoColor;
        tween.TweenMethod(
            Callable.From((Color c) => material.AlbedoColor = c),
            fromColor,
            targetColor,
            duration
        ).SetTrans(Tween.TransitionType.Sine)
         .SetEase(Tween.EaseType.InOut);
    }
}

实现黑白棋的棋子变化游戏规则

点击单元格放置一个球,判断当前位置的8个方向的棋子是否需要翻转颜色,翻转完成之后,玩家切换为对手玩家。

添加单元格点击事件,参考代码如下:

//Cell.cs
using Godot;
using System;
public partial class Cell : Area3D
{
  public Vector2I BoardPosition{get;set;}
  [Signal]
  public delegate void CellClickedEventHandler(Vector2I boardPos);
  public override void _InputEvent(Camera3D camera, InputEvent @event, Vector3 position, Vector3 normal, int shapeIdx)
  {
    if (@event is InputEventMouseButton mb && mb.Pressed && mb.ButtonIndex == MouseButton.Left)
    {
      GD.Print($"[Cell] Clicked at {BoardPosition}");
      EmitSignal(nameof(CellClicked), BoardPosition);
    }
  }
}

点击单元格的时候放置球,获取需要翻转的棋子的位置,翻转棋子颜色,参考代码:

//Main.cs
private enum Piece { None, Black, White }
private Piece[,] boardState = new Piece[BoardSize, BoardSize];
private Piece currentPlayer = Piece.Black;
private void OnCellClicked(Vector2I position)
{
  if (boardState[position.X, position.Y] != Piece.None)
    return;
  var toFlip = GetFlippablePieces(position, currentPlayer);
  if (toFlip.Count == 0)
  {
    GD.Print("非法落子!");
    return;
  }
  // 落子
  boardState[position.X, position.Y] = currentPlayer;
  PlacePiece(position, currentPlayer);
  // 翻子
  foreach (var flipPos in toFlip)
  {
    boardState[flipPos.X, flipPos.Y] = currentPlayer;
    FlipPiece(flipPos, currentPlayer);
  }
  // 切换回合
  currentPlayer = currentPlayer == Piece.Black ? Piece.White : Piece.Black;
}
//获取需要翻转的棋子
private List<Vector2I> GetFlippablePieces(Vector2I pos, Piece player)
{
  List<Vector2I> totalToFlip = new();
  Piece opponent = (player == Piece.Black) ? Piece.White : Piece.Black;
  foreach (var dir in Directions)
  {
    List<Vector2I> toFlip = new();
    int x = pos.X + dir.X;
    int y = pos.Y + dir.Y;
    while (x >= 0 && x < BoardSize && y >= 0 && y < BoardSize)
    {
      var p = boardState[x, y];
      if (p == opponent)
      {
        toFlip.Add(new Vector2I(x, y));
      }
      else if (p == player)
      {
        if (toFlip.Count > 0)
        {
          totalToFlip.AddRange(toFlip);
        }
        break;
      }
      else // None
      {
        break;
      }
      x += dir.X;
      y += dir.Y;
    }
  }
  return totalToFlip;
}
/// <summary>
/// 放置棋子
/// </summary>
/// <param name="pos"></param>
/// <param name="piece"></param>
private void PlacePiece(Vector2I pos, Piece piece)
{
  var ball = ballScene.Instantiate<Node3D>();
  ball.Position = new Vector3(pos.X, 0.2f, pos.Y);
  var mesh = ball.GetNode<MeshInstance3D>("MeshInstance3D");
  var mat = new StandardMaterial3D();
  mat.AlbedoColor = (piece == Piece.Black) ? new Color(0, 0, 0) : new Color(1, 1, 1);
  mesh.MaterialOverride = mat;
  ball.Name = $"Piece_{pos.X}_{pos.Y}";
  boardNode.AddChild(ball);
}
/// <summary>
/// 翻转棋子
/// </summary>
/// <param name="pos"></param>
/// <param name="toColor"></param>
private void FlipPiece(Vector2I pos, Piece toColor)
{
  string nodeName = $"Piece_{pos.X}_{pos.Y}";
  if (boardNode.HasNode(nodeName))
  {
    var piece = boardNode.GetNodeOrNull<Ball>(nodeName);
    var mesh = piece.GetNode<MeshInstance3D>("MeshInstance3D");
    var mat = new StandardMaterial3D();
    mat.AlbedoColor = (toColor == Piece.Black) ? new Color(0, 0, 0) : new Color(1, 1, 1);
    mesh.MaterialOverride = mat;
    piece.FlipTo(currentPlayer == Piece.Black ? Colors.Black : Colors.White);
  }
}

效果展示

目录
相关文章
|
5月前
|
人工智能 弹性计算 机器人
【最新版】阿里云一键部署OpenClaw步骤、配置千问大模型、接入飞书机器人完整实战教程
2026年,AI智能体已经从概念走向实用化。OpenClaw(曾用名Clawdbot)作为轻量化、高稳定、可长期运行的开源AI执行框架,成为个人与小型团队搭建专属智能助手的首选方案。
828 1
|
存储 缓存 数据挖掘
阿里云目前最便宜云服务器介绍:38元、99元、199元性能,选购攻略参考
轻量应用服务器2核2G峰值200M带宽38元1年;云服务器经济型e实例2核2G3M带宽99元1年;云服务器通用算力型u1实例2核4G5M带宽199元1年。对于还未使用过阿里云服务器的用户来说,大家也不免有些疑虑,这些云服务器性能究竟如何?它们适用于哪些场景?能否满足自己的使用需求呢?接下来,本文将为您全方位介绍这几款云服务器,以供您了解及选择参考。
|
8月前
|
人工智能 弹性计算
阿里云权益中心2026年最新:个人、学生及企业用户上云补贴及活动政策解读
2026年阿里云优惠汇总:个人38元起/年,企业199元/年起,学生领300元券免费用。超160款产品免费试用,开通百炼享7000万tokens,企业迁云最高补5亿算力。先领券再下单更划算!
928 13
|
运维 Prometheus 监控
3 年部署经验总结:用自动化工具轻松管理 300+ 服务器开源软件
三年前接手公司IT部门时,我满怀信心,却发现部署效率低下。尽管使用了GitLab、Jenkins、Zabbix等100+开源工具,部署仍耗时费力。文档厚重如百科,却难解实际困境。一次凌晨三点的加班让我下定决心改变现状。偶然看到一篇国外博客,介绍了自动化部署的高效方式,我深受启发。
453 0
|
9月前
|
人工智能 安全 API
AI 智能体的分类及开发
AI智能体是大模型的高阶应用,具备自主思考、规划与执行能力。本文详解其开发(LangGraph/AutoGen)、评估(成功率/幻觉率)、合规(标识与备案)、上线(容器化/可观测性)及验收要点,助力构建安全、高效、可落地的智能体系统。#AI智能体 #AI应用
|
Kubernetes 应用服务中间件 Nacos
Kubernetes环境下Nginx代理Nacos服务请求故障诊断
以上方法不仅适用于排除特定环境下出现故障情况,也适合作为一般性指南帮助运维人员快速准确地找出并解决问题。实际操作中还需根据现场实际情况灵活运用这些技巧,并结合自身经验进行判断和处理。
639 12
|
安全 Linux 定位技术
Curl访问Kerberos SPNEGO保护的HTTP资源
最后,记住,虽然Kerberos的魔法强大且久经考验,但它仍需你谨慎掌握。SPNEGO的舞步看似复杂,但一旦跳起来,你会发现自己在安全和便捷的旋律中翩翩起舞。而Curl,这一灵活敏捷的小工具,它的确有能力成为你施展这些魔法的得力助手。
426 14
|
机器学习/深度学习 人工智能 分布式计算
Post-Training on PAI (1):一文览尽开源强化学习框架在PAI平台的应用
Post-Training(即模型后训练)作为大模型落地的重要一环,能显著优化模型性能,适配特定领域需求。相比于 Pre-Training(即模型预训练),Post-Training 阶段对计算资源和数据资源需求更小,更易迭代,因此备受推崇。近期,我们将体系化地分享基于阿里云人工智能平台 PAI 在强化学习、模型蒸馏、数据预处理、SFT等方向的技术实践,旨在清晰地展现 PAI 在 Post-Training 各个环节的产品能力和使用方法,欢迎大家随时交流探讨。
|
NoSQL Redis 数据安全/隐私保护
redis设置密码
redis设置密码
2322 1