使用html5 canvas 画一台小单车动画

       最近一直在搞前端,不过没用过canvas,呵呵!就想试一下,也刚刚好我图形学的作业就是做一台小单车动画(不限语言),所以我就在一个蛋疼的下午写了一台很蛋疼的单车了,呵呵!样子很丑,不过可以美化,大家可以参考参考!高手勿进虐我这小菜菜,菜鸟共同分享也可以参考当课堂作业,呵呵!

       废话不说,先看代码:

      HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <title></title>
    <link rel="stylesheet" href="../css/text.css" />
    <script type="text/javascript" src="../js/canvas.js"></script>
</head>
<body>
    <canvas class="mycanvas" id="mycanvas">
    </canvas>
    <button οnclick="start()">神啊!赐予我小单车神奇的力量吧!</button>
</body>
</html>


       CSS:
#mycanvas{
    width: 1300px;
    height: 700px;
    background-color: #d1fffe;
    border: 1px solid #000;
}



       JS:
var model;
var bike;
var incremental=0;
var timer;

if(!model)
model={};
model.create = function(){};
model.create.prototype = {
    cxt : null,
    canvas : null,
    init: function (){
        canvas = document.getElementById("mycanvas");
        canvas.width = 1300;
        canvas.height = 700;
        cxt = canvas.getContext("2d");
    },
    drawLine : function (x1,y1,x2,y2){
        cxt.beginPath();
        cxt.moveTo(x1,y1);
        cxt.lineTo(x2,y2);
        cxt.closePath();
        cxt.stroke();
    },
    drawCircle : function (centerX, centerY, radius){
        cxt.beginPath();
        cxt.strokeStyle = "rgb(0,0,0)";
        cxt.arc(centerX,centerY,radius,0,Math.PI*2,false);
        cxt.closePath();
        cxt.stroke();
    },
    drawRect : function (x,y,width,height){
        cxt.beginPath();
        cxt.strokeStyle = "rgb(0,0,0)";
        cxt.strokeRect(x,y,width,height);
        cxt.closePath();
        cxt.stroke();
    },
    clearCanvas : function (){
        cxt.fill();
        cxt.clearRect(0,0,1300,700);
    }
};

window.onload = function (){
    bike = new model.create();
    bike.init();
    //先初始化一辆单车
    draw();
}

function start(){
    timer = setInterval("draw()",100);
}

function draw(){
    //先清除canvas
    bike.clearCanvas();
    //第1部分
    bike.drawLine(980+incremental,280,930+incremental,380);
    //第2部分
    bike.drawLine(955+incremental,330,990+incremental,370);
    //第3部分
    bike.drawLine(990+incremental,370,990+incremental,420);
    //第4部分
    bike.drawLine(990+incremental,420,950+incremental,500);
    //第5部分
    bike.drawCircle(950+incremental,500,50);
    //第6部分
    bike.drawLine(990+incremental,395,1200+incremental,395);
    //第7部分
    bike.drawLine(1080+incremental,370,1080+incremental,395);
    //第8部分
    bike.drawRect(1040+incremental,355,80,15);
    //第9部分
    bike.drawLine(1150+incremental,395,1200+incremental,500);
    //第10部分
    bike.drawCircle(1200+incremental,500,50);
    //第11部分
    bike.drawRect(1200+incremental,387,60,15);

    //k约等于25根号2,稍微用圆的方程算算就OK
    var k = 35.3;

    //第12,13,14,15部分
    if(incremental%2==0){
        //第12部分
        bike.drawLine(950+incremental,450,950+incremental,550);
        //第13部分
        bike.drawLine(900+incremental,500,1000+incremental,500);
        //第14部分
        bike.drawLine(1200+incremental,450,1200+incremental,550);
        //第15部分
        bike.drawLine(1150+incremental,500,1250+incremental,500);
    }
    else{
        //第12部分
        bike.drawLine(950+incremental-k,500-k,950+incremental+k,500+k);
        //第13部分
        bike.drawLine(950+incremental+k,500-k,950+incremental-k,500+k);
        //第14部分
        bike.drawLine(1200+incremental-k,500-k,1200+incremental+k,500+k);
        //第15部分
        bike.drawLine(1200+incremental+k,500-k,1200+incremental-k,500+k);
    }

    incremental = incremental-5;
    if(incremental<-650)
        clearInterval(timer);
}



       步骤:

       1.先封装好一个model的类,里面有各种画图的方法

       2:然后onload的时候调用draw()初始化一台单车

       3:当按下按钮的时候出发start()触发动画效果

       4:其实动画效果就是在x轴上平移,然后4条车轮轴在交替出现,形成在运动的过程而已

       呵呵,是不是很简单,当你空虚寂寞难耐又无聊的时候,不妨也可以写点东西打发下时间,呵呵!看看效果图吧!



点击下图就会运动起来(只是说明,没有效果,想看效果,自己黏贴代码运行下,呵呵!)

          呵呵,我这菜鸟哪里写得不好的地方请各位大神指出错误,呵呵!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 HTML5 Canvas 吃豆豆小游戏的代码: ```html <!DOCTYPE html> <html> <head> <title>Pac-Man</title> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="canvas" width="400" height="400"></canvas> <script> // 获取 canvas 元素和上下文 var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); // 定义 Pac-Man 的属性 var pacMan = { x: 200, y: 200, radius: 20, mouthAngle: Math.PI / 6, direction: "right" }; // 绘制 Pac-Man function drawPacMan() { ctx.beginPath(); ctx.arc(pacMan.x, pacMan.y, pacMan.radius, pacMan.mouthAngle, 2 * Math.PI - pacMan.mouthAngle); ctx.lineTo(pacMan.x, pacMan.y); ctx.fillStyle = "yellow"; ctx.fill(); } // 更新 Pac-Man 的状态 function updatePacMan() { // 根据方向更新 Pac-Man 的位置 switch (pacMan.direction) { case "right": pacMan.x += 5; break; case "left": pacMan.x -= 5; break; case "up": pacMan.y -= 5; break; case "down": pacMan.y += 5; break; } // 计算 Pac-Man 的嘴巴角度 if (pacMan.mouthAngle <= 0 || pacMan.mouthAngle >= Math.PI / 3) { pacMan.mouthAngleDelta = -pacMan.mouthAngleDelta; } pacMan.mouthAngle += pacMan.mouthAngleDelta; // 检测 Pac-Man 是否碰到边界 if (pacMan.x - pacMan.radius < 0 || pacMan.x + pacMan.radius > canvas.width || pacMan.y - pacMan.radius < 0 || pacMan.y + pacMan.radius > canvas.height) { // 如果碰到边界,改变方向 switch (pacMan.direction) { case "right": pacMan.direction = "down"; break; case "left": pacMan.direction = "up"; break; case "up": pacMan.direction = "right"; break; case "down": pacMan.direction = "left"; break; } } } // 主循环 function mainLoop() { // 清除布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 绘制 Pac-Man drawPacMan(); // 更新 Pac-Man 的状态 updatePacMan(); // 循环调用主循环 requestAnimationFrame(mainLoop); } // 启动游戏 mainLoop(); </script> </body> </html> ``` 这个代码定义了一个 Pac-Man 对象,包括 Pac-Man 的位置、大小、嘴巴角度和方向。然后,它通过 Canvas API 绘制 Pac-Man,并在主循环中不断更新 Pac-Man 的状态。在更新 Pac-Man 的位置时,它还检测 Pac-Man 是否碰到边界,并根据需要改变 Pac-Man 的方向。最后,它通过 requestAnimationFrame() 函数循环调用主循环,从而实现动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值