Articles of spritebatch

SpriteBatch如何将单个纹理/资源用作多个独立的对象/实例

我使用LibGDX来创建一个游戏,但是我遇到了SpriteBatch的问题。 只要有两个使用相同图像作为精灵的对象进入屏幕,新对象就会replace旧对象。 所以,例如,一艘船将会来到屏幕上,当一艘同样的精灵船出现在屏幕上时,旧船将消失,新船将具有旧船的所有损坏和其他特征。 我总是可以制作同一图像的多个副本,并把它们放在资产文件夹中,但似乎没有必要。 有没有人有任何想法? 我正在使用SpriteBatch吗? 编辑:这里有几个游戏循环中渲染方法的例子。 渲染方法: private void renderDoodad(Doodad doodad) { if (!doodad.isDisabled()) { batch.begin(); if (doodad instanceof Enemy) { batch.draw(doodad.getSprite(), doodad.getX(), doodad.getY()); 接下来是一些关于如果船是玩家船的做法的代码。 但是玩家的船正在渲染,所以我把它留下了。 然后是渲染镜头的方法: private void renderShot(Shot shot) { if (!shot.isDisabled()) { batch.begin(); batch.draw( shot.getSprite(), shot.getX(), moveDoodadY(shot, shot.getDirection().getVal() * getApp().getGraphics().getDeltaTime())); batch.end(); } }

缩放/缩放SpriteBatch

我正在使用LibGDX开发我的第一款游戏,并且从ActionScript3开始使用,我可以按照自己想要的方式或多或less地缩放事物。 我知道它在LibGDX中有不同的作用,但我似乎无法弄清楚如何实现我正在尝试做的事情。 我有一个相机设置(OrthographicCamera),一个SpriteBatch,我渲染不同的物品(纹理),我想要的是能够缩放和移动一组物品,其余的保持完好。 我知道我可以缩放相机本身,但是这适用于SpriteBatch中的所有元素。 如果你之前使用过ActionScript,想象你有舞台(这是我的SpriteBatch),在那里我渲染不同的DisplayObject。 一些DisplayObjects里面还有其他的DisplayObject。 我计算这些偏移(item.x是parent.x + offsetInParent)。 现在我想要的是能够轻松地缩放一个这样的DisplayObject。 谢谢。

在Monogame中使用spriteBatch在3D / 2.5D中以一定角度绘制纹理

对于一个大学项目,我们正在创建一个小型的“2D”游戏。 我在2D中写2D是因为我们希望看到类似Do not Starve(比2.5D更好)的游戏。 正如你所看到的,所有的人物,树木等总是面向相机。 因为我们正在使用monogame / xna,所以spritebatch几乎就是去那里的方法。 我们使用下面的代码来绘制我们的WorldObjects: spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, currentCamera.CompleteMatrix); //spriteBatch.Draw(texture, objectRectangle, Color) <- this works perfect and as intended: //if we move the cameraPosition the sprites move accordingly. 现在对我们的问题:我们(当然)不希望地面也总是面对相机,而是看在一个微小的角度,我们说45度。 Spritebatch并不直接让我们这样做,但前面提到的.Begin() – 方法也有一个Effect(在我们的例子中是一个BasicEffect)。 这应该在理论上允许用spritebatch绘制3D(或者我在这里完全弄错了什么?)。 我们的地面绘图代码如下所示: BasicEffect effect = new BasicEffect(Resources.graphicsDevice); Matrix projection = Matrix.CreateOrthographicOffCenter(0, Resources.graphicsDevice.Viewport.Width, Resources.graphicsDevice.Viewport.Height, 0, -1000, 100000); […]

更改缩放纹理的Alpha混合颜色

它看起来像半透明的像素是混合的,而当绘制纹理时,颜色是缩放的。 当在黑暗的背景上绘制纹理时,这是非常明显的,看起来很丑。 public class SomeScreen implements Screen { private TextureRegion textureRegion; @Override public void show() { // Loading texture Texture texture = new Texture(Gdx.files.internal("texture.png"), true); // Setting filter to "linear" texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); // Getting the region textureRegion = new TextureRegion(texture, 0, 0, 64, 64); } @Override public void render(float delta) { // Clearing screen Gdx.gl.glClearColor(0.09f, […]

Cocos2d(Python)中的批量z顺序问题

我有一个奇怪的问题,我的hexmap绘图代码。 我的代码使用“挤压”六边形来实现伪等距视图。 因此,在屏幕上绘制它们的顺序非常重要。 值得庆幸的是,我正在使用三次方坐标,所以我可以将其中的一个作为所讨论的精灵的z级别。 我已经把它放在代码中,它几乎可以工作。 问题在于程序有时会产生exception的(和丑陋的)结果,尽管有相同的input。 对我来说,它看起来像一些精灵忽略我为他们设置的Z级。 看一看: 按照预期在左边工作,并在右边打破。 截至目前,我不知道哪个因素导致这个错误 – 连续三次脚本发布可以有任何好的和坏的结果的组合。 这是我的代码准系统版本。 我把所有不必要的部分都剥离了,只留下了关键的元素。 它基于Cocos2d(Python)库。 Hexmap以Hex(q,r,s)元组作为键存储为OrderedDict。 在绘制之前,所有的精灵都被打包成一个适当的z级别的批次。 按任何鼠标button强制程序重绘地图(这总是消除了问题 – 直到下一次启动)。 import os os.environ['PYGLET_SHADOW_WINDOW']="0" import pyglet import cocos import collections import math Hex = collections.namedtuple("Hex", ["q", "r", "s"]) Point = collections.namedtuple("Point", ["x", "y"]) Orientation = collections.namedtuple("Orientation", ["f0", "f1", "f2", "f3", "b0", "b1", "b2", "b3", "start_angle"]) Layout […]

我如何在游戏中绘制游戏的快照?

我正在做一个libGDX的游戏,主要关注点是“recursion”,所以我可以在游戏本身中播放多个实例,stream过游戏的“层”。 目前它的机制完美运行,但我只画出游戏的当前层。 我想让游戏更具有身临其境的感觉,所以我有了将所有层叠加在一起的想法,随着玩家的进步逐渐变得越来越小。 我在这里有一个形象,我打算做什么: 好的,那个编辑很蹩脚,但我想你会明白我的意思。 我所做的就是创建一个名为“recursion”的对象,它具有Menustate和GameState自定义状态,我使用SpriteBatch es进行绘制。 码: public class Recursive{ public static final float SCALE = 45; public static ArrayList<Body> forRemoval = new ArrayList<Body>(); public Recursive child; public Recursive parent; public int levelCreated; OrthographicCamera camera; public GameState game; ArrayList<RecState> states; int currentState = 0; Matrix4 transform; public Recursive(Recursive parent, GameState game, int levelCreated){ this.parent […]

SpriteBatch可以用来填充纹理的多边形吗?

我基本上需要使用SpriteBatch将纹理填充到多边形中。 我已经做了一些研究,但找不到任何有用的东西,除了多边形三角测量方法,只适用于凸多边形(没有潜入超级math这绝对不是我很擅长的)。 有没有解决scheme以基本方式填充多边形? 我当然需要dynamic的东西(我会有一个地图编辑器,你可以定义多边形,游戏会渲染它们(而碰撞检测也会使用它们,但是这是脱离主题),基本上我不能接受像“pre “计算”的位图或类似的东西,我需要用提供的分段绘制一个多边形,使用SpriteBatch到屏幕上。

XNA 4.0 – 混合3D和2D – SpriteBatch在整个场景中添加奇怪的alpha纹理

我正在XNA 4.0游戏中工作,目前已经完全使用3D,但现在我想要合并HUD。 我曾尝试使用spriteBatch做一个简单的testing: spriteBatch.Begin(); spriteBatch.Draw(Player.Texture, new Rectangle(0, GameConstants.GraphicsDevice.Viewport.Height – 50, 50, 50), Color.White); spriteBatch.End(); 这工作正常,testing纹理显示为正确位置的矩形,但背后的3d世界似乎有一个“阴霾”在顶部,看起来像绘制的“Player.Texture”已被放在视口的全部,但在像0.1f的alpha。 我google了一下,并有一个reset()函数来改变一些GraphicsDevice属性后绘制的SpriteBatch,但没有任何改变,我还没有看到任何其他人有这个问题。 我认为这将是SpriteBatch将blendmode更改为添加剂,但在我的reset()函数中,我将blendmode设置为不透明,所以我不知道这个奇怪的效果来自哪里,它看起来像我已经运行了一些后处​​理整个场景。 如果我更改SpriteBatch中绘制的Player.Texture,那么“阴霾”会变成看起来像新的纹理,所以它肯定与此相关。 是否还有其他GraphicsDevice属性,我应该检查以更改回来? 编辑 好吧,我刚刚意识到顶部的“阴霾”来自SkySphere纹理,我使用本教程中的MSDN skysphere着色器 。 所以当我注释掉SkySphere代码时,spritebatch和3d绘图看起来完全没问题,但是这让我不能再有SkySphere了。 在我使用SpriteBatch之后,为什么天光球是透明地在场景中绘制的,而不是在3D之后? 正如我之前所说,它看起来像添加剂混合。 下面是2个截图,顶部是spritebatch和没有skysphere,下面是spritebatch和skysphere我有问题。 为了保存上传,我裁剪了图像(目前我的networking速度非常慢),而且我已经在第二张图像中更改了场景的区域,以更清晰地显示它的外观。 当我用摄像机在场景中移动时,“雾霾”叠加层与SkySphere的工作方式保持相同的位置,因为没有考虑到世界matrix。

SharpDX的ContextDirect2D方法与XNA的SpriteBatch不同吗?

我在Win8中从XNA迁移到SharpDX。 我注意到这个 DrawBitmap调用的样本之一。 这与XNA的SpriteBatch中的某种形状,方式或forms有何不同?

XNA 4.0 – Skybox上的Spritebatch奇怪的蓝色阿尔法

我创建了一个3D场景,现在我想用SpriteBatch类绘制一个2D叠加层。 这是我的渲染代码: public void Draw(GameTime gametime) { SceneFactory.Graphics.GraphicsDevice.Clear(Color.CornflowerBlue); // Earth Matrix[] transforms = new Matrix[earth.Model.Bones.Count]; earth.Model.CopyAbsoluteBoneTransformsTo(transforms); sceneShader.CurrentTechnique = sceneShader.Techniques["Earth"]; view = viewcam.GetViewMatrix(); foreach (ModelMesh mesh in earth.Model.Meshes) { Matrix rotation = Matrix.CreateRotationY(earth.Rotation_Y) * Matrix.CreateRotationX(earth.Rotation_X); Matrix model = transforms[mesh.ParentBone.Index] * rotation * Matrix.CreateTranslation(earth.Position); Matrix modelview = model * view; lightposParam.SetValue(lightpos); ambientlightParam.SetValue(ambientLight.ToVector4()); diffuselightParam.SetValue(diffuseLight.ToVector4()); specularlightParam.SetValue(specularLight.ToVector4()); shininessParam.SetValue(shininess); diffusetexParam.SetValue(earthDiffuse); spectexParam.SetValue(earthSpec); […]