SlideShare a Scribd company logo
libGDX:	
  User	
  Input	
  and	
  Frame	
  by	
  
Frame	
  Anima8on	
  
Jussi	
  Pohjolainen	
  
Tampere	
  University	
  of	
  Applied	
  Sciences	
  
TOUCH	
  +	
  KEYBOARD	
  
Event	
  vs	
  Polling	
  
•  Polling	
  
–  Do	
  something	
  on	
  each	
  frame,	
  really	
  fast	
  
•  Was	
  mouse	
  clicked?	
  Was	
  mouse	
  clicked?	
  Was	
  mouse	
  
clicked?	
  
–  Good	
  for	
  arcade	
  games	
  
•  Event	
  
–  Do	
  something	
  when	
  event	
  handles	
  
•  No8fy	
  when	
  mouse	
  was	
  clicked	
  
•  Mouse	
  /	
  touch	
  /	
  keyboard	
  can	
  be	
  received	
  either	
  
in	
  1)	
  polling	
  or	
  2)	
  event	
  handling	
  
Polling	
  Touch	
  /	
  Keyboard	
  
•  For	
  most	
  arcade	
  games,	
  polling	
  is	
  good	
  
•  Mul8touch	
  is	
  supported!	
  
–  boolean first = Gdx.input.isTouched(0);
–  boolean second = Gdx.input.isTouched(1);
–  int firstX = Gdx.input.getX();
–  int firstY = Gdx.input.getY();
–  int secondX = Gdx.input.getX(1);
–  int secondY = Gdx.input.getY(1);
•  Keyboard	
  
–  boolean isAPressed = Gdx.input.isKeyPressed(Keys.A);
Polling:	
  InputProcessor
•  An	
  InputProcessor	
  (Interface)	
  is	
  used	
  to	
  
receive	
  input	
  events	
  from	
  the	
  keyboard	
  and	
  
the	
  touch	
  screen	
  
•  It	
  has	
  to	
  be	
  registered	
  
– Input.setInputProcessor(InputProcessor);
•  When	
  registered	
  the	
  methods	
  from	
  
InputProcessor	
  interface	
  are	
  called.
InputProcessor	
  -­‐	
  methods	
  
Using	
  InputProcessor
public class InputDemo extends ApplicationAdapter implements InputProcessor {
@Override
public void create () {
Gdx.input.setInputProcessor(this);
}
@Override
public void render () {
}
@Override
public boolean keyDown(int keycode) {
return false;
}
@Override
public boolean keyUp(int keycode) {
return false;
}
...
	
  
Using	
  InputAdapter	
  and	
  Inner	
  Class	
  
public class InputDemo extends ApplicationAdapter {
@Override
public void create () {
Gdx.input.setInputProcessor(new Listener());
}
private class Listener extends InputAdapter {
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
// implementation here
return true;
}
}
}
GESTURES	
  
GestureDetector	
  
•  TouchDown	
  
–  User	
  touches	
  screen	
  
•  LongPress	
  
–  User	
  touches	
  screen	
  for	
  some	
  8me	
  
•  Tap	
  
–  User	
  touches	
  screen	
  and	
  liVs	
  the	
  finger	
  again	
  
•  Pan	
  
–  User	
  drags	
  a	
  finger	
  across	
  the	
  screen.	
  Useful	
  for	
  implemenIng	
  Camera	
  panning	
  in	
  2D	
  
•  PanStop	
  
–  Called	
  when	
  no	
  longer	
  panning	
  
•  Fling	
  
–  User	
  dragged	
  a	
  finger	
  across	
  the	
  screen,	
  then	
  liVed	
  up.	
  Useful	
  for	
  swipe	
  gestures	
  
•  Zoom	
  
–  User	
  places	
  two	
  fingers	
  on	
  the	
  screen	
  and	
  moves	
  them	
  together/apart.	
  Useful	
  for	
  Camera	
  
zooming	
  
•  Pinch	
  
–  Zooming	
  +	
  rota8on	
  
Star8ng	
  to	
  Listen	
  to	
  Gestures	
  
•  Really	
  easy	
  
–  Gdx.input.setInputProcessor(new
GestureDetector(GestureListener));
•  GestureListener	
  is	
  an	
  interface	
  
•  GestureAdapter	
  also	
  available	
  
	
  
GestureListener	
  
public class MyGestureListener implements GestureListener {
@Override
public boolean touchDown(float x, float y, int pointer, int button) {}
@Override
public boolean tap(float x, float y, int count, int button) {}
@Override
public boolean longPress(float x, float y) {}
@Override
public boolean fling(float velocityX, float velocityY, int button) {}
@Override
public boolean pan(float x, float y, float deltaX, float deltaY) {}
@Override
public boolean panStop(float x, float y, int pointer, int button) {}
@Override
public boolean zoom (float originalDistance, float currentDistance){}
@Override
public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2
firstPointer, Vector2 secondPointer){}
}
ACCELEROMETER	
  
Accelerometer	
  
•  An	
  accelerometer	
  
measures	
  the	
  
accelera8on	
  of	
  a	
  device	
  
on	
  three	
  axes	
  
•  From	
  this	
  accelera8on	
  
one	
  can	
  derive	
  the	
  8lt	
  or	
  
orienta8on	
  of	
  the	
  device.	
  
–  Phones:	
  portrait	
  default	
  
–  Tablet:	
  landscape	
  default	
  
•  LibGDX	
  shows	
  
accelerometer	
  readings	
  
always	
  as	
  in	
  the	
  image	
  
(0,0)	
  
Accelerometer	
  x	
  
Accelerometer	
  y	
  
y	
  increments	
  
x	
  increments	
  
Accelerometer	
  Readings	
  
•  Accelerometer	
  readings	
  can	
  be	
  accessed	
  	
  
–  float accelX = Gdx.input.getAccelerometerX();
–  float accelY = Gdx.input.getAccelerometerY();
–  float accelZ = Gdx.input.getAccelerometerZ();
•  When	
  moving	
  and	
  if	
  in	
  landscape	
  mode	
  in	
  
android,	
  no8ce	
  X	
  vs	
  Y!	
  
–  speedX += Gdx.input.getAccelerometerY();
SIMPLE	
  TEXT	
  INPUT	
  
User	
  input	
  
•  Desktop	
  
– Swing	
  dialog	
  
•  Android	
  
– Android	
  dialog	
  
•  Use	
  TextInputListener
public class InputDemo extends ApplicationAdapter {
@Override
public void create () {
MyTextInputListener listener = new MyTextInputListener();
Gdx.input.setInputProcessor(newGestureDetector(newGestureDetector.GestureAdapter(){
@Override
public boolean tap(float x, float y, int count, int button) {
Gdx.input.getTextInput(new MyTextInputListener(), "title", "test", "hint");
return true;
}
}));
}
private class MyTextInputListener implements Input.TextInputListener {
@Override
public void input (String text) {
Gdx.app.log("InputDemo", text);
}
@Override
public void canceled () {
Gdx.app.log("InputDemo", "canceled");
}
}
}
SPRITE	
  
Game	
  Object	
  
•  Game	
  object	
  may	
  hold	
  informa8on	
  about	
  
–  Texture	
  
–  Geometry	
  
•  width	
  
•  height	
  
•  x,	
  y	
  
–  Color	
  
•  You	
  could	
  create	
  a	
  class	
  for	
  your	
  game	
  object	
  
that	
  capsulates	
  all	
  of	
  these	
  
•  But	
  even	
  beaer,	
  libGDX	
  has	
  already	
  this	
  class,	
  it's	
  
called	
  Sprite
Sprite	
  -­‐	
  class	
  
•  Holds	
  geometry,	
  color	
  and	
  texture	
  
informa8on	
  
•  Has	
  a	
  posi8on	
  and	
  a	
  size	
  given	
  as	
  width	
  and	
  
height	
  
•  Sprite	
  is	
  always	
  rectangular	
  
•  Sprite	
  has	
  also	
  origin	
  for	
  rota8on	
  and	
  scaling	
  
– origin	
  is	
  in	
  boaom	
  leV	
  
Crea8ng	
  a	
  Sprite
public class SpriteDemo extends ApplicationAdapter {
private Sprite player;
private Texture alienTexture;
private OrthographicCamera camera;
private SpriteBatch batch;
public final static float WIDTH = 1280;
public final static float HEIGHT = 720;
@Override
public void create () {
player = new Sprite( alienTexture = new Texture("alien-displeased-icon.png") );
camera = new OrthographicCamera();
camera.setToOrtho(false, WIDTH, HEIGHT);
batch = new SpriteBatch();
}
@Override
public void render() {
batch.setProjectionMatrix(camera.combined);
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
player.draw(batch);
batch.end();
}
@Override
public void dispose() {
alienTexture.dispose();
}
}
	
  
FRAME	
  ANIMATION	
  
Anima8on	
  
•  Use	
  Anima8on	
  class	
  
– Animation walkAnimation = new
Animation(frameDuration, frames);
•  Frame	
  dura8on?	
  Time	
  between	
  frames	
  in	
  
seconds:	
  1	
  /	
  60	
  fps	
  
•  Frames?	
  
– TextureRegion	
  array	
  
•  TextureRegion?	
  
– Part	
  of	
  texture
TextureRegion	
  
Split	
  .png	
  into	
  TextureRegions	
  
walkSheet = new Texture(Gdx.files.internal(”image.png"));
// Method for splitting one texture to TextureRegions
TextureRegion[][] tmp = TextureRegion.split(
walkSheet,
walkSheet.getWidth() / FRAME_COLS,
walkSheet.getHeight() / FRAME_ROWS );
2D	
  array	
  -­‐>	
  1D	
  
private TextureRegion[] transformTo1D(TextureRegion[][] tmp) {
TextureRegion [] walkFrames
= new TextureRegion[FRAME_COLS * FRAME_ROWS];
int index = 0;
for (int i = 0; i < FRAME_ROWS; i++) {
for (int j = 0; j < FRAME_COLS; j++) {
walkFrames[index++] = tmp[i][j];
}
}
return walkFrames;
}
Split	
  .png	
  into	
  TextureRegions	
  
walkSheet = new Texture(Gdx.files.internal(”image.png"));
// Method for splitting one texture to TextureRegions
TextureRegion[][] tmp = TextureRegion.split(
walkSheet,
walkSheet.getWidth() / FRAME_COLS,
walkSheet.getHeight() / FRAME_ROWS );
TextureRegion [] frames = transformTo1D(tmp);
Animation walkAnimation = new Animation(1 / 60f, frames);
Rendering	
  
float stateTime = 1.0f;
TextureRegion currentFrame;
public void render() {
// stateTime was initialized to 0.0f
stateTime += Gdx.graphics.getDeltaTime();
// stateTime is used to calculate the next frame
// frameDuration!
// true = it's a looping anim
// false = it's not a looping anim
currentFrame = walkAnimation.getKeyFrame(stateTime, true);
spriteBatch.begin();
spriteBatch.draw(currentFrame, 150, 150);
spriteBatch.end();
}
TIPS	
  
Crea8ng	
  Game	
  Objects	
  
•  For	
  each	
  Game	
  Object,	
  create	
  own	
  class	
  
•  The	
  class	
  may	
  have	
  
– Inheritance	
  relaIonship	
  with	
  Sprite	
  /	
  Texture	
  (is	
  –	
  
a)	
  or	
  
– ComposiIon	
  relaIonship	
  with	
  Sprite	
  /	
  Texture	
  
(has	
  –	
  a)	
  
•  Add	
  aaributes	
  like	
  
– speedX,	
  speedY,	
  sounds,	
  anima8ons	
  
•  See	
  example	
  from	
  course	
  homepage!	
  

More Related Content

PDF
libGDX: User Input
PDF
Implementing a Simple Game using libGDX
PDF
Creating Games for Asha - platform
PDF
libGDX: Simple Frame Animation
PDF
libGDX: Scene2D
PDF
libGDX: Tiled Maps
PDF
Box2D and libGDX
PDF
A split screen-viable UI event system - Unite Copenhagen 2019
libGDX: User Input
Implementing a Simple Game using libGDX
Creating Games for Asha - platform
libGDX: Simple Frame Animation
libGDX: Scene2D
libGDX: Tiled Maps
Box2D and libGDX
A split screen-viable UI event system - Unite Copenhagen 2019

What's hot (20)

PDF
Converting Scene Data to DOTS – Unite Copenhagen 2019
PPTX
Building a turn-based game prototype using ECS - Unite Copenhagen 2019
PDF
7java Events
PDF
Custom SRP and graphics workflows - Unite Copenhagen 2019
PPTX
Cross-scene references: A shock to the system - Unite Copenhagen 2019
PDF
Unity遊戲程式設計 - 2D Platformer遊戲
PDF
Unity遊戲程式設計(15) 實作Space shooter遊戲
PDF
Unity 13 space shooter game
KEY
Introduction to Game Programming Tutorial
PPTX
Unity asset workflows for Film and Animation pipelines - Unite Copenhagen 2019
PPTX
Soc research
PDF
HoloLens Programming Tutorial: AirTap & Spatial Mapping
PPTX
Java ME - 05 - Game API
KEY
Intro to Game Programming
PDF
Introduction to Game Programming: Using C# and Unity 3D - Chapter 6 (Preview)
PDF
Introduction to Game Programming: Using C# and Unity 3D - Chapter 3 (Preview)
PPTX
Scene Graphs & Component Based Game Engines
PDF
Introduction to Game Programming: Using C# and Unity 3D - Chapter 7 (Preview)
PDF
Cocos2dx 7.1-7.2
PPT
Input and Interaction
Converting Scene Data to DOTS – Unite Copenhagen 2019
Building a turn-based game prototype using ECS - Unite Copenhagen 2019
7java Events
Custom SRP and graphics workflows - Unite Copenhagen 2019
Cross-scene references: A shock to the system - Unite Copenhagen 2019
Unity遊戲程式設計 - 2D Platformer遊戲
Unity遊戲程式設計(15) 實作Space shooter遊戲
Unity 13 space shooter game
Introduction to Game Programming Tutorial
Unity asset workflows for Film and Animation pipelines - Unite Copenhagen 2019
Soc research
HoloLens Programming Tutorial: AirTap & Spatial Mapping
Java ME - 05 - Game API
Intro to Game Programming
Introduction to Game Programming: Using C# and Unity 3D - Chapter 6 (Preview)
Introduction to Game Programming: Using C# and Unity 3D - Chapter 3 (Preview)
Scene Graphs & Component Based Game Engines
Introduction to Game Programming: Using C# and Unity 3D - Chapter 7 (Preview)
Cocos2dx 7.1-7.2
Input and Interaction
Ad

Similar to libGDX: User Input and Frame by Frame Animation (20)

PDF
Game Development using SDL and the PDK
PPTX
Game Development for Nokia Asha Devices with Java ME #2
PPTX
Game development with_lib_gdx
PDF
libGDX: Simple Frame Animation
PPTX
Scratching the Surface with JavaFX
PDF
Developing games for Series 40 full-touch UI
PPT
MIDP: Game API
PDF
The Ring programming language version 1.10 book - Part 132 of 212
PPTX
Taking a Leap Forward With JavaFX
PPTX
Developing Rich Interfaces in JavaFX for Ultrabooks
DOC
Java applet handouts
PDF
Games 3 dl4-example
PDF
Creating physics game in 1 hour
PDF
Scratching the Surface with JavaFX
PDF
libGDX: Screens, Fonts and Preferences
PPTX
C game programming - SDL
PDF
Game development with Cocos2d-x Engine
PPTX
Advance ui development and design
PPT
Flash Lite & Touch: build an iPhone-like dynamic list
PPT
Advanced Game Development with the Mobile 3D Graphics API
Game Development using SDL and the PDK
Game Development for Nokia Asha Devices with Java ME #2
Game development with_lib_gdx
libGDX: Simple Frame Animation
Scratching the Surface with JavaFX
Developing games for Series 40 full-touch UI
MIDP: Game API
The Ring programming language version 1.10 book - Part 132 of 212
Taking a Leap Forward With JavaFX
Developing Rich Interfaces in JavaFX for Ultrabooks
Java applet handouts
Games 3 dl4-example
Creating physics game in 1 hour
Scratching the Surface with JavaFX
libGDX: Screens, Fonts and Preferences
C game programming - SDL
Game development with Cocos2d-x Engine
Advance ui development and design
Flash Lite & Touch: build an iPhone-like dynamic list
Advanced Game Development with the Mobile 3D Graphics API
Ad

More from Jussi Pohjolainen (20)

PDF
Moved to Speakerdeck
PDF
Java Web Services
PDF
Intro to Building Android Games using libGDX
PDF
Advanced JavaScript Development
PDF
Introduction to JavaScript
PDF
Introduction to AngularJS
PDF
Building Android games using LibGDX
PDF
Android Threading
PDF
Creating Asha Games: Game Pausing, Orientation, Sensors and Gestures
PDF
Intro to Asha UI
PDF
Intro to Java ME and Asha Platform
PDF
Intro to PhoneGap
PDF
Quick Intro to JQuery and JQuery Mobile
PDF
JavaScript Inheritance
PDF
JS OO and Closures
PDF
Short intro to ECMAScript
PDF
Building Web Services
PDF
Extensible Stylesheet Language
Moved to Speakerdeck
Java Web Services
Intro to Building Android Games using libGDX
Advanced JavaScript Development
Introduction to JavaScript
Introduction to AngularJS
Building Android games using LibGDX
Android Threading
Creating Asha Games: Game Pausing, Orientation, Sensors and Gestures
Intro to Asha UI
Intro to Java ME and Asha Platform
Intro to PhoneGap
Quick Intro to JQuery and JQuery Mobile
JavaScript Inheritance
JS OO and Closures
Short intro to ECMAScript
Building Web Services
Extensible Stylesheet Language

Recently uploaded (20)

PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Modernizing your data center with Dell and AMD
PPT
Teaching material agriculture food technology
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
Big Data Technologies - Introduction.pptx
PDF
KodekX | Application Modernization Development
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
cuic standard and advanced reporting.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Chapter 3 Spatial Domain Image Processing.pdf
Empathic Computing: Creating Shared Understanding
Understanding_Digital_Forensics_Presentation.pptx
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Spectral efficient network and resource selection model in 5G networks
Digital-Transformation-Roadmap-for-Companies.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
The AUB Centre for AI in Media Proposal.docx
Modernizing your data center with Dell and AMD
Teaching material agriculture food technology
Unlocking AI with Model Context Protocol (MCP)
MYSQL Presentation for SQL database connectivity
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Big Data Technologies - Introduction.pptx
KodekX | Application Modernization Development
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
cuic standard and advanced reporting.pdf

libGDX: User Input and Frame by Frame Animation

  • 1. libGDX:  User  Input  and  Frame  by   Frame  Anima8on   Jussi  Pohjolainen   Tampere  University  of  Applied  Sciences  
  • 3. Event  vs  Polling   •  Polling   –  Do  something  on  each  frame,  really  fast   •  Was  mouse  clicked?  Was  mouse  clicked?  Was  mouse   clicked?   –  Good  for  arcade  games   •  Event   –  Do  something  when  event  handles   •  No8fy  when  mouse  was  clicked   •  Mouse  /  touch  /  keyboard  can  be  received  either   in  1)  polling  or  2)  event  handling  
  • 4. Polling  Touch  /  Keyboard   •  For  most  arcade  games,  polling  is  good   •  Mul8touch  is  supported!   –  boolean first = Gdx.input.isTouched(0); –  boolean second = Gdx.input.isTouched(1); –  int firstX = Gdx.input.getX(); –  int firstY = Gdx.input.getY(); –  int secondX = Gdx.input.getX(1); –  int secondY = Gdx.input.getY(1); •  Keyboard   –  boolean isAPressed = Gdx.input.isKeyPressed(Keys.A);
  • 5. Polling:  InputProcessor •  An  InputProcessor  (Interface)  is  used  to   receive  input  events  from  the  keyboard  and   the  touch  screen   •  It  has  to  be  registered   – Input.setInputProcessor(InputProcessor); •  When  registered  the  methods  from   InputProcessor  interface  are  called.
  • 7. Using  InputProcessor public class InputDemo extends ApplicationAdapter implements InputProcessor { @Override public void create () { Gdx.input.setInputProcessor(this); } @Override public void render () { } @Override public boolean keyDown(int keycode) { return false; } @Override public boolean keyUp(int keycode) { return false; } ...  
  • 8. Using  InputAdapter  and  Inner  Class   public class InputDemo extends ApplicationAdapter { @Override public void create () { Gdx.input.setInputProcessor(new Listener()); } private class Listener extends InputAdapter { @Override public boolean touchDragged(int screenX, int screenY, int pointer) { // implementation here return true; } } }
  • 10. GestureDetector   •  TouchDown   –  User  touches  screen   •  LongPress   –  User  touches  screen  for  some  8me   •  Tap   –  User  touches  screen  and  liVs  the  finger  again   •  Pan   –  User  drags  a  finger  across  the  screen.  Useful  for  implemenIng  Camera  panning  in  2D   •  PanStop   –  Called  when  no  longer  panning   •  Fling   –  User  dragged  a  finger  across  the  screen,  then  liVed  up.  Useful  for  swipe  gestures   •  Zoom   –  User  places  two  fingers  on  the  screen  and  moves  them  together/apart.  Useful  for  Camera   zooming   •  Pinch   –  Zooming  +  rota8on  
  • 11. Star8ng  to  Listen  to  Gestures   •  Really  easy   –  Gdx.input.setInputProcessor(new GestureDetector(GestureListener)); •  GestureListener  is  an  interface   •  GestureAdapter  also  available    
  • 12. GestureListener   public class MyGestureListener implements GestureListener { @Override public boolean touchDown(float x, float y, int pointer, int button) {} @Override public boolean tap(float x, float y, int count, int button) {} @Override public boolean longPress(float x, float y) {} @Override public boolean fling(float velocityX, float velocityY, int button) {} @Override public boolean pan(float x, float y, float deltaX, float deltaY) {} @Override public boolean panStop(float x, float y, int pointer, int button) {} @Override public boolean zoom (float originalDistance, float currentDistance){} @Override public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer){} }
  • 14. Accelerometer   •  An  accelerometer   measures  the   accelera8on  of  a  device   on  three  axes   •  From  this  accelera8on   one  can  derive  the  8lt  or   orienta8on  of  the  device.   –  Phones:  portrait  default   –  Tablet:  landscape  default   •  LibGDX  shows   accelerometer  readings   always  as  in  the  image  
  • 15. (0,0)   Accelerometer  x   Accelerometer  y   y  increments   x  increments  
  • 16. Accelerometer  Readings   •  Accelerometer  readings  can  be  accessed     –  float accelX = Gdx.input.getAccelerometerX(); –  float accelY = Gdx.input.getAccelerometerY(); –  float accelZ = Gdx.input.getAccelerometerZ(); •  When  moving  and  if  in  landscape  mode  in   android,  no8ce  X  vs  Y!   –  speedX += Gdx.input.getAccelerometerY();
  • 18. User  input   •  Desktop   – Swing  dialog   •  Android   – Android  dialog   •  Use  TextInputListener
  • 19. public class InputDemo extends ApplicationAdapter { @Override public void create () { MyTextInputListener listener = new MyTextInputListener(); Gdx.input.setInputProcessor(newGestureDetector(newGestureDetector.GestureAdapter(){ @Override public boolean tap(float x, float y, int count, int button) { Gdx.input.getTextInput(new MyTextInputListener(), "title", "test", "hint"); return true; } })); } private class MyTextInputListener implements Input.TextInputListener { @Override public void input (String text) { Gdx.app.log("InputDemo", text); } @Override public void canceled () { Gdx.app.log("InputDemo", "canceled"); } } }
  • 21. Game  Object   •  Game  object  may  hold  informa8on  about   –  Texture   –  Geometry   •  width   •  height   •  x,  y   –  Color   •  You  could  create  a  class  for  your  game  object   that  capsulates  all  of  these   •  But  even  beaer,  libGDX  has  already  this  class,  it's   called  Sprite
  • 22. Sprite  -­‐  class   •  Holds  geometry,  color  and  texture   informa8on   •  Has  a  posi8on  and  a  size  given  as  width  and   height   •  Sprite  is  always  rectangular   •  Sprite  has  also  origin  for  rota8on  and  scaling   – origin  is  in  boaom  leV  
  • 24. public class SpriteDemo extends ApplicationAdapter { private Sprite player; private Texture alienTexture; private OrthographicCamera camera; private SpriteBatch batch; public final static float WIDTH = 1280; public final static float HEIGHT = 720; @Override public void create () { player = new Sprite( alienTexture = new Texture("alien-displeased-icon.png") ); camera = new OrthographicCamera(); camera.setToOrtho(false, WIDTH, HEIGHT); batch = new SpriteBatch(); } @Override public void render() { batch.setProjectionMatrix(camera.combined); Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); player.draw(batch); batch.end(); } @Override public void dispose() { alienTexture.dispose(); } }  
  • 26. Anima8on   •  Use  Anima8on  class   – Animation walkAnimation = new Animation(frameDuration, frames); •  Frame  dura8on?  Time  between  frames  in   seconds:  1  /  60  fps   •  Frames?   – TextureRegion  array   •  TextureRegion?   – Part  of  texture
  • 28. Split  .png  into  TextureRegions   walkSheet = new Texture(Gdx.files.internal(”image.png")); // Method for splitting one texture to TextureRegions TextureRegion[][] tmp = TextureRegion.split( walkSheet, walkSheet.getWidth() / FRAME_COLS, walkSheet.getHeight() / FRAME_ROWS );
  • 29. 2D  array  -­‐>  1D   private TextureRegion[] transformTo1D(TextureRegion[][] tmp) { TextureRegion [] walkFrames = new TextureRegion[FRAME_COLS * FRAME_ROWS]; int index = 0; for (int i = 0; i < FRAME_ROWS; i++) { for (int j = 0; j < FRAME_COLS; j++) { walkFrames[index++] = tmp[i][j]; } } return walkFrames; }
  • 30. Split  .png  into  TextureRegions   walkSheet = new Texture(Gdx.files.internal(”image.png")); // Method for splitting one texture to TextureRegions TextureRegion[][] tmp = TextureRegion.split( walkSheet, walkSheet.getWidth() / FRAME_COLS, walkSheet.getHeight() / FRAME_ROWS ); TextureRegion [] frames = transformTo1D(tmp); Animation walkAnimation = new Animation(1 / 60f, frames);
  • 31. Rendering   float stateTime = 1.0f; TextureRegion currentFrame; public void render() { // stateTime was initialized to 0.0f stateTime += Gdx.graphics.getDeltaTime(); // stateTime is used to calculate the next frame // frameDuration! // true = it's a looping anim // false = it's not a looping anim currentFrame = walkAnimation.getKeyFrame(stateTime, true); spriteBatch.begin(); spriteBatch.draw(currentFrame, 150, 150); spriteBatch.end(); }
  • 33. Crea8ng  Game  Objects   •  For  each  Game  Object,  create  own  class   •  The  class  may  have   – Inheritance  relaIonship  with  Sprite  /  Texture  (is  –   a)  or   – ComposiIon  relaIonship  with  Sprite  /  Texture   (has  –  a)   •  Add  aaributes  like   – speedX,  speedY,  sounds,  anima8ons   •  See  example  from  course  homepage!