当前位置:嗨网首页>书籍在线阅读

16-使玩家飞船绕中心旋转

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.7.1 使玩家飞船绕中心旋转

使玩家飞船绕中心旋转的代码与绕左上角旋转的代码非常接近,因此,用户所要做的就是修改转换位置。在例8-5中,将即时模式的绘图环境放在游戏对象的x轴和y轴坐标位置(50,50),使得物体绕左上角旋转。现在,必须将平移点移动到物体的中心。

context.translate(x+.5*width,y+.5*height);

提示

width和height变量表示被绘制的玩家飞船的属性。在例8-6中将创建这些属性。

除了以上的修改之外,还需要以此为中心点绘制飞船。为了实现这点,分别将每个路径绘制序列中的x属性减去宽度的一半,y属性减去高度的一半。

context.moveTo(10-.5*width,0-.5*height);
context.lineTo(19-.5*width,19-.5*height);

用这种方式绘制坐标会让人有一点困惑,而且这种方式的计算量比使用常量大。这里直接在代码中写入需要的数值。请记住,飞船的width和height属性都是20。在代码中直接写数值的硬编码版本如下所示。

context.moveTo(0,−10); //10-10, 0-10
context.lineTo(9,9); //19-10, 19-10

虽然用width和height变量计算这些数值的方法会更加灵活,但是使用硬编码的方法对处理器的消耗会更少。例8-6包含了使用两种方法的代码,将需要运算的版本进行注释。

例8-6 绕中心旋转图像

//canvasApp 级变量
  var rotation = 0;
  var x = 50;
  var y = 50; var width = 20;
  var height = 20;
  function drawScreen(){
   // 绘制背景和文字
   context.fillStyle = '#000000';
   context.fillRect(0, 0, 200, 200);
   context.fillStyle = '#ffffff';
   context.font = '20px sans-serif';
   context.textBaseline = 'top';
   context.fillText ("Player Ship - rotate", 0, 180);
   // 形状变换
   var angleInRadians = rotation * Math.PI / 180;
   context.save(); //将当前画布状态保存到栈中
   context.setTransform(1,0,0,1,0,0); // 重置变换矩阵
   // 将画布原点平移到玩家飞船中心
   context.translate(x+.5*width,y+.5*height);
   context.rotate(angleInRadians);
   //绘制飞船
   context.strokeStyle = '#ffffff';
   context.beginPath();
   //将位置硬编码
   context.moveTo(0,-10);
   context.lineTo(9,9);
   context.lineTo(0,-1);
   context.moveTo(-1,-1);
   context.lineTo(-10,9);
   context.lineTo(-1,-10);
   /*
   //使用宽度和高度进行计算
   context.moveTo(10-.5*width,0-.5*height);
   context.lineTo(19-.5*width,19-.5*height);
   context.lineTo(10-.5*width,9-.5*height);
   context.moveTo(9-.5*width,9-.5*height);
   context.lineTo(0-.5*width,19-.5*height);
   context.lineTo(9-.5*width,0-.5*height);
   */
   context.stroke();
   context.closePath();
   //恢复上下文
   context.restore(); //将旧的状态恢复到屏幕
   //增加旋转角度
   rotation++;
  }