JetBoy游戏研究

Jet 喷气式(飞机)

1. 在AndroidManifest.xml文件中

// 设定menifest的package属性

package="com.example.android.jetboy"

// application的theme属性设定为没有标题栏

android:theme="@android:style/Theme.NoTitleBar"

// activity(.JetBoy)的屏幕方向设定为水平方向

android:screenOrientation="landscape"

2. 在JetBoy.onCreate方法中

// 获取Jet视图和Jet线程

// private JetBoyView mJetBoyView;

mJetBoyView = (JetBoyView)findViewById(R.id.JetBoyView);

// private JetBoyThread mJetBoyThread;
mJetBoyThread = mJetBoyView.getThread();

// 获取main布局中定义的其他视图

(略)

3. 在res/layout/main.xml文件中

// 使用FrameLayout布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

// 添加JetBoyView视图

   <com.example.android.jetboy.JetBoyView android:id="@+id/JetBoyView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

// 添加“帮助”文本视图 设定为不可见

   <TextView android:id="@+id/text" android:text="@string/helpText"
        style="@style/helpText" android:visibility="invisible"
        android:layout_width="300px" android:layout_height="300px"
        android:background="#7Fffffff" android:layout_gravity="center" />

// 添加“开始”按钮

    <Button android:id="@+id/Button01" android:text="@string/start"
        style="@style/ButtonText" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom" />

// 添加“重新开始”按钮 设定为不可见

    <Button android:id="@+id/Button02" android:text="@string/retry"
        style="@style/ButtonText" android:visibility="invisible"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom" />

// 添加“时间”文本视图 设定为不可见

    <TextView android:id="@+id/timer" android:text="@string/timer"
        style="@style/timerText" android:visibility="invisible"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|right" android:background="#000000" />

4. 在JetBoyView中

JetBoyView继承SurfaceView 实现SurfaceHolder.Callback

5. 在JetBoyView.GameEvent的构造方法中

// 记录下当前时间

// long eventTime;

eventTime = System.currentTimeMillis();

6. 在JetBoyView.KeyGameEvent中

KeyGameEvent继承GameEvent

// 定义变量keyCode, msg, up; 在构造方法中初始化

public int keyCode;
public KeyEvent msg;
public boolean up;

7. 在JetBoyView.JetGameEvent中

JetGameEvent继承GameEvent

// 定义变量player, segment, track, channel, controller, value; 在构造方法中初始化

public JetPlayer player;
public short segment;
public byte track;
public byte channel;
public byte controller;
public byte value;

8. 在JetBoyView.JetBoyView方法中

// 获取SurfaceHolder 添加Callback监听对象

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

// 创建JetBoyThread对象 传递SurfaceHolder对象, Context对象, Handler对象

thread = new JetBoyThread(holder, context, new Handler() {

// 设定Focusable属性为true

setFocusable(true);

9. 在(new)Handler对象的handleMessage(Message m)方法中

// 获取时间 显示在时间文本视图上

mTimerView.setText(m.getData().getString("text"));

// 如果m.getData().getString("STATE_LOSE")不为空

// “重试”按钮可见 “时间”标签不可见 “帮助”标签可见

// 如果mHitTotal大于等于50 提示win

10. 在JetBoyView的重写方法onWindowFocusChanged(boolean hasWindowFocus)

如果hasWindowFocus为true时 调用thread.pause();

11. 在JetBoyView中实现的3个抽象方法

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

surfaceCreated(SurfaceHolder holder)

surfaceDestroyed(SurfaceHolder holder)

12. 在JetBoyView.surfaceChanged方法中

thread.setSurfaceSize(width, height);

13. 在JetBoyView.surfaceCreated方法中

thread.setRunning(true);
thread.start();

14. JetBoyView.surfaceDestroyed方法中

boolean retry = true;
thread.setRunning(false);

每次retry为true时

thread.join();
retry = false;

15. 在JetThread中

// android.media.JetPlayer.OnJetEventListener

JetThread继承Thread 实现OnJetEventListener

// 定义5种状态

public static final int STATE_START = -1;
public static final int STATE_PLAY = 0;
public static final int STATE_LOSE = 1;
public static final int STATE_PAUSE = 2;
public static final int STATE_RUNNING = 3;

16. 在OnJetEventListener中声明4个抽象方法 需要被实现

onJetEvent(JetPlayer player, short segment, byte track, byte channel, byte controller, byte value)

onJetUserIdUpdate(JetPlayer player, int userId, int repeatCount)

onJetNumQueuedSegmentUpdate(JetPlayer player, int nbSegments)

onJetPauseUpdate(JetPlayer player, int paused)

17. 在JetThread构造方法JetBoyThread(SurfaceHolder, Context, Handler)中

// 获取图片

mTitleBG = BitmapFactory.decodeResource(mRes, R.drawable.title_hori);

18. 在JetThread.initializeJetPlayer()方法中

// private JetPlayer mJet = null;

mJet = JetPlayer.getJetPlayer();

// 设置OnJetEventListener监听对象

mJet.setEventListener(this);

// 加载Jet文件

mJet.loadJetFile(mContext.getResources().openRawResourceFd(R.raw.level1));

// 其他

mJet.queueJetSegment(0, 0, 0, 0, 0, sSegmentID);

mJet.queueJetSegment(1, 0, 4, 0, 0, sSegmentID);

mJet.queueJetSegment(1, 0, 4, 1, 0, sSegmentID);

mJet.setMuteArray(muteMask[0], true);

19. 在JetThread.doDraw(Canvas)方法中

// 如果mState等于RUNNING

doDrawRunning(canvas);

// 如果mState等于START

doDrawReady(canvas);

// 如果mState等于PLAY或LOSE

mTitleBG2 = BitmapFactory.decodeResource(mRes, R.drawable.title_bg_hori);

doDrawPlay(canvas);

原文地址:https://www.cnblogs.com/fengzhblog/p/2752202.html