VML一游戏类应用,赛车轨迹
在VML绘图中,当绘制shap的时候,网上普遍有个说法是通过调整CoordOrig可以调整坐标系的原点位置
可经过很多尝试以后依旧没有任何反应,当调整这个值的时候。
而且发现默认状态下,v:shape根本没有CoordOrig属性(null),后来终于发现,其实坐标系的调整是通过
改变CoordSize和shap本身的style.left/style.top来调整的。
一个width和height都是400的shape类型DOM,当绘制的内容超出范围的时候依然能够显示,没有任何影响。
所以,实际上原点始终在DOM的左上角,不同的是,我们的绘图区域可以超过DOM的左上角!!
CoordSize="400,-400" 的时候,表示DOM的右下角坐标是(400,-400), 而DOM的左上角始终是(0,0)
所以,就得到以后右为正的X轴和上为正的Y轴, 这时再进行绘图,就是以DOM的左上角为原点的一个常规数学坐标系。
下面是一则对line的小应用。经过改进的话可以做成一个简单的类似贪吃蛇的游戏。
使用键盘的左右键来调整方向,上下键调整速度
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office" lang="en">
<head>
<title>画斜线</title>
<!--[if !mso]>
<style>
v\:*{behavior:url(#default#VML)}
</style>
<![endif]-->
<style type="text/css">
body{padding:0px;margin:0px;}
#line{position:absolute;left:0;top:0;z-Index:3;}
</style>
</head>
<body>
<v:line id="line"></v:line>
<v:PolyLine id="pLine" filled="false" Points="0,0 0,100"></v:PolyLine>
<v:shape CoordOrig="100,100" CoordSize="200,200">
</v:shape>
<script language="javascript">
var line=document.getElementById("line");
line.to="0,0";
line.from="0,0";
with(line.stroke)
{
Color="#FF0000";
Weight="1px";
EndArrow="Classic";
DashStyle="LongDashDot";
}
line=document.getElementById("pLine");
line.style.position="absolute";
with(line.stroke)
{
Color="#000";
Weight="1px";
EndArrow="Classic";
DashStyle="Solid";
}
line.Points.value="10,10 100,100 200,300 400,500";
var html="10,10";
var direction=0;
var prePoint=[10,10];
var step=5;
function Move()
{
var x=step*Math.cos(direction);
var y=step*Math.sin(direction);
var p=prePoint;
p[0]+=x;
p[1]-=y;
p[0]=Math.round(p[0]);
p[1]=Math.round(p[1]);
if(p[0]>=0&&p[1]>=0&&step>0)
{
prePoint=p;
html+=" "+prePoint[0]+","+prePoint[1];
line.Points.value=html;
}
}
window.setInterval(Move,50);
function document_KeyDown(e)
{
var e=window.event;
if(e.keyCode==37)
direction+=0.1;
else if(e.keyCode==39)
direction-=0.1;
else if(e.keyCode==38)
step=Math.min(Math.max(step+1,1),15);
else if(e.keyCode==40)
step=Math.max(step-1,0);
}
document.onkeydown=document_KeyDown;
document.body.focus();
</script>
</body>
</html>
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office" lang="en">
<head>
<title>画斜线</title>
<!--[if !mso]>
<style>
v\:*{behavior:url(#default#VML)}
</style>
<![endif]-->
<style type="text/css">
body{padding:0px;margin:0px;}
#line{position:absolute;left:0;top:0;z-Index:3;}
</style>
</head>
<body>
<v:line id="line"></v:line>
<v:PolyLine id="pLine" filled="false" Points="0,0 0,100"></v:PolyLine>
<v:shape CoordOrig="100,100" CoordSize="200,200">
</v:shape>
<script language="javascript">
var line=document.getElementById("line");
line.to="0,0";
line.from="0,0";
with(line.stroke)
{
Color="#FF0000";
Weight="1px";
EndArrow="Classic";
DashStyle="LongDashDot";
}
line=document.getElementById("pLine");
line.style.position="absolute";
with(line.stroke)
{
Color="#000";
Weight="1px";
EndArrow="Classic";
DashStyle="Solid";
}
line.Points.value="10,10 100,100 200,300 400,500";
var html="10,10";
var direction=0;
var prePoint=[10,10];
var step=5;
function Move()
{
var x=step*Math.cos(direction);
var y=step*Math.sin(direction);
var p=prePoint;
p[0]+=x;
p[1]-=y;
p[0]=Math.round(p[0]);
p[1]=Math.round(p[1]);
if(p[0]>=0&&p[1]>=0&&step>0)
{
prePoint=p;
html+=" "+prePoint[0]+","+prePoint[1];
line.Points.value=html;
}
}
window.setInterval(Move,50);
function document_KeyDown(e)
{
var e=window.event;
if(e.keyCode==37)
direction+=0.1;
else if(e.keyCode==39)
direction-=0.1;
else if(e.keyCode==38)
step=Math.min(Math.max(step+1,1),15);
else if(e.keyCode==40)
step=Math.max(step-1,0);
}
document.onkeydown=document_KeyDown;
document.body.focus();
</script>
</body>
</html>
来自BestEast的技术分享, JavaScript的奇思妙想, 抛砖引玉,希望能再激起哪位的好创意。
在一些图形应用上,VML极其之方便,但现如今日趋强大的非IE浏览器使得VML几近要退出历史舞台了。
在绘图的组建逻辑上,其实SVG和VML有不少共同之处,如果哪位牛人能够开发出一个兼容VML和SVG的客户端JS绘图组件……
分类:
Crazy Code
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述