Wednesday, June 10, 2009

onKeyEvent Object Moving in Android Graphics

on Key Event Object Moving example on android

package com.dci.object;

import com.dci.object.DemoGameView.GameThread;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;

public class DemoObjectMove extends Activity
{
private static final int MENU_PAUSE = Menu.FIRST;

private static final int MENU_RESUME = Menu.FIRST + 1;

private static final int MENU_START = Menu.FIRST + 2;

private static final int MENU_STOP = Menu.FIRST + 3;

private GameThread mGameThread;

private DemoGameView mGameView;


@Override
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);

menu.add(0, MENU_START, 0, R.string.menu_start);
menu.add(0, MENU_STOP, 0, R.string.menu_stop);
menu.add(0, MENU_PAUSE, 0, R.string.menu_pause);
menu.add(0, MENU_RESUME, 0, R.string.menu_resume);

return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case MENU_START:
mGameThread.doStart();
return true;
case MENU_STOP:
mGameThread.setState(GameThread.STATE_LOSE);
return true;
case MENU_PAUSE:
mGameThread.pause();
return true;
case MENU_RESUME:
mGameThread.unpause();
return true;
}

return false;
}

/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);


requestWindowFeature(Window.FEATURE_NO_TITLE);


setContentView(R.layout.main);

mGameView =(DemoGameView) findViewById(R.id.game);
mGameThread = mGameView.getThread();

mGameThread.setState(GameThread.STATE_READY);
}

@Override
protected void onPause()
{
super.onPause();

mGameView.getThread().pause();

}
}


View For the Above activity


package com.dci.object;

import com.dci.object.R;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class DemoGameView extends SurfaceView implements SurfaceHolder.Callback
{

class GameThread extends Thread
{
// States Used In Our Demo Game Object

public static final int STATE_LOSE = 1;
public static final int STATE_PAUSE = 2;
public static final int STATE_READY = 3;
public static final int STATE_RUNNING = 4;
public static final int STATE_WIN = 5;

private int mMode;
private boolean mRun = false;

// Co ordinates

private float x;
private float y;

// To control the Speed the Variable is craeted
private static final int SPEED = 100;

//Movements of the Object Variables
private boolean dRight;
private boolean dLeft;
private boolean dUp;
private boolean dDown;

// Canvas Specs.
private int mCanvasWidth;
private int mCanvasHeight;

private long mLastTime;

private Bitmap mDciObject;

private SurfaceHolder mSurfaceHolder;

//Constructor
public GameThread(SurfaceHolder surfaceHolder, Context context,
Handler handler)
{
mSurfaceHolder = surfaceHolder;
mContext = context;

x = 0;
y = 0;

mDciObject = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.snowflake);

}
//Start The Game
public void doStart()
{
synchronized (mSurfaceHolder)
{
// Initialize game here!

x = 0;
y = 50;

mLastTime = System.currentTimeMillis() + 100;
setState(STATE_RUNNING);
}
}
public void pause()
{
synchronized (mSurfaceHolder)
{
if (mMode == STATE_RUNNING)
setState(STATE_PAUSE);
}
}

@Override
public void run()
{
while (mRun)
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder)
{
if (mMode == STATE_RUNNING)
updateGame();
doDraw(c);
}
}
finally
{
if (c != null)
{
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
public void setRunning(boolean b)
{
mRun = b;
}
public void setState(int mode)
{
synchronized (mSurfaceHolder)
{
setState(mode, null);
}
}
public void setState(int mode, CharSequence message)
{
synchronized (mSurfaceHolder)
{
mMode = mode;
}
}
public void setSurfaceSize(int width, int height)
{

synchronized (mSurfaceHolder)
{
mCanvasWidth = width;
mCanvasHeight = height;
}
}
public void unpause()
{
// Move the real time clock up to now
synchronized (mSurfaceHolder)
{
mLastTime = System.currentTimeMillis() + 100;
}
setState(STATE_RUNNING);
}

boolean doKeyDown(int keyCode, KeyEvent msg)
{
boolean handled = false;
synchronized (mSurfaceHolder)
{
if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
{
dRight = true;
handled = true;
}
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
{
dLeft = true;
handled = true;
}
if (keyCode == KeyEvent.KEYCODE_DPAD_UP)
{
dUp = true;
handled = true;
}
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
{
dDown = true;
handled = true;
}
return handled;
}
}
boolean doKeyUp(int keyCode, KeyEvent msg)
{
boolean handled = false;
synchronized (mSurfaceHolder)
{
if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
{
dRight = false;
handled = true;
}
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
{
dLeft = false;
handled = true;
}
if (keyCode == KeyEvent.KEYCODE_DPAD_UP)
{
dUp = false;
handled = true;
}
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
{
dDown = false;
handled = true;
}
return handled;
}
}
private void doDraw(Canvas canvas)
{
// empty canvas
canvas.drawARGB(255,0,0,40);

canvas.drawBitmap(mDciObject, x, y, new Paint());
}

private void updateGame()
{

long now = System.currentTimeMillis();

if (mLastTime > now)
return;
double elapsed = (now - mLastTime) / 1000.0;
mLastTime = now;


if (dUp)
y -= elapsed * SPEED;
if (dDown)
y += elapsed * SPEED;
if (y < 0)
y = 0;
else if (y >= mCanvasHeight - mDciObject.getHeight())
y = mCanvasHeight - mDciObject.getHeight();
if (dLeft)
x -= elapsed * SPEED;
if (dRight)
x += elapsed * SPEED;
if (x < 0)
x = 0;
else if (x >= mCanvasWidth - mDciObject.getWidth())
x = mCanvasWidth - mDciObject.getWidth();
}
}
private Context mContext;

private GameThread thread;

public DemoGameView(Context context,AttributeSet atts)
{
super(context,atts);

SurfaceHolder holder = getHolder();
holder.addCallback(this);

thread = new GameThread(holder, context, new Handler()
{
@Override
public void handleMessage(Message m)
{
// Use for pushing back messages.
}
});

setFocusable(true);

}
public GameThread getThread()
{
return thread;
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent msg)
{
return thread.doKeyDown(keyCode, msg);
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent msg)
{
return thread.doKeyUp(keyCode, msg);
}

@Override
public void onWindowFocusChanged(boolean hasWindowFocus)
{
if (!hasWindowFocus)
thread.pause();
}


public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
thread.setSurfaceSize(width, height);
}


public void surfaceCreated(SurfaceHolder holder)
{

thread.setRunning(true);
thread.start();
}
public void surfaceDestroyed(SurfaceHolder holder)
{

boolean retry = true;
thread.setRunning(false);
while (retry)
{
try
{
thread.join();
retry = false;
}
catch (InterruptedException e)
{
}
}
}

}

No comments: