(长期更新)妖狸替、走格子与其他小游戏

明天上午继续尝试。计划是:

  • 继续补充游戏程序显示地图的功能。
  • 创建几个测试地图,测试功能是否正常

下午?下午整铁的新地图和支线,
如果还有时间,去minecraft玩冰船轨道交通 :rofl:

:ai: 喔喔,还有详细的制作过程和思考思路。三天时间已经搭好地图的数据结构和一些界面和功能了,效率不错啊。

格子的行列坐标也可以当作索引吧?毕竟除了遍历所有格子显示地图,还需要频繁的读取格子信息,这样的话可以试试用字典,key是坐标,value就是格子了。

没有没有, :melting_face:
这两天才刚刚开始起步
昨天清绝区零体力的时候,顺便分析了下绝区零走格子的界面

谢谢你的回复!
根据我的认知水平,字典方案是高度可行的:

Dictionary<Vector2, 自定义类>

使用字典确实有用 :wink:

1 个赞

今天的工作基本完成了
在昨天的基础上,补充了GridMapDisplayManager类,并实现了GridObject类。

GridObject类
public class GridObject : MonoBehaviour
{
	private List<GridContent> contents = new List<GridContent>();
	[SerializeField] private SpriteRenderer contentSprite;
	[SerializeField] private List<Attribute> attributes = new List<Attribute>();
	
	private void Awake()
	{

	}
	
	public void SetSprite(Sprite newSprite)
	{
		contentSprite.sprite = newSprite;
	}

	public void SetLocation(Vector2 position)
	{
		transform.localPosition = new Vector3(
			position.x, position.y, 0.0f
		);
	}
	
	public void HideAllAttributes()
	{
		foreach(Attribute attr in attributes)
		{
			attr.ShowAttribute(false);
		}
	}
	
	[System.Serializable]
	public class Attribute
	{
		[SerializeField] private GameObject attributeParent;
		[SerializeField] private TextMeshPro attributeText;
		
		public void SetText(int text)
		{
			text = (text >= 999)?(999):(text);
			attributeText.SetText(text.ToString());
		}
		
		public void ShowAttribute(bool active)
		{
			attributeParent.SetActive(active);
		}
	}
}
GridMapDisplayManager类
public class GridMapDisplayManager : MonoBehaviour
{
	[SerializeField] private GridMap currentMap;
	[SerializeField] private AllGridContentList allGridContentList;
	[SerializeField] private Transform mapDisplayParent;
	[SerializeField] private GameObject gridPrefab;
		
	private Dictionary<Vector2, GridObject> gridObjDic = new Dictionary<Vector2, GridObject>();
	
	private const float gridWidth = 3.4f;
	private const float gridHeight = 2.65f;
	
	private void Start()
	{
		DisplayMap();
	}
	
	public void DisplayMap()
	{
		currentMap.Initialize();
		gridObjDic.Clear();
	
		var startGrid = currentMap.GetStartGrid();
		var startGridId = startGrid.GetId();
		var startGridObj = Instantiate(gridPrefab, mapDisplayParent);
		startGridObj.GetComponent<GridObject>().SetLocation(new Vector2(0f, 0f));
		gridObjDic[startGrid.GetIndex()] = startGridObj.GetComponent<GridObject>();
		
		var startLayerGrids = currentMap.GetLayerGrids(currentMap.GetStartLayer());
		
		for (int i = 0;i < startLayerGrids.Count;i++)
		{
			var grid = startLayerGrids[i];
			if (grid.GetId() != startGridId)
			{
				var gridObj = Instantiate(gridPrefab, mapDisplayParent);
				var relativePosition = grid.GetIndex() - startGrid.GetIndex();
				relativePosition = new Vector2(
					relativePosition.y * gridWidth, -relativePosition.x * gridHeight
				);
				gridObj.GetComponent<GridObject>().SetLocation(relativePosition);
				gridObjDic[grid.GetIndex()] = gridObj.GetComponent<GridObject>();
			}
		}
	}
}
  • GridObject 在目前可以被设置其具体位置,以及格子显示的贴图
  • GridMapDisplayManager类的思路是:
    1. 找到起点格子所在层的所有地图格子
    2. 找到格子地图的起点,实例化预制体,格子地图的起点的预制体,其位置被设置为屏幕中心
    3. 其他格子预制体的位置,根据行索引和列索引之差,计算其相对位置

经典测试环节:

  • 地图1

  • 地图2

  • 地图3

今天如果还想整点什么,就继续在这里发帖。 :grinning_cat:

1 个赞

一些坛友会注意到,绝区零的一些按钮控件在被点击时,
其外围会显示一个高亮的边框,并且颜色会在黄色和绿色之间不断渐变切换。
所以,我们可以自定义HighlightFrame类来模仿这样的效果:

HighlightFrame类
public class HighlightFrame : MonoBehaviour
{
	[SerializeField] private SpriteRenderer frameSprite;
	private Color startColor = new Color(1.0f, 1.0f, 0.0f);
	private Color endColor = new Color(0.0f, 1.0f, 0.0f);
	private float timer = 0f;
	private const float duration = 1.5f;
	
	public void ShowHighlightFrame(bool active)
	{
		frameSprite.enabled = active;
	}
	
	private void Update()
    {
    	if (frameSprite != null)
    	{	
    		timer += Time.deltaTime;
    		float t = Mathf.Clamp01(timer / duration);
    		Color currentColor = Color.Lerp(startColor, endColor, t);
    		
    		frameSprite.color = currentColor;
    		
    		if (t >= 1f)
    		{
    			timer = 0f;
    			frameSprite.color = endColor;
    			
    			Color tempColor = endColor;
    			endColor = startColor;
    			startColor = tempColor;
    		}
    	}
    }
}

为什么要为格子预制体添加颜色循环渐变的高亮边框?

  • 第一个答案仍然来自绝区零 :rofl: 一些地图关卡中,高亮的格子表示此处会在玩家移动一次以后,生成新的实体,比如敌人、炸弹、金币、钥匙等等
  • 第二个答案比较简单,为后期开发做好准备,比如玩家可以使用选择可以指定目标的远程武器,那么拥有高亮边框的格子就可以是玩家的候选目标
1 个赞

楼主今天先咕了,原因很简单
去minecraft规划冰船和到处修房子了 :rofl:

流量环境勿用:

楼主回来了 :grinning_face_with_smiling_eyes:
继续上回的进度,在上回,我们的游戏地图可以正确被显示和初始化。
但是,还需要添加显示各个格子内容的步骤。一共有三种格子被测试,


它们分别是:

  • 空格子
  • 终点格子
  • 砖墙格子

重新测试三张地图:

  • 地图1:

  • 地图2:

  • 地图3:

更新:加入了楼主的自设,以及对其进行测试 :saluting_face:

这种风格,是我受到波兰球的启发,然后二次创作而出的结果

接着需要处理的是,
我们希望在按下电脑的wasd或者上下左右箭头时,屏幕中心对准的格子也会跟随进行移动。

面对这一问题,其实有两种解决方法:

  • 摄像头移动,地图不动
  • 摄像头不动,地图移动

我选择了第二种方法。

新的 GridMapGameDriver 类被定义,其 Update()函数的部分如下:

    private void Update()
    {
        if ((Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) && 
    	    gridMapDisplayManager.MoveCompleted()) {
    		
    		gridMapDisplayManager.MoveMap(new Vector2(0f, -1f));
    		
		}
    	
    	if ((Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) && 
    	    gridMapDisplayManager.MoveCompleted()) {
    		
    		gridMapDisplayManager.MoveMap(new Vector2(0f, 1f));
			
		}
    	
    	if ((Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W)) && 
    	    gridMapDisplayManager.MoveCompleted()) {
    		
			gridMapDisplayManager.MoveMap(new Vector2(-1f, 0f));
			
		}
    	
    	if ((Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown(KeyCode.S)) && 
    	    gridMapDisplayManager.MoveCompleted()) {
    		
			gridMapDisplayManager.MoveMap(new Vector2(1f, 0f));
			
		}
    }

MoveMap 函数是GridMapDisplayManager专门负责处理地图位置移动的函数。

从此楼到后续楼层,我们默认使用了DOTween插件。虽然我暂时不想掏钱买 DOTween 的 Pro版本 :rofl:

1 个赞

试试论坛能不能发 GIF。

录频直接生成GIF的工具链接:

哦不!论坛好像不支持 GIF。没事,可以尝试将其转化为动态的png图片

以及相应的测试结果的动图:

再试试如何

好吧,确实不行 :rofl:

再来个链接:

1 个赞

论坛的图片上传机制,
大致是将上传图片统一转换为jpeg格式
上述两个链接不是广告
有需要的坛友记住这两个链接

1 个赞

今天就暂时更到这里……
……
咕咕嘎嘎、咕咕……(后面省略数百字

1 个赞

期待 :heart_eyes:zlbzlb

哦,嘿!坛友们,
我复活了
个人事务总是企图偷袭我
虽然我现在仍然不能更新走格子的游戏开发内容
这次更新,我可以聊聊字体相关的事情 :rofl:

我通过相当一段时间的时间和探索
希望告诉大家一些关于字体版权的雷点和要点
首先需要注意的是:
Windows操作系统自带的字体文件基本不能用于你的游戏!
是的,没错,我指的就是C:\Windows\Fonts 下的那些 TTF 文件
包括微软雅黑、黑体、宋体、仿宋、楷体等等