明天上午继续尝试。计划是:
- 继续补充游戏程序显示地图的功能。
- 创建几个测试地图,测试功能是否正常
下午?下午整铁的新地图和支线,
如果还有时间,去minecraft玩冰船轨道交通 ![]()
明天上午继续尝试。计划是:
下午?下午整铁的新地图和支线,
如果还有时间,去minecraft玩冰船轨道交通 ![]()
喔喔,还有详细的制作过程和思考思路。三天时间已经搭好地图的数据结构和一些界面和功能了,效率不错啊。
格子的行列坐标也可以当作索引吧?毕竟除了遍历所有格子显示地图,还需要频繁的读取格子信息,这样的话可以试试用字典,key是坐标,value就是格子了。
没有没有, ![]()
这两天才刚刚开始起步
昨天清绝区零体力的时候,顺便分析了下绝区零走格子的界面
谢谢你的回复!
根据我的认知水平,字典方案是高度可行的:
Dictionary<Vector2, 自定义类>
使用字典确实有用 ![]()
今天的工作基本完成了
在昨天的基础上,补充了GridMapDisplayManager类,并实现了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);
}
}
}
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类的思路是:
一些坛友会注意到,绝区零的一些按钮控件在被点击时,
其外围会显示一个高亮的边框,并且颜色会在黄色和绿色之间不断渐变切换。
所以,我们可以自定义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;
}
}
}
}
为什么要为格子预制体添加颜色循环渐变的高亮边框?
接着需要处理的是,
我们希望在按下电脑的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版本 ![]()
试试论坛能不能发 GIF。
录频直接生成GIF的工具链接:
哦不!论坛好像不支持 GIF。没事,可以尝试将其转化为动态的png图片:
以及相应的测试结果的动图:
再试试如何
好吧,确实不行 ![]()
再来个链接:
论坛的图片上传机制,
大致是将上传图片统一转换为jpeg格式
上述两个链接不是广告
有需要的坛友记住这两个链接
今天就暂时更到这里……
……
咕咕嘎嘎、咕咕……(后面省略数百字)
期待
zlbzlb
哦,嘿!坛友们,
我复活了
个人事务总是企图偷袭我
虽然我现在仍然不能更新走格子的游戏开发内容
这次更新,我可以聊聊字体相关的事情 ![]()
我通过相当一段时间的时间和探索
希望告诉大家一些关于字体版权的雷点和要点
首先需要注意的是:
Windows操作系统自带的字体文件基本不能用于你的游戏!
是的,没错,我指的就是C:\Windows\Fonts 下的那些 TTF 文件
包括微软雅黑、黑体、宋体、仿宋、楷体等等