推箱子小游戏

news/2024/11/29 2:27:53/

文章目录

  • 一、 介绍
  • 二、 制作墙壁、地面
  • 三、 制作箱子
  • 四、 制作终点
  • 五、 制作人物移动
  • 六、 推箱子关键触发机制
  • 七、 终点设置
  • 八、 关卡切换设置
  • 九、 协程
  • 十、 下载


一、 介绍

2D推箱子游戏是一种益智类游戏,玩家需要控制角色将箱子推到指定的位置,以完成关卡任务。游戏场景通常是二维平面,玩家需要通过移动角色来推动箱子,避免箱子被卡住或推错位置。游戏难度逐渐增加,需要玩家思考和规划每一步操作,提高解决问题的能力和反应速度。该游戏类型经常出现在各种智力竞赛和游戏比赛中。

在这里插入图片描述


二、 制作墙壁、地面

墙壁由很多切割后的小方块组成。
这里使用tilemap方法平铺墙面、地面。
墙面挂上图层wall

在这里插入图片描述

在这里插入图片描述


三、 制作箱子

箱子图片切割后,添加碰撞体,碰撞体长度要设置为原来的50%。
如果不改变,箱子和墙体只是贴着,就也进入碰撞检测了

在这里插入图片描述
在这里插入图片描述


四、 制作终点

同样的,挂载碰撞体脚本。
在这里插入图片描述


五、 制作人物移动

先按上下左右不移动,保存移动状态。

 if (Input.GetKeyDown(KeyCode.RightArrow))moveDir = Vector2.right;if (Input.GetKeyDown(KeyCode.LeftArrow))moveDir = Vector2.left;if (Input.GetKeyDown(KeyCode.UpArrow))moveDir = Vector2.up;if (Input.GetKeyDown(KeyCode.DownArrow))moveDir = Vector2.down;

碰撞检测后,然后移动

   void Move(Vector2 dir){transform.Translate(dir);}

六、 推箱子关键触发机制

使用射线检测的方式,检测物体所在的层级

 RaycastHit2D hit = Physics2D.Raycast(transform.position, dir, 1.5f, detectLayer);

要移动的方向发射射线后。

1.射线检测不到任何层级,玩家就可以移动一个单位。

2.射线检测到箱子,以箱子为新的发射点,继续检测有没有墙体,有墙体就不能移动,没有墙体就移动一个单位。

bool CanMoveToDir(Vector2 dir){RaycastHit2D hit = Physics2D.Raycast(transform.position, dir, 1.5f, detectLayer);if (!hit)return true;else{if (hit.collider.GetComponent<Box>() != null)return hit.collider.GetComponent<Box>().CanMoveToDir(dir);}return false;}
  public bool CanMoveToDir(Vector2 dir){RaycastHit2D hit = Physics2D.Raycast(transform.position + (Vector3)dir * 0.5f, dir, 0.3f);if (!hit){transform.Translate(dir);return true;}return false;}

七、 终点设置

箱子推到终点,触发器监测,箱子颜色变红。
箱子也可以从终点退出来,箱子颜色复原。

private void OnTriggerEnter2D(Collider2D collision){if(collision.CompareTag("Target")){FindObjectOfType<GameManager>().finishedBoxs++;FindObjectOfType<GameManager>().CheckFinish();GetComponent<SpriteRenderer>().color = finishColor;}}private void OnTriggerExit2D(Collider2D collision){if (collision.CompareTag("Target")){FindObjectOfType<GameManager>().finishedBoxs--;GetComponent<SpriteRenderer>().color = originColor;}}

八、 关卡切换设置

全局管理一个计数器,箱子总数totle,初始化为0,每个箱子挂“box”脚本,箱子totle数量+1。

已经达到终点的数量finish,初始化为0,一个箱子达到终点,finish。

当totle==finish,启动协程,等待片刻后,进入下个场景

 public void CheckFinish(){if(finishedBoxs == totalBoxs){print("YOU WIN!");StartCoroutine(LoadNextStage());}}

中途失败,可以点击“R”重载游戏

  void ResetStage(){SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}

九、 协程

 IEnumerator LoadNextStage(){yield return new WaitForSeconds(2);SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);}

等待两秒,当前关卡场景索引值+1


十、 下载

https://pan.baidu.com/s/1MutUXAxLDGXXUq5RpSSFjw

提取码: 4rf7




http://www.ppmy.cn/news/39216.html

相关文章

【WebGIS实例】(7)MapboxGL绘制不同颜色的Symbol图标

前言 在上一篇实例博客中&#xff08;MapboxGL绘制简易气泡图&#xff09;我们绘制了一个简易的单色气泡图&#xff0c;现在需求升级了。我们需要为气泡加载不同的颜色。 而要实现这个效果&#xff0c;其实相当简单&#xff0c;直接利用Mapbox提供的SDF渲染方法。 官网教程参考…

Spring Web MVC 知识点汇总(2)—官方原版

一、异步请求 Spring MVC与Servlet异步请求 处理 有广泛的集成&#xff1a; controller 方法中的 DeferredResult 和 Callable 返回值为单个异步返回值提供了基本支持。controller 可以 流转&#xff08;stream&#xff09; 多个数值&#xff0c;包括 SSE 和 原始数据。contr…

【内网安全】横向移动非约束委派约束委派资源约束委派数据库攻防

文章目录章节点redteam.red 靶场委派攻击分类&#xff1a;关于约束委派与非约束委派横向移动-原理利用-约束委派&非约束委派非约束委派复现配置如何利用&#xff1f;klist purge 与 mimikatz sekurlsa::tickets purge 的区别约束委派(不需要与与域控建立连接)复现配置判断查…

子串判断问题

目录 子串判断 程序设计 程序分析 子串判断 【问题描述】设s、t 为两个字符串,两个字符串分为两行输出,判断t 是否为s 的子串。如果是,输出子串所在位置(第一个字符,字符串的起始位置从0开始),否则输出-1 【输入形式】两行字符串,第一行字符串是s;第二行是字符串t …

闲来无事,写个脚本爬一下快递信息

多线程爬取&#xff1a;可以使用Python中的多线程或异步IO技术来加速爬取速度&#xff0c;提高效率。自动识别快递公司&#xff1a;可以通过输入的快递单号自动识别快递公司&#xff0c;然后根据不同公司的网站结构来爬取相应的信息。数据存储&#xff1a;可以将爬取的数据存储…

2021蓝桥杯真题大写 C语言/C++

题目描述 给定一个只包含大写字母和小写字母的字符串&#xff0c;请将其中所有的小写字母转换成大写字母后将字符串输出。 输入描述 输入一行包含一个字符串。 输出描述 输出转换成大写后的字符串。 输入输出样例 示例 输入 LanQiao 输出 LANQIAO 评测用例规模与约定 对于…

如何自动填充creatTime和updateTime两种字段

1.mysql自带功能 首先是较为常见的&#xff0c;在mysql数据库里设置&#xff0c;但是我的mysql版本不支持该方法&#xff0c;如果尝试了后报错了请直接看方法二 sql语句预览 createTime timestamp not null default CURRENT_TIMESTAMP comment "创建时间", upd…

软考网络工程师要怎么复习?

一、明确考试重点和难点 网络工程师考试主要考察网络基础知识、网络架构设计、网络安全、网络管理等方面的知识。因此&#xff0c;我们在复习的时候&#xff0c;一定要明确考试重点和难点&#xff0c;将重点知识点逐一梳理&#xff0c;逐一掌握。 二、查漏补缺 在进行复习的…