最近我学到了一种很酷的技术,使用CSS3的 我的朋友都知道,年轻时候我非常痴迷《街头霸王》游戏,而当我看到了这个素材….你知道我的脑子里想到了什么吗? 让我们来做出第一个CSS动作首先我们要实现的是直拳(就是下面图案中的第三个)。第一步是打开Photoshop,抠出这几个图,这些图都要保持着70px宽和80px高。有一个很好的网站Texture Packer,它能帮你处理这些图片。最终,你的图片应该是这个样子: 下面我们需要有一个 /* html */ <div class="ken lazy "></div> /* css */ .ken { width:70px; height:80px; /* exactly the size of an image in our sprite */ background-image:url('../images/sprite.png'); } 这里我省略了可能需要的浏览器CSS前缀。那么,打直拳的CSS代码就应该是这样: /* css */ .punch { animation: punch steps(4) 0.15s infinite; } @keyframes punch { from { background-position:0px -160px; } to { background-position:-280px -160px; } } 我们这里做的就是定义一个动画CSS类( 我们还需要有个增加/删除 /* javascript */ $(document).on('keydown', function(e) { if (e.keyCode === 68) { // 68 是键盘上的D字符 $('.ken').addClass('punch'); setTimeout(function() { $ken.removeClass('punch'); }, 150); } }); 如果有人按下了“D”键,我们使用jQuery的 使用SASS改进代码如果你留心我们所做的事情,你会发现代码里有些值永远不会改变(图片的长宽等),而且,在创建了一些动画后,你会发现有很多重复的代码,这会让我们的代码很难阅读和维护。SASS能帮助我们消除重复的代码。 首先我们要创建几个基本的 @mixin animation($params) { -webkit-animation:$params; -moz-animation:$params; -ms-animation:$params; animation:$params; } @mixin keyframes($name) { @-webkit-keyframes $name { @content } @-moz-keyframes $name { @content } @-ms-keyframes $name { @content } @keyframes $name { @content } } 我们要把图片的长度和宽度存储到变量里,SASS变量在这里就有了很大的用处: $spriteWidth:70px; $spriteHeight:80px; 最终,我们把这些组合到一起,创建一个复杂的SASS mixin,用来声明我们的动画动作和计算背景移动的位置: @mixin anim($animName, $steps, $animNbr, $animParams){ .#{$animName} { @content; @include animation($animName steps($steps) $animParams); } @include keyframes($animName) { from { background-position:0px (-$spriteHeight * ($animNbr - 1)); } to { background-position:-($spriteWidth * $steps) (-$spriteHeight * ($animNbr - 1)); } } } 现在,你可以用一行代码创建一个动画动作: $spriteWidth:70px; $spriteHeight:80px; /* 直拳 */ @include anim($animName:punch, $steps:3, $animNbr:3, $animParams:.15s infinite); /* 踢腿 */ @include anim($animName:kick, $steps:5, $animNbr:7, $animParams:.5s infinite); /* 波動拳 */ @include anim($animName:hadoken, $steps:4, $animNbr:1, $animParams:.5s infinite); ... 这个 对光电球发生碰撞的检测我需要一个很高的频率对碰撞进行检测。每50毫秒对光电球的位置(偏移)检查一次,如果光电球的偏移量超出了窗口宽度,这意味着这个球要撞击到边框,我们要马上应用 下面就是如何实现的;虽然不完美,但完全可以运行: var $fireball = $(' 下一步需要做的我们可以很容易的往里面添加一些声效、背景音乐、其它视觉效果,还可以增加web RTC功能,让多台计算机控制多个人物。(也许你可以使用NodeJS和Socket.io,或Meteor framework);这些就是我喜欢web开发的原因:给你无限可能。 (英文:Build a Street Fighter Demo with CSS Animations and JavaScript.) 本文地址:http://www.webhek.com/street-fighter/ |