`
talin2010
  • 浏览: 517194 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

实例分析JETBOY

阅读更多
实现原理:

启动以个单独的游戏线程,通过主VIEW中的ONCLIK事件中根据不同的线程状态,显示不同的VIEW和按钮状态。

private JetBoyThread mJetBoyThread; //游戏线程

private JetBoyView mJetBoyView; //游戏运行的VIEW

private Button mButton; //PLAY按钮

private Button mButtonRetry; //RETRy按钮

private TextView mTextView; //游戏中显示的帮助文本

private TextView mTimerView;//游戏时钟

程序入口点:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.jetboy" android:versionCode="1"
android:versionName="1.0.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
<activity android:name=".JetBoy"
android:label="@string/app_name"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN " />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3"></uses-sdk>
</manifest>

很明显是JETBOY.JAVA。

main.xml 中使用的是FrameLayout,在其中部署了上诉的VIEW和button。

onCreate中代码很简单,主要是取得VIEW和BUTTON,然后初始化mJetBoyThread和mJetBoyView;

public class JetBoy extends Activity implements View.OnClickListener

请注意这个实现的目的是为了在一个ONCLICK中处理所有按钮事件。主要逻辑都是在onClick(View v)实现。具体看看:

public void onClick(View v) {

if (mJetBoyThread.getGameState() == JetBoyThread.STATE_START) {
mButton.setText("PLAY!");
mTextView.setVisibility(View.VISIBLE);

mTextView.setText(R.string.helpText);
mJetBoyThread.setGameState(JetBoyThread.STATE_PLAY);

}
// we have entered game play, now we about to start running
else if (mJetBoyThread.getGameState() == JetBoyThread.STATE_PLAY) {
mButton.setVisibility(View.INVISIBLE);
mTextView.setVisibility(View.INVISIBLE);
mTimerView.setVisibility(View.VISIBLE);
mJetBoyThread.setGameState(JetBoyThread.STATE_RUNNING);

}
// this is a retry button
else if (mButtonRetry.equals(v)) {

mTextView.setText(R.string.helpText);

mButton.setText("PLAY!");
mButtonRetry.setVisibility(View.INVISIBLE);
// mButtonRestart.setVisibility(View.INVISIBLE);

mTextView.setVisibility(View.VISIBLE);
mButton.setText("PLAY!");
mButton.setVisibility(View.VISIBLE);

mJetBoyThread.setGameState(JetBoyThread.STATE_PLAY);

} else {
Log.d("JB VIEW", "unknown click " + v.getId());

Log.d("JB VIEW", "state is " + mJetBoyThread.mState);

}
}

很容易读懂。

另外实现两个onKeyDown和onKeyUp事件,处理游戏中按键的事件。

核心实现:JetBoyView

1 SurfaceView分析

public class JetBoyView extends SurfaceView implements SurfaceHolder.Callback{}

SurfaceView 在复杂的游戏开发中经常用到,提供一个可直接控制的画图界面,在Canvas可以绘制各种背景、人物、场景。

通过GetHolder()返回SurfaceHolde来实现对SurfaceView 的控制;

SurfaceHolder holder = getHolder();
holder.addCallback(this);//Add a Callback interface for this holder.

以上是该程序中的代码;

SurfaceHolder.Callback 通过这个接口可以获得Surface改变的信息;

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} //在surface的大小发生改变时激发

public void surfaceCreated(SurfaceHolder arg0) { }

//在创建时激发,一般在这里调用画图的线程

public void surfaceDestroyed(SurfaceHolder arg0) { }

//销毁时激发,一般在这里将画图的线程停止、释放

以上是实现的接口方法;

2 GameEvent

程序定义了两个GameEvent 子类KeyGameEvent和JetGameEvent,很容理解。

KeyGameEvent 来自键盘输入

JetGameEvent 来自 JetPlayer.

这里涉及到JetPlayer是什么?开发过游戏的应该很熟悉,我查了帮助,才搞清楚是做什么的。这里会涉及到一系列Jet的概念,从相关资料中得知:

JET 一个在嵌入式设备上的音乐播放器,包括那些运行机器人平台小的嵌入式设备。它允许应用程序在响应中的 MIDI 格式中包含交互式音乐音轨实时游戏事件和用户交互。

JET ENGINE 一个控制游戏声音特效的引擎,其使用MIDI格式,并可以控制游戏的时间进度(一个精确的时钟是一个游戏必不可少)

JetPlayer 提供了对JET content的访问

JetCreator 是一盒可以创建JET content的工具;

稍后会详细说明;

3 关键线程JetBoyThread

整个游戏的主线程,首先看看定义

class JetBoyThread extends Thread implements OnJetEventListener

它实现了OnJetEventListener接口,用来获取JetPlayer的事件;

先看看该线程主要完成什么功能:

  • 处理JetPlayer和KEY事件;
  • 2 绘制各种动画SurfaceView中的显示;
  • 3 游戏状态的设置;
  • 4 用户游戏数据的保存;
程序的逻辑

在仔细分析代码前,有必要看看程序的逻辑是如何实现的?线程是如何启动和运行的?

首先jetBoy:onCreate

JetBoyView:JetBoyView(Context context, AttributeSet attrs{

thread = new JetBoyThread(holder, context, new Handler();\\创建线程并在线程构造函数中初始化游戏状态;mState=STATE_START;setRunning(TRUE);

}

surfaceCreated 中启动线程thread.start();

开始执行JetBoyThread:run()//进入游戏状态集;这是执行的主体;会根据不同的游戏状态执行相应的操作。直到setRunning(false);

这时候等待用户操作;

jetBoy的onKeyDown,onKeyUp会触发JetBoyThread的doKeyDown和doKeyUp,将事件放到队列中,然后在updateGameState,检查mEventQueue,进行事件处理:

@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {

if (keyCode == 4)
super.onKeyDown(keyCode, msg);

return mJetBoyThread.doKeyDown(keyCode, msg);
}

public boolean doKeyDown(int keyCode, KeyEvent msg) {
mEventQueue.add(new KeyGameEvent(keyCode, false, msg));

return true;
}

protected void updateGameState() {
// Process any game events and apply them
while (true) {
GameEvent event = mEventQueue.poll();
if (event == null)
break;

// Log.d(TAG,"*** EVENT = " + event);

// Process keys tracking the input context to pass in to later
// calls
if (event instanceof KeyGameEvent) {
// Process the key for affects other then asteroid hits
mKeyContext = processKeyEvent((KeyGameEvent)event, mKeyContext);

// Update laser state. Having this here allows the laser to
// be triggered right when the key is
// pressed. If we comment this out the laser will only be
// turned on when updateLaser is called
// when processing a timer event below.
updateLaser(mKeyContext);

}
// JET events trigger a state update
else if (event instanceof JetGameEvent) {
JetGameEvent jetEvent = (JetGameEvent)event;

// Only update state on a timer event
if (jetEvent.value == TIMER_EVENT) {
// Note the time of the last beat
mLastBeatTime = System.currentTimeMillis();

// Update laser state, turning it on if a key has been
// pressed or off if it has been
// on for too long.
updateLaser(mKeyContext);

// Update explosions before we update asteroids because
// updateAsteroids may add
// new explosions that we do not want updated until next
// frame
updateExplosions(mKeyContext);

// Update asteroid positions, hit status and animations
updateAsteroids(mKeyContext);
}

processJetEvent(jetEvent.player, jetEvent.segment, jetEvent.track, jetEvent.channel, jetEvent.controller, jetEvent.value);
}
}
}

逻辑应该很清楚了吧。

分享到:
评论

相关推荐

    jetboy android游戏 源码

    JetBoy游戏源码就是一个实例,展示了如何在Android平台上构建一个交互式的移动游戏。 2. **Eclipse IDE**:Eclipse是一种广泛使用的集成开发环境(IDE),尤其在Java开发领域非常流行。它提供了代码编辑、调试、...

    安卓Android源码——JetBoy飞机游戏源码.zip

    通过分析和学习JetBoy游戏的源代码,开发者可以学习到如何在Android平台上创建游戏界面、处理用户输入、实现游戏逻辑、管理游戏状态以及优化性能等方面的知识。此外,还能了解到如何整合资源文件、使用Android ...

    安卓开发-JetBoy.zip

    3. **Android Studio**:作为官方的集成开发环境(IDE),Android Studio提供了代码编辑、调试、性能分析等工具,使得开发者能高效地构建Android应用。 4. **资源文件**:在res目录下,包含了应用的图标(drawable...

    应用源码之JetBoy飞机游戏源码.zip

    《JetBoy飞机游戏源码分析》 在Android开发领域,学习和理解源码是提升技能的重要途径。本篇文章将深入探讨“JetBoy飞机游戏”的源码,帮助开发者了解游戏开发的基本流程,掌握JAVA ANDROID编程的关键技术和技巧。...

    Android应用源码之JetBoy飞机游戏源码.zip

    《深入解析JetBoy飞机游戏:Android应用源码分析》 JetBoy是一款经典的Android平台上的飞行射击游戏,其源码提供了一次深入理解Android游戏开发的绝佳机会。通过研究这款游戏的源码,开发者可以学习到如何在Android...

    JetBoy.zip

    通过分析这个文件,我们可以知道应用程序的功能、它如何与其他应用交互以及它对用户设备的需求。 `src`目录通常包含了项目的源代码文件,这里的`src`可能包含了Java或Kotlin等语言编写的类和函数,这些代码实现了...

    Android应用源码之JetBoy飞机游戏源码_源码.zip

    JetBoy飞机游戏源码提供了一个全面的学习实例,让我们深入探讨一下这个项目中的关键知识点。 1. **游戏架构设计** - **Activity与Fragment**:游戏主界面可能由一个或多个Activity和Fragment组成,用于管理用户...

    Android应用源码之JetBoy飞机游戏源码-IT计算机-毕业设计.zip

    《Android应用源码之JetBoy飞机游戏源码》是一份专为IT计算机专业学生和开发者设计的毕业设计资源,旨在帮助他们深入理解Android应用开发,特别是游戏开发的实践过程。这个压缩包包含了完整的JetBoy飞机游戏的源代码...

    Android应用源码之JetBoy飞机游戏源码.zip项目安卓应用源码下载

    Android应用源码之JetBoy飞机游戏源码.zip项目安卓应用源码下载Android应用源码之JetBoy飞机游戏源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    小程序源码 JetBoy飞机游戏源码.zip

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    小程序源码 JetBoy飞机游戏源码.rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    android sdk 自带 实例(samples)

    JetBoy A game that demonstrates the SONiVOX JET interactive music technology, with JetPlayer. Live Wallpaper An application that demonstrates how to create a live wallpaper and bundle it in an ...

    Android移动开发案例详解 源码

    《Android移动开发案例详解》作为《Android平台手机软件...实用软件(如音乐播放器、天气预报、多媒体播放器、短信语音播报、手机远程监控器等),游戏软件(如JetBoy、连连看、贪吃蛇等)以及其他程序的详细开发过程。

    android游戏

    为了深入了解这款游戏,我们需要对游戏代码进行分析,理解其游戏逻辑、画面渲染和用户交互的实现方式。 总结,Android游戏开发涉及众多技术环节,从编程语言、开发工具到图形渲染和性能优化,都需要开发者有扎实的...

    Android实现固定屏幕显示的方法

    本文实例讲述了Android实现固定屏幕显示的方法。分享给大家供大家参考。具体如下: 在Android开发中我们会碰到开发屏幕扭转的情况,如何固定住屏幕ScreenOrientation 呢? 在学习jetboy代码时,发现屏幕被旋转了,...

    Android 2.2 simple

    通过分析这个应用,开发者可以学习如何处理游戏循环、动画效果以及游戏状态管理。 综上所述,Android 2.2 simple包含了各种示例和功能,旨在帮助开发者理解和利用Android 2.2的新特性,如高效的同步、手势识别、...

    JetBoyView.rar_boy

    【标题】JetBoyView.rar_boy 指的是一个与"JetBoy View"相关的源代码压缩包,适用于Linux操作系统。 【描述】"Jet Boy View Source Code for Linux" 提供了关键信息,说明这个压缩包包含了Jet Boy View项目的源代码...

    Android中游戏编程的相关信息

    **JetBoy** 是一款横向卷轴射击游戏,随着Android 1.5版本的发布而新增。该示例展示了如何使用 `SurfaceView` 来处理复杂的图形效果,并且特别介绍了如何利用 `JetPlayer` 类来实现游戏音效。 - **技术要点**: - ...

Global site tag (gtag.js) - Google Analytics