gpt4 book ai didi

javascript - Android CSS spritesheet webkit 转换和动画的问题

转载 作者:行者123 更新时间:2023-11-28 14:29:07 25 4
gpt4 key购买 nike

我对 HTML5 和 Android 还比较陌生,所以任何建议都很有用。我正在尝试用 HTML5 编写一个简单的游戏,主要针对移动设备。我正在为图形使用 spritesheet,“3d”webkit 转换转换以在 iOS 设备上强制硬件加速。到目前为止,它运行良好,在 iOS 设备以及 Safari、Firefox 和 Chrome 中运行良好。我的问题是 Android 设备上的浏览器(在 HTC Desire 上使用 Android 2.3.3 进行测试)——我希望它的行为像 Chrome,但显然我错了。 Android 似乎支持 webkit 的东西,但在 3d 转换和 CSS 动画方面存在问题(即使它们不使用 3D 转换)。

以下是我试图将问题归结为核心的尝试。 testimage.png 可以是任何东西,但对我来说它是一个 3*3 的网格,显示的数字排列如下:

012
345
678

iOS、Chrome 和 Safari 上的输出在垂直线上显示对应于 0、2 和 3 的纹理部分,其中 2 向上和向右动画。在 Android 上,动画“2”(和/或 3d 转换的“1”,如果您取消注释代码)显示整个图像而不是 _spriteDiv 大小定义的子集,并且在动画发生时显示“3”遇到同样的问题。

HTML:

<!DOCTYPE html>
<html>
<head>
<title>Android Sprite Test</title>
<style>
@-webkit-keyframes testAnim { from { -webkit-transform:translate(32px, 96px) } to { -webkit-transform:translate(256px, 0px) } }
</style>
</head>
<body bgcolor = "#606060">
<script src="./scripts/test.js"></script>
</body>
</html>

JavaScript:

var MakeSprite = function() {
var me = {},

_width = 32,
_height = 32,
_spriteFrame = 1,

_spriteDiv = document.createElement('div'),
_spriteImg = document.createElement('img');

_spriteDiv.id = 'spriteDiv';
_spriteDiv.style.position = 'absolute';
_spriteDiv.style.overflow = 'hidden';
_spriteDiv.style.width = _width + 'px';
_spriteDiv.style.height = _height + 'px';

_spriteImg.id = 'spriteImg';
_spriteImg.src = './testimage.png';
_spriteImg.width = Math.floor(_width * 3);
_spriteImg.height = Math.floor(_height * 3);
_spriteImg.style.position = 'absolute';

_spriteDiv.appendChild(_spriteImg);
document.body.appendChild(_spriteDiv);

me.setFrame = function(n) {

_spriteFrame = n;

_spriteImg.style.left = (-_width * (_spriteFrame % 3)) + 'px';
_spriteImg.style.top = (-_height * Math.floor(_spriteFrame / 3)) + 'px';
};

// Works on iOS, Safari and Chrome - but not Android?
me.translate3d = function(x, y) {
_spriteDiv.style.webkitTransform = 'translate3d(' + x + 'px,' + y + 'px,0px)';
}

// Works on Android, but presumably lacks the hardware acceleration of the 3D version
me.translate2d = function(x, y) {
_spriteDiv.style.webkitTransform = 'translate(' + x + 'px,' + y + 'px)';
}

me.testAnim = function() {
_spriteDiv.style.webkitAnimation = 'testAnim 5s';
}

return me;
};

/////////////////////////////////

// TEST SPRITES
// 2D translate works fine, but is suboptimal
var testSprite = new MakeSprite();
testSprite.translate2d(64, 32);
testSprite.setFrame(0);

// 3D translate doesn't work (it shows the whole image rather than clipping it),
// and it also breaks anything that comes after it
/*
var testSprite2 = new MakeSprite();
testSprite2.translate3d(64, 64);
testSprite2.setFrame(1);
*/

// CSS Animation breaks the sprite in the same way that 3D translation does
// (even though the animation works on a 2D translate), and similarly breaks
// sprites that come after it
var testSprite3 = new MakeSprite();
testSprite3.translate2d(64, 96);
testSprite3.setFrame(2);
testSprite3.testAnim();

// This will look wrong if any preceding sprites use translate3d or testAnim.
var testSprite4 = new MakeSprite();
testSprite4.translate2d(64, 128);
testSprite4.setFrame(3);

有谁知道我如何解决这些问题,以便我可以在当前版本的 Android 浏览器上使用 CSS 动画(最好是硬件加速的 webkit 转换)?我听说过在未来的 Android 版本中支持这种东西会减少错误,但老实说,我真的可以做一些适用于当前版本的东西。

最佳答案

我正在调查这个,我发现了以下内容:http://caniuse.com/transforms3d .显然,任何低于 3 的版本都不支持 3D 转换,这有点令人失望。

关于javascript - Android CSS spritesheet webkit 转换和动画的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7577296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com