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
) {
}
}
}
}