Android Game Development – Part 2 Player & Input controls

Input Controls

In this section we will modify the GameEngineView to handle input controls. We do this by calling setFocusable(true); on the constructor of the view. All that is left is to override the onKeyDown and onKeyUp events.

	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode == android.view.KeyEvent.KEYCODE_DPAD_LEFT )
			{
				st.setCurrentAnimation("walk_left", true);
				st.AnimateTo(new Point( st.getXpos()-40, st.getYpos()));
			}
		if(keyCode == android.view.KeyEvent.KEYCODE_DPAD_RIGHT)
			{
				st.setCurrentAnimation("walk_right", true);
				st.AnimateTo(new Point( st.getXpos()+40, st.getYpos()));
			}
		
		return super.onKeyDown(keyCode, event);
	}
	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {
		if(keyCode == android.view.KeyEvent.KEYCODE_DPAD_LEFT )
			st.setCurrentAnimation("idle_left", false);
		if(keyCode == android.view.KeyEvent.KEYCODE_DPAD_RIGHT)
			st.setCurrentAnimation("idle_right", false);
			

		st.MoveTo(new Point( st.getXpos(), st.getYpos()));
		return super.onKeyUp(keyCode, event);
	}

In this snippet the “st” object is an Instance of the player object which will be discussed shortly. Note that on key down animate player, on key up we return him to the idle state.

Player

The player class houses the characteristics that a player consists of. We will use the Sprite Tile as the base object, this will take care of the visual part of our player. We will add function and attributes for animation

package com.warriormill.warriorengine;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Point;

import com.warriormill.warriorengine.drawable.SpriteTile;

public class Player extends SpriteTile {

	public float lifebar=100.0f;
	private Point move_to = new Point(10,10);
	
	public Player(int BitmapResourceId, int XmlAnimationResourceId,
			Context context) {
		super(BitmapResourceId, XmlAnimationResourceId, context);
	}
	public void AnimateTo(Point pt)
	{
		move_to = pt;
	}
	public void MoveTo(Point pt)
	{
		move_to =pt;
		this.setXpos(pt.x);
		this.setYpos(pt.y);
	}
	
	@Override
	public void draw(Canvas canvas) {
		super.draw(canvas);
		
		updateLocation();
	}
	private void updateLocation()
	{
		if(move_to.y > this.getYpos())
			this.setYpos(getYpos()+1);
		else if(move_to.y < this.getYpos())
			this.setYpos(getYpos()-1);
		
		if(move_to.x > this.getXpos())
			this.setXpos(getXpos()+1);
		else if(move_to.x < this.getXpos())
			this.setXpos(getXpos()-1);
	}
}

Source Code

Preview

17 comments

  1. I went through both of ur tutorials and they are simply awesome…I am making a game engine for android and your tutorials really helped me in making the sprite animation part of the engine. Thanx once again… =D ^_^

  2. The link u posted in ur comment is not working. It’s nice to know that someone out there is making android game tuts. I’ve been searching them for ages.

  3. There one thing in the code. I did a little testing in the Code using System.currentTimeMillis() and I found that the average time between each iteration of the game loop was 16ms, which was to be expected since the Android device is not capable of doing extremely fast calculations:
    http://www.youtube.com/watch?v=U4Bk5rmIpic
    So I found that using 8ms sleep is abt optimal. Also the engine could be made better by making the position changes time dependent as explained in the video. Thats abt all the suggestions I can come up with.

  4. Hi, what awesome tutorials!

    Ive always wanted to make a game, and now maybe i can start 🙂 I just wanted to knoe, if i did make a game, and i sold it on the android market place.. would i have to pay you or would referencing your site be enough? :S

    thanks

    cha

  5. many thanks, very straightforward and intuitive! I’ve looked at so many examples that left me with more questions than answers – including the ones in the android sdk.

Leave a Reply

Your email address will not be published. Required fields are marked *