Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.44 KB | None | 0 0
  1. package com.android.pingpong;
  2.  
  3. import com.android.pingpong.objects.*;
  4. import com.android.pingpong.R;
  5.  
  6. import android.content.Context;
  7. import android.content.SharedPreferences;
  8. import android.content.res.Resources;
  9. import android.graphics.Bitmap;
  10. import android.graphics.BitmapFactory;
  11. import android.graphics.Canvas;
  12. import android.graphics.Color;
  13. import android.graphics.Paint;
  14. import android.graphics.Rect;
  15. import android.graphics.Typeface;
  16. import android.graphics.Paint.Style;
  17. import android.media.MediaPlayer;
  18. import android.media.MediaPlayer.OnCompletionListener;
  19. import android.preference.PreferenceManager;
  20. import android.util.Log;
  21. import android.view.KeyEvent;
  22. import android.view.MotionEvent;
  23. import android.view.SurfaceHolder;
  24. import android.view.View;
  25. import android.view.View.OnTouchListener;
  26. import android.widget.ImageView;
  27.  
  28. public class GameManager extends Thread
  29. {
  30. private interface DrawHelper
  31. {
  32. void draw(Canvas canvas);
  33. }
  34.  
  35. private static final int LOSE_PAUSE = 2000, FIELD_WIDTH = 450,
  36. FIELD_HEIGHT = 375;
  37. private SurfaceHolder mSurfaceHolder;
  38. private boolean mRunning, mInitialized, IsCollisionMusicPlaying;
  39. private Paint mPaint, mScorePaint, mPausePaint;
  40. private Rect mField;
  41. private Ball mBall;
  42. private static Bat mUs, mThem;
  43. private Bitmap mBackground;
  44. private static int mMaxScore = 3;
  45. private static ImageView pad;
  46. private MediaPlayer collision;
  47.  
  48. public static void setMaxScore(int value)
  49. {
  50. mMaxScore = value;
  51. }
  52.  
  53. private boolean mPaused;
  54.  
  55. private DrawHelper mDrawScreen, mDrawGameover, mDrawPause;
  56.  
  57. public GameManager(SurfaceHolder surfaceHolder, Context context)
  58. {
  59. mSurfaceHolder = surfaceHolder;
  60. Resources res = context.getResources();
  61. mRunning = false;
  62. mInitialized = false;
  63. IsCollisionMusicPlaying = false;
  64. mPaint = new Paint();
  65. mPaint.setColor(Color.BLUE);
  66. mPaint.setStrokeWidth(2);
  67. mPaint.setStyle(Style.STROKE);
  68.  
  69. mScorePaint = new Paint();
  70. mScorePaint.setTextSize(20);
  71. mScorePaint.setStrokeWidth(1);
  72. mScorePaint.setStyle(Style.FILL);
  73. mScorePaint.setTextAlign(Paint.Align.CENTER);
  74. mScorePaint.setTypeface(Typeface.createFromAsset(context.getAssets(),
  75. "fonts/Mini.ttf"));
  76.  
  77. mPausePaint = new Paint();
  78. mPausePaint.setStyle(Style.FILL);
  79. mPausePaint.setColor(Color.argb(100, 50, 50, 80));
  80.  
  81. mField = new Rect();
  82. mBall = new Ball(res.getDrawable(R.drawable.ball));
  83. mUs = new Bat(res.getDrawable(R.drawable.us));
  84. mThem = new Bat(res.getDrawable(R.drawable.them));
  85.  
  86. SharedPreferences settings = PreferenceManager
  87. .getDefaultSharedPreferences(context);
  88.  
  89. String difficulty = settings.getString(
  90. res.getString(R.string.pref_difficulty),
  91. res.getString(R.string.difficulty_normal));
  92. setDifficulty(difficulty);
  93.  
  94. int maxScore = Integer.parseInt(settings.getString(
  95. res.getString(R.string.pref_max_score), "10"));
  96. setMaxScore(maxScore);
  97.  
  98. mDrawScreen = new DrawHelper()
  99. {
  100. public void draw(Canvas canvas)
  101. {
  102. refreshCanvas(canvas);
  103. }
  104. };
  105.  
  106. mDrawPause = new DrawHelper()
  107. {
  108. public void draw(Canvas canvas)
  109. {
  110. canvas.drawRect(mField, mPausePaint);
  111. }
  112. };
  113.  
  114. mDrawGameover = new DrawHelper()
  115. {
  116. public void draw(Canvas canvas)
  117. {
  118. refreshCanvas(canvas);
  119.  
  120. String message = "";
  121. if (mUs.getScore() > mThem.getScore())
  122. {
  123. mScorePaint.setColor(Color.GREEN);
  124. message = "You won";
  125. }
  126. else
  127. {
  128. mScorePaint.setColor(Color.RED);
  129. message = "You lost";
  130. }
  131. mScorePaint.setTextSize(30);
  132. canvas.drawText(message, mField.centerX(), mField.centerY(),
  133. mScorePaint);
  134. }
  135. };
  136. }
  137.  
  138. private void setDifficulty(String difficulty)
  139. {
  140. if (difficulty.equals("Easy"))
  141. {
  142. mBall.setSpeed(3);
  143. mUs.setSpeed(6);
  144. mThem.setSpeed(5);
  145.  
  146. }
  147. else if (difficulty.equals("Normal"))
  148. {
  149. mBall.setSpeed(5);
  150. mUs.setSpeed(4);
  151. mThem.setSpeed(5);
  152. }
  153. else if (difficulty.equals("Hard"))
  154. {
  155. mBall.setSpeed(6);
  156. mUs.setSpeed(3);
  157. mThem.setSpeed(6);
  158. }
  159. }
  160.  
  161. private void draw(DrawHelper helper)
  162. {
  163. Canvas canvas = null;
  164. try
  165. {
  166. canvas = mSurfaceHolder.lockCanvas();
  167. synchronized (mSurfaceHolder)
  168. {
  169. if (mInitialized)
  170. {
  171. helper.draw(canvas);
  172. }
  173. }
  174. }
  175. catch (Exception e)
  176. {
  177. }
  178. finally
  179. {
  180. if (canvas != null)
  181. mSurfaceHolder.unlockCanvasAndPost(canvas);
  182. }
  183. }
  184.  
  185. public void setRunning(boolean running)
  186. {
  187. mRunning = running;
  188. }
  189.  
  190. @Override
  191. public void run()
  192. {
  193. while (mRunning)
  194. {
  195. if (mPaused)
  196. continue;
  197.  
  198. if (mInitialized)
  199. {
  200. updateObjects();
  201. draw(mDrawScreen);
  202. try
  203. {
  204. sleep(20);
  205. }
  206. catch (InterruptedException e)
  207. {
  208. }
  209. ;
  210. }
  211. }
  212. draw(mDrawGameover);
  213. }
  214.  
  215. private void refreshCanvas(Canvas canvas)
  216. {
  217. canvas.drawBitmap(mBackground, 0, 0, null);
  218. canvas.drawRect(mField, mPaint);
  219.  
  220. mBall.draw(canvas);
  221. mUs.draw(canvas);
  222. mThem.draw(canvas);
  223.  
  224. mScorePaint.setColor(Color.RED);
  225. canvas.drawText(String.valueOf(mThem.getScore()), mField.centerX(),
  226. mField.top - 10, mScorePaint);
  227. mScorePaint.setColor(Color.GREEN);
  228. canvas.drawText(String.valueOf(mUs.getScore()), mField.centerX(),
  229. mField.bottom + 25, mScorePaint);
  230. }
  231.  
  232. private void updateObjects()
  233. {
  234. mBall.update();
  235. mUs.update();
  236. moveAI();
  237.  
  238. placeInBounds(mUs);
  239. placeInBounds(mThem);
  240.  
  241. if (mBall.getLeft() <= mField.left)
  242. {
  243. mBall.setLeft(mField.left + Math.abs(mField.left - mBall.getLeft()));
  244. mBall.reflectVertical();
  245. }
  246. else if (mBall.getRight() >= mField.right)
  247. {
  248. mBall.setRight(mField.right
  249. - Math.abs(mField.right - mBall.getRight()));
  250. mBall.reflectVertical();
  251. }
  252.  
  253. if (GameObject.intersects(mBall, mUs))
  254. {
  255. mBall.setBottom(mUs.getBottom()
  256. - Math.abs(mUs.getBottom() - mBall.getBottom()));
  257. mBall.reflectHorizontal();
  258. if (!IsCollisionMusicPlaying)
  259. {
  260. IsCollisionMusicPlaying = true;
  261. collision = MediaPlayer.create(pad.getContext(),
  262. R.raw.collision);
  263. collision.setOnCompletionListener(new OnCompletionListener()
  264. {
  265.  
  266. @Override
  267. public void onCompletion(MediaPlayer mp)
  268. {
  269. IsCollisionMusicPlaying = false;
  270. }
  271.  
  272. });
  273.  
  274. collision.start();
  275. }
  276. }
  277. else if (GameObject.intersects(mBall, mThem))
  278. {
  279. mBall.setTop(mThem.getTop()
  280. + Math.abs(mThem.getTop() - mBall.getTop()));
  281. mBall.reflectHorizontal();
  282.  
  283. if (!IsCollisionMusicPlaying)
  284. {
  285. IsCollisionMusicPlaying = true;
  286. collision = MediaPlayer.create(pad.getContext(),
  287. R.raw.collision);
  288. collision.setOnCompletionListener(new OnCompletionListener()
  289. {
  290.  
  291. @Override
  292. public void onCompletion(MediaPlayer mp)
  293. {
  294. IsCollisionMusicPlaying = false;
  295. }
  296.  
  297. });
  298.  
  299. collision.start();
  300. }
  301. }
  302.  
  303. if (mBall.getTop() <= mField.top)
  304. {
  305. mUs.incScore();
  306. reset();
  307. }
  308.  
  309. if (mBall.getBottom() >= mField.bottom)
  310. {
  311. mThem.incScore();
  312. reset();
  313. }
  314.  
  315. if (mUs.getScore() == mMaxScore || mThem.getScore() == mMaxScore)
  316. this.mRunning = false;
  317. }
  318.  
  319. private void moveAI()
  320. {
  321. if (mThem.getLeft() > mBall.getRight())
  322. mThem.setDirection(GameObject.DIR_LEFT);
  323. else if (mThem.getRight() < mBall.getLeft())
  324. mThem.setDirection(GameObject.DIR_RIGHT);
  325. else
  326. mThem.setDirection(GameObject.DIR_NONE);
  327. mThem.update();
  328. }
  329.  
  330. public void initPositions(int screenHeight, int screenWidth)
  331. {
  332. mInitialized = false;
  333.  
  334. int left = (screenWidth - FIELD_WIDTH) / 2, top = (screenHeight - FIELD_HEIGHT) / 2;
  335.  
  336. mField.set(left, top, left + FIELD_WIDTH, top + FIELD_HEIGHT);
  337.  
  338. mBackground = Bitmap.createBitmap(screenWidth, screenHeight,
  339. Bitmap.Config.RGB_565);
  340.  
  341. mBall.setCenterX(mField.centerX());
  342. mBall.setCenterY(mField.centerY());
  343.  
  344. mUs.setCenterX(mField.centerX());
  345. mUs.setBottom(mField.bottom);
  346.  
  347. mThem.setCenterX(mField.centerX());
  348. mThem.setTop(mField.top);
  349.  
  350. mInitialized = true;
  351. }
  352.  
  353. public boolean doKeyDown(int keyCode)
  354. {
  355. switch (keyCode)
  356. {
  357. case KeyEvent.KEYCODE_DPAD_LEFT:
  358. case KeyEvent.KEYCODE_A:
  359. mUs.setDirection(GameObject.DIR_LEFT);
  360. return true;
  361. case KeyEvent.KEYCODE_DPAD_RIGHT:
  362. case KeyEvent.KEYCODE_D:
  363. mUs.setDirection(GameObject.DIR_RIGHT);
  364. return true;
  365. case KeyEvent.KEYCODE_DPAD_CENTER:
  366. mPaused = !mPaused;
  367.  
  368. if (mPaused)
  369. draw(mDrawPause);
  370. return true;
  371. default:
  372. return false;
  373. }
  374. }
  375.  
  376. public boolean doKeyUp(int keyCode)
  377. {
  378. if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT
  379. || keyCode == KeyEvent.KEYCODE_A
  380. || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT
  381. || keyCode == KeyEvent.KEYCODE_D)
  382. {
  383. mUs.setDirection(GameObject.DIR_NONE);
  384. return true;
  385. }
  386. return false;
  387. }
  388.  
  389. private void placeInBounds(Bat r)
  390. {
  391. if (r.getLeft() < mField.left)
  392. r.setLeft(mField.left);
  393. else if (r.getRight() > mField.right)
  394. r.setRight(mField.right);
  395. }
  396.  
  397. private void reset()
  398. {
  399. mBall.setCenterX(mField.centerX());
  400. mBall.setCenterY(mField.centerY());
  401. mBall.resetAngle();
  402.  
  403. mUs.setCenterX(mField.centerX());
  404. mThem.setCenterX(mField.centerX());
  405.  
  406. try
  407. {
  408. sleep(LOSE_PAUSE);
  409. }
  410. catch (InterruptedException iex)
  411. {
  412. }
  413. }
  414.  
  415. public static void SetTouch()
  416. {
  417. pad = PingPong_Activity.pad;
  418. pad.setOnTouchListener(new OnTouchListener()
  419. {
  420.  
  421. @Override
  422. public boolean onTouch(View v, MotionEvent event)
  423. {
  424. if (event.getAction() == MotionEvent.ACTION_MOVE
  425. || event.getAction() == MotionEvent.ACTION_DOWN)
  426. {
  427. if (event.getX() < pad.getWidth() / 2)
  428. {
  429. Bitmap bImage = Bitmap.createScaledBitmap(BitmapFactory
  430. .decodeResource(pad.getResources(),
  431. R.drawable.border_left),
  432. pad.getWidth(), pad.getHeight(), false);
  433. pad.setImageBitmap(bImage);
  434. mUs.setDirection(GameObject.DIR_LEFT);
  435. }
  436. else
  437. {
  438. Bitmap bImage = Bitmap.createScaledBitmap(BitmapFactory
  439. .decodeResource(pad.getResources(),
  440. R.drawable.border_right), pad
  441. .getWidth(), pad.getHeight(), false);
  442. pad.setImageBitmap(bImage);
  443. mUs.setDirection(GameObject.DIR_RIGHT);
  444. }
  445. }
  446. else
  447. {
  448. Bitmap bImage = Bitmap.createScaledBitmap(BitmapFactory
  449. .decodeResource(pad.getResources(),
  450. R.drawable.border), pad.getWidth(), pad
  451. .getHeight(), false);
  452. pad.setImageBitmap(bImage);
  453. mUs.setDirection(GameObject.DIR_NONE);
  454. v.performClick();
  455. }
  456. return true;
  457. }
  458. });
  459. }
  460. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement