You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP C#中Canvas对象位置与游戏状态的保存及重载实现问询

Dodge Game 保存与重载功能实现方案

一、先梳理要保存的核心数据

别想着直接保存Canvas,要存驱动Canvas渲染的状态数据——所有对象的属性、游戏运行参数都得列清楚:

// 生成当前游戏状态的函数
function getCurrentGameState() {
  return {
    // 玩家角色数据
    player: {
      x: player.x,
      y: player.y,
      speed: player.speed
    },
    // 所有障碍物的状态(假设你用数组存障碍物)
    obstacles: obstacles.map(obstacle => ({
      x: obstacle.x,
      y: obstacle.y,
      size: obstacle.size,
      moveSpeed: obstacle.moveSpeed
    })),
    // 游戏核心设置
    gameConfig: {
      currentTimer: timerValue,
      isGameRunning: gameStatus.isRunning,
      currentScore: score
    }
  };
}

二、绑定保存按钮的功能

用浏览器的localStorage存数据,简单直接,适合单机游戏:

// 给保存按钮加点击事件
document.getElementById('saveGameBtn').addEventListener('click', () => {
  const gameState = getCurrentGameState();
  // 转成JSON字符串存入本地存储
  localStorage.setItem('dodgeGameSaveData', JSON.stringify(gameState));
  alert('进度已保存');
});

三、添加加载按钮并实现重载逻辑

先写加载函数,把存的数据读出来,逐个恢复对象状态:

// 加载游戏状态的函数
function loadSavedGame() {
  const savedData = localStorage.getItem('dodgeGameSaveData');
  if (!savedData) {
    alert('没有找到已保存的游戏进度');
    return;
  }
  const parsedState = JSON.parse(savedData);

  // 恢复玩家状态
  player.x = parsedState.player.x;
  player.y = parsedState.player.y;
  player.speed = parsedState.player.speed;

  // 恢复障碍物(假设你有Obstacle类,用保存的属性重新创建实例)
  obstacles = parsedState.obstacles.map(obs => new Obstacle(obs.x, obs.y, obs.size, obs.moveSpeed));

  // 恢复游戏设置
  timerValue = parsedState.gameConfig.currentTimer;
  gameStatus.isRunning = parsedState.gameConfig.isGameRunning;
  score = parsedState.gameConfig.currentScore;

  // 强制刷新Canvas渲染
  renderGame();
  // 如果之前游戏在运行,继续启动游戏循环
  if (gameStatus.isRunning) {
    requestAnimationFrame(gameLoop);
  }
}

// 给加载按钮绑定事件
document.getElementById('loadGameBtn').addEventListener('click', loadSavedGame);

四、关键注意点

  • 绝对不要直接保存Canvas元素:Canvas是像素容器,没法序列化,必须靠底层数据重新渲染。
  • 类实例处理:如果你的游戏对象是用类创建的,保存时要存实例的可序列化属性,加载时用这些属性重建实例或者直接赋值。
  • 随机元素处理:如果游戏里有随机生成的内容(比如随机障碍物),要把随机种子也存进状态里,不然加载后生成的内容会和之前不一致。
  • 异常处理:加载时要判断有没有保存数据,避免报错。

内容的提问来源于stack exchange,提问作者Itamar Valun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:20:28