zoukankan      html  css  js  c++  java
  • HTML5 GAME TUTORIAL(三): Draw shapes, paths and text(译)

    原文地址:Draw shapes, paths and text

    在HTML5画布上使用形状和路径绘制图形。 使用SVG路径创建矩形,圆形,直线,三角形和更复杂的形状。 在本教程结束时,您可以在画布上绘制自己的图形和文本。

    绘制一个矩形

    在上一教程中,您学习了如何使用上下文和画布创建HTML文件以及如何在画布上绘制简单的矩形。 快速回顾一下:

    <canvas id="canvas" width="750" height="400">
        Your browser does not support the HTML5 canvas tag.
    </canvas>
    
    // Get a reference to the canvas element
    canvas = document.getElementById('canvas');
    context = canvas.getContext('2d');
    
    // Draw a rectangle
    context.fillStyle = '#ff8080';
    context.fillRect(100, 50, 100, 75);
    

    首先,通过设置fillStyle选择一种颜色作为上下文的填充样式。 然后,通过调用fillRect()执行实际的绘制操作以在画布上绘制矩形。 矩形的位置和大小作为参数传递。

    这是大多数画布操作的工作方式。 您定义样式,然后填充。 您可以说您先定义要使用的画笔,然后开始绘制。 还要注意油漆颜色是如何不传递到填充函数中的,它存储在context中。 这意味着每个下一个绘图操作将使用与当前相同的绘画。 直到您更改填充样式为止。

    使用路径绘制图形

    CanvasRenderingContext2D仅支持两个基本形状,即矩形和路径。 您可以使用矩形绘制一个正方形,方法是制作一个具有边长相等的矩形。 但是,如果您想绘制其他任何内容,例如三角形圆圈 ,则必须使用路径。

    • 矩形 - 长方形和正方形
    • 路径 - 圆圈,直线,三角形和其他更多图形

    路径通过在上下文上调用beginPath()开始(这将清除所有现有路径的上下文)。 然后,您定义路径的形状。 例如,这可以是圆形或直线。 定义路径后,可以调用fill()或stroke()将路径绘制到画布。 以下是一些简单的示例,以获取有关如何应用路径的基本思想。

    如何绘制一个圆圈

    下一个代码演示了如何绘制圆。 您可以看到它以beginPath()函数开始一个新路径开始,以fill()结尾以将路径绘制到画布上。

    context.beginPath();
    context.arc(200, 100, 50, 0, 2 * Math.PI);
    context.fill();
    

    arc()函数是定义arc-shaped路径的函数,本例中为一个完整的圆。 它是这样的:

    • 前两个参数是圆心的x轴坐标值和y轴坐标值。
    • 第三参数个是圆的半径。 较大的半径将形成较大的圆。
    • 最后两个参数是弧度的起始角度和终止角度(以弧度为单位)。 该示例圆以零角度开始,以两倍PI的角度结束,从而形成一个完美的圆。

    运行此代码后,您可以在画布上看到圆。

    如何绘制一条基本的直线

    另一个基本的路径操作是画一条线。 这是通过调用lineTo()函数完成的。 这是一个如何画一条直线的例子:

    context.beginPath();
    context.moveTo(50, 50);
    context.lineTo(250, 150);
    context.stroke();
    

    画一条直线需要调用beginPath()来标记开始新路径。下一步调用moveTo()是告诉上下文从哪里开始在画布上绘制路径。 它并不能真正独立地绘制任何内容,而只是说明直线的起点坐标。 从那里可以使用lineTo()函数绘制一条线。

    完成路径(在本例中仅由一条线组成)后,可以调用stroke()描边路径并使其实际可见。 fill()在这里不起作用,因为路径仅包含一条直线并且没有实际的面。

    那三角形呢?

    通过使用多个命令,您可以绘制更复杂的形状。 这使您可以通过使用多条单独的线来创建三角形。 这是一个绘制三角形的示例:

    context.beginPath();
    context.moveTo(200, 100);
    context.lineTo(250, 150);
    context.lineTo(250, 50);
    context.fill();
    

    三角形的代码几乎与绘制直线的代码相似,仅仅lineTo()被多次调用。

    注意lineTo()仅被调用两次,但是三角形需要三条线。 调用fill()时自动绘制最后一行。 它关闭路径并连接开始到结束。

    通过在调用beginPath()函数之后堆叠多个命令,您可以创建几乎任何所需的形状。

    使用填充和描边的区别?

    您一直在使用fill()和stroke()在画布上绘画。 但是这些绘制方式之间到底有什么区别?

    使用填充时,就像为形状的表面着色。 它完全充满了色彩。 使用描边时,仅绘制形状的轮廓。 路径的中心仍然可以为空。

    您可以混合填充和描边以创建更复杂的图形。 这是关于填充和描边之间区别的简单概述:

    Fill and stroke explained

    描边路径和图形并设置颜色

    这是描边但未填充的先前使用的路径和形状的示例。

    context.beginPath();
    context.arc(200, 100, 50, 0, 2 * Math.PI);
    context.strokeStyle = '#0099b0';
    context.stroke();
    
    context.beginPath();
    context.moveTo(200, 100);
    context.lineTo(250, 150);
    context.lineTo(250, 50);
    context.stroke();
    
    context.strokeStyle = '#ff8080';
    context.strokeRect(100, 50, 100, 125);
    

    如您所见,fill()和fillRect()具有对应的stroke()和strokeRect()。 甚至有一个fillStyle属性,就像fillStyle一样。

    // Example: set stroke color and stroke
    context.strokeStyle = '#ff8080';
    context.stroke();
    
    // Example: set fill color and fill
    context.fillStyle = '#0099b0';
    context.fill();
    

    如果要创建更粗一点的直线,则可以使用lineWidth属性:

    context.lineWidth = 5;
    

    在此示例中,圆圈用蓝色绘制,然后在不指定特定颜色的情况下绘制三角形,然后在矩形中绘制红色。 由于上下文存储了填充和描边样式,因此三角形也用蓝色绘制,而无需特别指定。

    还有另一件事发生在这里。 三角形不是真正的三角形。 它更像是旋转的L形。 这是因为与fill()命令不同,stroke()不会将路径的开头与结尾联系在一起。 如果需要描边三角形,则必须有三条线,而不是两条线。

    在画布上绘制SVG路径

    您可以堆叠多个绘图操作来创建复杂的图形。 但是,如果图形太过复杂,以至于上下文中的绘制操作不再够用,该怎么办? 在这些情况下,您可以使用SVG路径。

    SVG或可缩放矢量图形包含图形的详细说明。 但是,它们没有像普通图像那样描述像素,而是描述了直线和曲线。 就像您为画布创建的路径一样。 使用矢量图形的最大优点是可以无限制地缩放它们。 与常规像素图像不同,它们不会损失质量。

    您可以在线找到SVG文件,也可以使用IllustratorInkscape等矢量绘图软件创建自己的SVG文件。 这是使用Inkscape编辑器创建路径的示例。

    使用Inkscape创建矢量图形

    在这些SVG文件中,您可以找到路径信息。 签出来看其实上很有趣。 它只是带有一长串移动点的曲线。

    这是一个简单的SVG文件内部一小部分的示例。 您可以使用文本编辑器将其打开。

    <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve">
    <path style="fill:#D75A4A;" d="M24.85,10.126c2.018-4.783,6.628-8.125,11.99-8.125c7.223,0,12.425,6.179,13.079,13.543 c0,0,0.353,1.828-0.424,5.119c-1.058,4.482-3.545,8.464-6.898,11.503L24.85,48L7.402,32.165c-3.353-3.038-5.84-7.021-6.898-11.503 c-0.777-3.291-0.424-5.119-0.424-5.119C0.734,8.179,5.936,2,13.159,2C18.522,2,22.832,5.343,24.85,10.126z"/>
    

    您可以从文件复制路径,并在JavaScript代码中使用它,如下所示:

    let path = new Path2D('M24.85,10.126c2.018-4.783,6.628-8.125,11.99-8.125c7.223,0,12.425,6.179,13.079,13.543 c0,0,0.353,1.828-0.424,5.119c-1.058,4.482-3.545,8.464-6.898,11.503L24.85,48L7.402,32.165c-3.353-3.038-5.84-7.021-6.898-11.503 c-0.777-3.291-0.424-5.119-0.424-5.119C0.734,8.179,5.936,2,13.159,2C18.522,2,22.832,5.343,24.85,10.126z');
    
    context.beginPath();
    context.strokeStyle = '#0099b0';
    context.fillStyle = '#ff8080';
    context.stroke(path);
    context.fill(path);
    

    该路径准确地描述了心的轮廓。 通过将路径作为stroke()和fill()函数的参数传递,它可以在画布上绘制。 这只是一个例子,您可以使用更多复杂的SVG路径并将其绘制为形状。

    SVG路径上的全部内容。 如果愿意,您可以尝试不同的形状和绘图操作来创建自己的图形。 对于本教程系列,您将暂时使用基本的几何图形,稍后再切换为使用图像。

    绘制自己的文本

    除了形状和路径,您还可以在画布上绘制文本。 就像任何其他绘图操作一样,此操作也可以使用填充和描边样式。 要绘制简单的文本行,请使用fillText()函数。 它以文本以及x和y坐标作为参数。

    context.fillStyle = 'black';
    context.fillText("Some text", 200, 100);
    

    您可以在上下文中设置字体和文本对齐方式以及-baseline。 字体属性使用与CSS字体属性相同的语法。 textAlign属性有点棘手。 它标记文本与给定坐标对齐的一侧。 因此,textAlign ='right'将显示文本右对齐。 对于textBaseline也是如此。 textBaseline ='bottom'将在基线上方显示文本。

    context.font = '25px Arial';
    context.textAlign = 'right';
    context.textBaseline = 'bottom';
    

    这是在画布上绘制的文本的示例:

    下一步是什么?

    绘图操作到此为止。 您可以在画布上绘制自己的形状,SVG路径和文本。 尝试将它们混合在一起以创建新的图形。

    如果您已经有兴趣将更复杂的对象(如图像和精灵)绘制到画布上,则可以查看图像和精灵动画教程。 随时在评论中询问任何与教程相关的问题。

    在画布上绘制静态图像仅仅是开始。 在本教程的下一步中,您将学习如何连续执行多个绘图操作。 您将创建一个游戏循环!

  • 相关阅读:
    Spring(十一):Spring配置Bean(四)SpEL
    Java中动态代理方式(使用java.lang.reflect.Proxy实现):
    设计模式(八)静态代理与动态代理模式
    Spring(十):Spring配置Bean(三)Bean的作用域、使用外部属性文件
    如何把本地代码提交到git(码云)、github代码管理项目上
    Spring(九):Spring配置Bean(二)自动装配的模式、Bean之间的关系
    centos7安装mysql5.7
    haproxy(单机)+mysql集群负载均衡
    sql server 用户创建与权限管理
    MySQL之 从复制延迟问题排查
  • 原文地址:https://www.cnblogs.com/xingguozhiming/p/13889608.html
Copyright © 2011-2022 走看看