Subversion Repositories AndroidProjects

Rev

Rev 6 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.pingK;

import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;

public class GameView extends SurfaceView implements SurfaceHolder.Callback  {

        long mLastUpdate = 0;
        long mSleepTime = 0;
       
        GameMain mGameMain;
       
        SurfaceHolder mSurfaceHolder;
        Context mContext;
       
        private PaintThread mThread;
       
       
        class TouchPoint {
                public boolean isActive = false;
                public float X = 0.0f;
                public float Y = 0.0f;

                public TouchPoint(Context context) {
               
                }
        }
       
        public static int MAX_POINTERS = 5;
        public TouchPoint touchPoints[] = new TouchPoint[MAX_POINTERS];
       
        public GameView(Context contextS, AttributeSet attrs, int defStyle) {
                super(contextS, attrs, defStyle);
                mContext = contextS;
                initView();
        }
       
        public GameView(Context contextS, AttributeSet attrs) {
                super(contextS, attrs);
                mContext = contextS;
                initView();
        }
       
        void initView() {
                SurfaceHolder holder = getHolder();
                holder.addCallback(this);
               
                for (int i = 0; i < MAX_POINTERS; i++)  {
                        touchPoints[i] = new TouchPoint(mContext);
                }
               
                Display display = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
                int w = display.getWidth();
                int h = display.getHeight();
               
                // init game engine
                mGameMain = new GameMain();
                mGameMain.init(mContext, getResources(), w, h);
               
                mThread = new PaintThread(holder, mContext, new Handler(), mGameMain);
                setFocusableInTouchMode(true);         
        }
       
    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        int pointerCount = event.getPointerCount();
        if (pointerCount > MAX_POINTERS)
                pointerCount = MAX_POINTERS;
        if (event.getAction() == MotionEvent.ACTION_UP)
        {
                for (int i = 0; i < MAX_POINTERS; i++)
                        touchPoints[i].isActive = false;
                return true;
        }
        for (int i = 0; i < MAX_POINTERS; i++)
        {
                if (i < pointerCount)
                {
                        touchPoints[i].isActive = true;
                        touchPoints[i].X = event.getX(i);
                        touchPoints[i].Y = event.getY(i);
                }
                else
                {
                        touchPoints[i].isActive = false;                                       
                }
        }
       
        mGameMain.handleInput(touchPoints);
       
                return true;
    }
   
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU) {
                mGameMain.onPressMenu();
                return true;
        }
        return false;          
    }
   
    public void onPause() {
        mGameMain.pauseGame(true);
    }
       
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                mGameMain.setDimensions(w, h);         
        }
       
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
                if (mThread.state == PaintThread.PAUSED) {
                        mThread = new PaintThread(getHolder(), mContext, new Handler(), mGameMain);
                        mThread.start();
                } else {
                        mThread.start();
                }
        }
       
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                mThread.state = PaintThread.PAUSED;
                while (retry) {
                        try {
                                mThread.join();
                                retry = false;
                        } catch (InterruptedException e) {
                               
                        }
                }
        }
       
}