3954

LIBGDX ScissorStack Example?

I am looking to create a fog-of-war style effect around on sprite units and was told scissorstack would do the job but I can't figure out what i am doing wrong...

I have the typical libgdx set up. I have a class for every Game Character. I would like to control 'how far out' each unit sees by configuring each class. So say I want MainPlayer with fog of war 5, but a Pawn unit to have a fog of war of 1 space around the tile the unit is located in.

I have the sprite loaded, tmx map and collision detection working fine. Now I just can't figure out where I should put the scissorstack code in the Player class / how to get it working. I'd also like to know the coordinates of the visible tiles around the fog...

public class Player extends Sprite implements InputProcessor{ private Vector2 velocity = new Vector2(); public Player(Sprite sprite, TiledMapTileLayer collision layer){ super(sprite); this.collisionLayer=collisionLayer; } public void draw(SpriteBatch spriteBatch){ update(Gdx.graphics.getDeltaTime()); super.draw(spriteBatch); } public Vector2 getVelocity() { return velocity; } public void setVelocity(Vector2 velocity) { this.velocity = velocity; } public float getSpeed() { return speed; } public void setSpeed(float speed) { this.speed = speed; } public float getGravity() { return gravity; } public void setGravity(float gravity) { this.gravity = gravity; } public TiledMapTileLayer getCollisionLayer() { return collisionLayer; } public void setCollisionLayer(TiledMapTileLayer collisionLayer) { this.collisionLayer = collisionLayer; } public boolean keyDown(int keycode){ switch(keycode){ case Keys.W: setY(getY()+1*50);//velocity.x=speed; break; case Keys.A: setX(getX()-1*50);//velocity.x=-speed; break; case Keys.D: setX(getX()+1*50);//velocity.x=speed; break; case Keys.S: setY(getY()-1*50);//velocity.y=-speed; break; } System.out.println(getX()/50+", "+getY()/50); return true; } public boolean keyUp(int keycode){ switch(keycode){ case Keys.W: velocity.y=0; break; case Keys.A: velocity.x=0; break; case Keys.D: velocity.x=0; break; case Keys.S: velocity.y=0; break; }return true; } @Override public boolean keyTyped(char character) { // TODO Auto-generated method stub return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { // TODO Auto-generated method stub return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { // TODO Auto-generated method stub return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { // TODO Auto-generated method stub return false; } @Override public boolean mouseMoved(int screenX, int screenY) { // TODO Auto-generated method stub return false; } @Override public boolean scrolled(int amount) { // TODO Auto-generated method stub return false; } } }

I tried following: Making a Group hide Actors outside of its bounds

This is what i tried in the Player class' draw method:

public void draw(SpriteBatch spriteBatch){ update(Gdx.graphics.getDeltaTime()); Rectangle scissors = new Rectangle(); Rectangle clipBounds = new Rectangle(getX(),getY(),4*width,4*height); ScissorStack.calculateScissors(camera, spriteBatch.getTransformMatrix(), clipBounds, scissors); ScissorStack.pushScissors(scissors); spriteBatch.draw(...); spriteBatch.flush(); ScissorStack.popScissors(); super.draw(spriteBatch); }

I am beyond confused. An example of usin scissorstack within the player entity class would be helpful. thanks

Answer1:

NathanSweet was kind enough to help me out figuring out how to make it work (for LibGdx 0.9.9) a while back: CalculateScissors

So for anyone looking for an example, this code has worked for me before:

Rectangle scissor = new Rectangle(); Rectangle clipBounds = new Rectangle(0, 0, worldW, worldH); ... batch.begin(); ... ScissorStack.calculateScissors(camera, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), batch.getTransformMatrix(), clipBounds, scissor); ScissorStack.pushScissors(scissor); ... ScissorStack.popScissors(); batch.end();

All you need is to play around with the clipBounds' values so the desired effect takes place.

Answer2:

I haven't used it myself, but I'd try it this way:

public void draw(SpriteBatch spriteBatch) { update(Gdx.graphics.getDeltaTime()); Rectangle scissors = new Rectangle(); Rectangle clipBounds = new Rectangle(getX(),getY(),4*width,4*height); ScissorStack.calculateScissors(camera, spriteBatch.getTransformMatrix(), clipBounds, scissors); ScissorStack.pushScissors(scissors); super.draw(spriteBatch); ScissorStack.popScissors(); }

Recommend

  • Is there an inexpensive way to transfer colour data from a RenderTarget2D on a per frame basis?
  • XNA game studio LoadContent
  • Could not load asset as a non-content file
  • Cannot modify the return value of
  • Farseer - Particles doesn´t move/bounce accord to borders
  • How to set up libdgx with IntelliJ?
  • Box2DDebugRenderer and SpriteBatch misplaced
  • How to load a TrueTypeFont with different parameters? LibGDX
  • Render isometric text in 2D
  • Cannot render .tmx map using OrthogonalTiledMapRenderer (Android)
  • libgdx world to screen pos and factors
  • Libgdx Camera - Setting position having no effect
  • XNA - Drawing Strings on Menus
  • XNA - How to dim a section of the screen?
  • LIBGDX ScissorStack Example?
  • Box2D collisions error
  • Maximum Flow in Directed Graph
  • Could we use owl:sameAs in an OWL restriction?
  • Pygame trigonometry: Following the hypotenuse?
  • XNA - How to change orientation of Drawing a List of Strings
  • “tkinter.TclError: invalid command name” error after calling root.destroy()
  • All bodies have rigidbody 2d and boxcollider2d and there's no collision
  • LibGDX Multiply Vector2 with float value
  • What is the difference between Socket.Send and Stream.Write? (in relation to tcp ip connections)
  • Creating interactive SVG maps for a web portal
  • Recreate Apple Watch fitness tracker ‘progress’ bar - gradient on CAShapeLayer stroke
  • Smiles in output C++
  • Drag and reorder - UICollectionview with sections
  • Thrust filter by key value
  • WPF Image control clipping
  • Blackberry 6: how to detect a long click on track pad?
  • Creating Java object from class name with constructor, which contains parameters [duplicate]
  • how to avoid repetitive constructor in children
  • Moving Android View and preventing onDraw to be called over and over again
  • Stop Bash Script if Hive Fails
  • Blackberry - Custom EditField Cursor
  • Body moving without any force applied? (Box2d)
  • Update CALayer sublayers immediately
  • Deleting and Updating values from a cusrsor adapter
  • Possible to stop flickering java tooltip in heavyweight mode?