简单游戏的 Canvas vs SVG

2023-08-02前端开发问题
10

本文介绍了简单游戏的 Canvas vs SVG的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

如果我想构建一个简单的游戏(蛇、西洋跳棋、吃豆人或其他),什么是更好的方法 - SVG 或 Canvas?

If I wanted to build a simple game (snake, checkers, pacman or whatever) what would be the better approach - SVG or Canvas ?

我感兴趣的事情:

  1. 易于实施(Canvas 与 SVG 的学习曲线).例如,如果 SVG 的教程和社区支持对我来说至关重要.

  1. Ease of implementation (learning curve of Canvas vs SVG) . For example if SVG has significantly less tutorials and community support that's crucial to me.

性能(对我来说并不重要,但仍然很重要)

Performance (not critical to me but still important)

另外,在游戏领域,有没有比 Canvas 更适合 SVG 的特定游戏(反之亦然?)

And also , in the gaming field , are there specific games that SVG is more suited for than Canvas (or vice versa?)

推荐答案

需要大量鼠标交互且不需要太多连续动画的游戏(例如跳棋或国际象棋,或任何与此相关的棋盘游戏)更适合 SVG因为你使用 dom 元素.考虑一个简单的按钮悬停,在 SVG 中,您可以添加事件侦听器,甚至只需在 CSS 中放置 g.button:hover path {fill: blue;} 即可.另一方面,Canvas 需要跟踪点击区域并用 Javascript 绘制所有内容.

Games that require a lot of mouse interaction and not much continuous animation (such as checkers or chess, or any board game for that matter) are better suited for SVG because you work with dom elements. Consider a simple button hover, in SVG you can add event listeners or even just place g.button:hover path {fill: blue;} in your CSS and it will work. Canvas, on the other hand, requires keeping track of the hit area and drawing everything in Javascript.

Snake 和 Pacman 更适合画布,您可以使用键盘控制一切,并且画到画布上比在 SVG 中移动元素更便宜.有很多优秀的画布游戏库,impact.js 就是其中之一.

Snake and Pacman would be better suited for canvas, you control everything with your keyboard and painting to canvas is less expensive than moving elements around in SVG. There are excellent gaming libraries for canvas, impact.js is one of them.

解决你的观点:

易用性:如果您熟悉纯 JavaScript DOM 操作,SVG 是轻而易举的事.如果你是白板,我会说画布更容易掌握,因为你只是在上面画画.

Ease of use: if you are familiar with pure javascript DOM manipulation SVG is a breeze. If you are blank slate I'd say canvas is easier to grasp, as you just paint on it.

社区支持:游戏画布胜出.有一个强大的 SVG 社区,但不是在游戏领域.

Community support: for gaming canvas wins hands down. There is a strong SVG community but not in the gaming area.

性能:好坏参半.如果您不采取一些技巧,canvas 和 SVG 都可能会很慢.例如,如果您在每一帧上重新绘制整个屏幕,则在画布中从左向右移动一个正方形可能会很不稳定.如果您只是重新绘制更改的区域,那么它是平滑的.SVG 可以毫不费力地处理这种情况.但另一方面,如果您想一次为数千个矩形设置动画,canvas 可以流畅地处理它,如果您不将矩形包装在一个组中并移动该组,那么 SVG 就会陷入困境.

Performance: Mixed. Both canvas and SVG can be slow if you don't pull off a couple of tricks. For example, moving a single square from left to right can be jerky in canvas if you repaint the entire screen on each frame. If you just repaint the area that changed then it's smooth. SVG would handle this case without a hitch. But on the other hand, if you want to animate thousands of rectangles at once, canvas handles it smoothly and SVG bogs down if you don't wrap the rects in a group and move the group around.

总而言之,如果您想在 javascript 中探索游戏,也许 Canvas 是一个更好的选择.我用 SVG 做了三款游戏,最近一款是 http://color.method.ac,但我已经涉足画布,我认为它更适合游戏.

All in all, if you want to explore gaming in javascript perhaps Canvas is a better option. I've done three games in SVG, the latest one being http://color.method.ac, but I've dabbled in canvas and I think it's better suited for gaming.

这篇关于简单游戏的 Canvas vs SVG的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

js删除数组中指定元素的5种方法
在JavaScript中,我们有多种方法可以删除数组中的指定元素。以下给出了5种常见的方法并提供了相应的代码示例: 1.使用splice()方法: let array = [0, 1, 2, 3, 4, 5];let index = array.indexOf(2);if (index -1) { array.splice(index, 1);}// array = [0,...
2024-11-22 前端开发问题
182

layui 实现实时刷新一个外部的div
主页面上显示了一个合计,在删除和增加的时候需要更改这个总套数的值: //html代码div class="layui-inline layui-show-xs-block" style="margin-left: 10px" id="sumDiv"spanSOP合计:/spanspan${totalNum}/spanspan套/span/div 于是在我们删除这个条数据后,...
2024-11-14 前端开发问题
156

layui要如何改变时间日历布局大小?
问题描述 我想改变layui时间日历布局大小,这个要怎么操作呢? 解决办法 可以用css样式对时间日历进行重新布局,具体代码如下: !DOCTYPE htmlhtmlheadmeta charset="UTF-8"title/titlelink rel="stylesheet" href="../../layui/css/layui.css" /style#test-...
2024-10-24 前端开发问题
271

JavaScript小数运算出现多位的解决办法
在开发JS过程中,会经常遇到两个小数相运算的情况,但是运算结果却与预期不同,调试一下发现计算结果竟然有那么长一串尾巴。如下图所示: 产生原因: JavaScript对小数运算会先转成二进制,运算完毕再转回十进制,过程中会有丢失,不过不是所有的小数间运算会...
2024-10-18 前端开发问题
301

jQuery怎么动态向页面添加代码?
append() 方法在被选元素的结尾(仍然在内部)插入指定内容。 语法: $(selector).append( content ) var creatPrintList = function(data){ var innerHtml = ""; for(var i =0;i data.length;i++){ innerHtml +="li class='contentLi'"; innerHtml +="a href...
2024-10-18 前端开发问题
125

JavaScript(js)文件字符串中丢失"\"斜线的解决方法
问题描述: 在javascript中引用js代码,然后导致反斜杠丢失,发现字符串中的所有\信息丢失。比如在js中引用input type=text onkeyup=value=value.replace(/[^\d]/g,) ,结果导致正则表达式中的\丢失。 问题原因: 该字符串含有\,javascript对字符串进行了转...
2024-10-17 前端开发问题
437