Articles of spritebatch

Sprite在libgdx中的绘制顺序

从其他的框架,我知道一个spritebatch中的简单sorting精灵的方法(以确定一个精灵必须在前面或后面的另一个精灵绘制)。 例如在MonoGame / XNA中,这称为Sprite.depth或Pyglet具有OrderedGroups 。 但是我在libgdx中找不到类似的东西。 我已经读过,libgdx的scene2d有类似的东西,但是我不想使用它,因为我使用了一个实体系统(ashley),并希望保持与其他逻辑分离。 设置libgdx sprites的绘制顺序的适当方法是什么?

如何使用实体组件系统进行批量渲染?

我有一个实体组件系统和一个2D渲染引擎。 因为我有很多重复的精灵(实体是非animation的,背景是基于图块的),我真的想使用批处理渲染来减less对绘图例程的调用。 把这个和engtity系统结合起来最好的办法是什么? 我想过每次更新帧都要创建和填充sprite batche,但这可能会很慢。 更好的方法是在初始化时将一个实体四元组的引用添加到sprite批处理中,但是这意味着实体工厂必须知道渲染系统,或者sprite批处理必须是某个Cache实体的组件。 一个案例很大程度上违反了封装,而另一个案例迫使实体系统中的非游戏对象实体,我不确定我是否喜欢它。 至于引擎,我使用Love2D( Love2D网站 )和FEZ( FEZ网站 )作为实体系统(所以一切都在Lua中)。 我更感兴趣的是如何正确实现这个模式,而不是语言/库特定的解决scheme。 提前致谢!

XNA:关于SpriteBatch.Draw()

我试图用XNA开发一个非常简单的乒乓游戏。 在我的Draw()中,我正在绘制球员的第一个球然后如下所示: spriteBatch.Draw(myPlayer, myPlayer1Pos, null, Color.Aqua); spriteBatch.Draw(myPlayer, myPlayer2Pos, null, Color.Aqua); spriteBatch.Draw(myBall, myBallPos, Color.LawnGreen); 现在问题是球不再显示在游戏窗口中,如下所示 另一方面,如果我在球员桨之前抽球 spriteBatch.Draw(myBall, myBallPos, Color.LawnGreen); spriteBatch.Draw(myPlayer, myPlayer1Pos, Color.Aqua); spriteBatch.Draw(myPlayer, myPlayer2Pos, Color.Aqua); 那么右侧桨不再可见,如下所示: 任何人都可以解释这里出了什么问题吗? 编辑:完整的Draw(): protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); spriteBatch.Draw(myBall, myBallPos, null, Color.LawnGreen); spriteBatch.Draw(myPlayer, myPlayer1Pos, null, Color.Aqua); spriteBatch.Draw(myPlayer, myPlayer2Pos, null, Color.Aqua); […]

XNA的SpriteBatch.Draw旋转,缩放和起源?

我使用1×1像素2D纹理作为SpriteBatch.Draw来源。 纹理缩放并围绕原点旋转。 左图只是缩放。 在底部中心的原点周围正确缩放+旋转。 我需要正确的图像作为结果。 即缩放到5×10和旋转2.5×10 如果原始参数在源纹理之外,问题是1×1纹理绘制开始行为奇怪。 只要原点被限制在1×1的最大值,就不可能围绕缩放纹理的底部中心旋转。 为什么起源的行为奇怪,如果它在源纹理之外? 奇怪的我的意思是纹理移动更多的原点值集。 即如果它的原点x = 10,则纹理移动多于10个像素。

一个文本的中心点?

我使用spritefont和spritebatch对象的draw.string函数绘制文本。 在某些方面,我需要增加文本的大小,所以我使用一个variables来缩放它。 所有这一切都工作正常,但我需要find文本的中心作为原点,使效果看起来像我想要的。 我怎样才能find文本的中心点? 当我使用纹理很容易,因为我只是采取了一半的纹理宽度和高度,但与spritefont,我没有任何想法如何进行。 谢谢。

XNA如何绘制一些精灵平铺/包裹和其他不是?

我已经有了: mySpriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend); 照顾好我所有的精灵 我现在想绘制一些纹理平铺。 我必须创建另一个SpriteBatch并调用: mySpriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.Opaque, SamplerState.LinearWrap, DepthStencilState.Default, RasterizerState.CullNone); 绘制我的平铺纹理? 但是,这些平铺的精灵不会被绘制在已经与之前的SpriteBatch绘制的精灵之上吗? 我真正想要的是能够通常绘制一些精灵和一些使用相同的SpriteBatch平铺,然后我的sorting不会被搞砸。 这可能吗? 我试过了: GraphicsDevice.SamplerStates [0] .AddressU = TextureAddressMode.Wrap; GraphicsDevice.SamplerStates [0] .AddressV = TextureAddressMode.Wrap; 在我的第一个也是唯一的SpriteBatch,但得到了InvalidOperationException: 无法更改只读的SamplerState。 状态对象在第一次绑定到GraphicsDevice时变成只读状态。 要更改属性值,请创建一个新的SamplerState实例。

如何将Texture2D旋转到屏幕上?

我正在绘制一个Texture2D到屏幕上,并且需要以3D方式向前旋转纹理。 我正在使用SpriteBatch Draw()方法,它只允许围绕Z轴进行有限的2D旋转。 从大量的在线研究中,我已经解决了将效果或matrix传递给SpriteBatch的Begin()方法的解决scheme; 然而,经过几个小时的反复试验,我还没有拿出任何工作。

纹理渲染纹理渲染在GPU上的团结

我正在Unity 5.1中使用2D sidescroller。 地形意图在所有4个方向上是半无限的,使用噪声algorithm程序化地生成。 我正在使用一个3×3的四边形网格作为“块”,当相机平移时,我移动/更新。 我遇到的问题与我绑定到每个块的dynamic纹理有关。 当他们需要被创建,而不是只是左右移动时,我不太清楚如何在不使用系统内存的情况下将单个贴图中的各个贴图渲染到另一个贴图上的特定位置。 使用setpixels,我相信它是通过颜色数据每个应用到GPU端。 使用带有渲染结构的gui / graphics来绘制纹理或任何变体,似乎是在每个调用中进行单独的绘制,而不是给我批量的机会。 考虑到我试图让瓷砖的大小只有8×8像素(意味着更高的屏幕分辨率=更多的屏幕上的瓷砖),使用本机的游戏对象的FAR的开销太多了。 那么,在Unity中是否可以使用低级纹理来纹理渲染/纹理/绘制/其他function,而不需要将纹理数据拖入系统内存,并且仍然将相同的材质/纹理调用组合在一起,而无需从资产商店购买一些工具包? 如果其中任何一个没有意义,请提出任何需要帮助的帮助,并根据需要进行更新。 谢谢!

在XNA中裁剪一条线(激光束)

我有一个激光精灵,我希望裁剪。 我想裁剪它,所以当它碰撞一个项目,我可以计算出发点和结束点之间的距离,只有绘制。 这消除了通过物品的激光绘图的“透支”。 本质上,我试图裁剪一条线,但是也要把那条线“附”到我的船的鼻子上。 该线不应该被拖到我的船的鼻子,这应该是起点。 没有轮换担心。 目前,我认为通过SpriteBatch做到这一点是最好的。 这是我目前的Spritebatch代码: spriteBatch.Draw(Laser.sprite, new Rectangle((int)Laser.position.X, (int)Laser.position.Y, Laser.sprite.Width, LaserHeight), new Rectangle(0, 0, (int)(Laser.sprite.Width), LaserHeight), new Color(255, 255, 255, (byte)MathHelper.Clamp(Laser.Alpha, 0, 255)), Laser.rotation, new Vector2(Laser.sprite.Width/2, LaserHeight/2), SpriteEffects.None, 0); 但是这不是很有效。 它只画出部分精灵,但是当LaserHeight增加时,它会延长线条的两种方式! 我相信这是由于我的抽签的起源一些愚蠢的错误。 快速回顾 :我需要将我的激光精灵的底部绘制在我的船头上,然后使用LaserHeight裁剪图像,以便只绘制其中的一部分。 我有一种感觉,我的解释有点…缺乏。 所以,如果你需要更多的信息,请说出来,我会尽量提供更多的信息。 提前致谢!

scene2d(libGDX)知道图像何时被抽出屏幕?

我的意思是,我想用scene2d做一个平铺的地图,所以在我的游戏的渲染方法中… @Override public void render(float delta) { Gdx.gl.glClearColor(0.5f, 0.5f, 0.5f, 1f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); gameStage.getCamera().position.set(player.getX(), player.getY(), 0); gameStage.act(Gdx.graphics.getDeltaTime()); gameStage.getBatch().begin(); for(int i=0;i<20;i++) for(int j=0;j<20;j++) gameStage.getBatch().draw(tile,i*tileSize,j*tileSize,tileSize,tileSize); gameStage.getBatch().end(); gameStage.draw(); } scene2d知道tile是否在屏幕视图之外,所以它不绘制它,还是我必须实现代码来修复它? 对不起我的英语不好。