Android游戏开发(快速入门必备)

Android游戏开发(快速入门必备)
Android游戏开发(快速入门必备)

Android游戏开发之旅一长按Button原理

今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。

对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类

public class RepeatingImageButton extends ImageButton {

private long mStartTime; //记录长按开始

private int mRepeatCount; //重复次数计数

private RepeatListener mListener;

private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下

public RepeatingImageButton(Context context) {

this(context, null);

}

public RepeatingImageButton(Context context, AttributeSet attrs) {

this(context, attrs, android.R.attr.imageButtonStyle);

}

public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);

setFocusable(true); //允许获得焦点

setLongClickable(true); //启用长按事件

}

public void setRepeatListener(RepeatListener l, long interval) { //实现重复按下事件listener mListener = l;

mInterval = interval;

}

@Override

public boolean performLongClick() {

mStartTime = SystemClock.elapsedRealtime();

mRepeatCount = 0;

post(mRepeater);

return true;

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_UP) { // 本方法原理同onKeyUp的一样,这里处理屏幕事件,下面的onKeyUp处理Android手机上的物理按键事件

removeCallbacks(mRepeater);

if (mStartTime != 0) {

doRepeat(true);

mStartTime = 0;

}

}

return super.onTouchEvent(event);

}

//处理导航键事件的中键或轨迹球按下事件

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_CENTER:

case KeyEvent.KEYCODE_ENTER:

super.onKeyDown(keyCode, event);

return true;

}

return super.onKeyDown(keyCode, event);

}

//当按键弹起通知长按结束

@Override

public boolean onKeyUp(int keyCode, KeyEvent event) {

switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_CENTER:

case KeyEvent.KEYCODE_ENTER:

removeCallbacks(mRepeater); //取消重复listener捕获

if (mStartTime != 0) {

doRepeat(true); //如果长按事件累计时间不为0则说明长按了

mStartTime = 0; //重置长按计时器

}

}

return super.onKeyUp(keyCode, event);

}

private Runnable mRepeater = new Runnable() { //在线程中判断重复

public void run() {

doRepeat(false);

if (isPressed()) {

postDelayed(this, mInterval); //计算长按后延迟下一次累加

}

}

};

private void doRepeat(boolean last) {

long now = SystemClock.elapsedRealtime();

if (mListener != null) {

mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);

}

}

下面是重复Button Listener接口的定义,调用时在Button中先使用setRepeatListener()方法实现RepeatListener接口

public interface RepeatListener {

void onRepeat(View v, long duration, int repeatcount); //参数一为用户传入的Button 对象,参数二为延迟的毫秒数,第三位重复次数回调。

}

}

Android游戏开发之旅二View和SurfaceView

在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas 来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。这里我们说下android.view.View和

android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有

Canvas lockCanvas()

Canvas lockCanvas(Rect dirty) 、void removeCallback(SurfaceHolder.Callback callback)、void unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在

SurfaceHolder.Callback 接口回调中可以通过下面三个抽象类可以自己定义具体的实现,比如第一个更改格式和显示画面。

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

abstract void surfaceCreated(SurfaceHolder holder)

abstract void surfaceDestroyed(SurfaceHolder holder)

对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时Android123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。

Android游戏开发之旅三View类详解

在Android游戏开发之旅二中我们讲到了View和SurfaceView的区别,今天Android123从View 类开始着重的介绍Android图形显示基类的相关方法和注意点。

自定义View的常用方法:

onFinishInflate() 当View中所有的子控件均被映射成xml后触发

onMeasure(int, int) 确定所有子元素的大小

onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发onSizeChanged(int, int, int, int) 当view的大小发生变化时触发

onDraw(Canvas) view渲染内容的细节

onKeyDown(int, KeyEvent) 有按键按下后触发

onKeyUp(int, KeyEvent) 有按键按下后弹起时触发

onTrackballEvent(MotionEvent) 轨迹球事件

onTouchEvent(MotionEvent) 触屏事件

onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发onAttachedToWindow() 当view被附着到一个窗口时触发

onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法

和onAttachedToWindow() 是相反的。

onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发

以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:

@Override

protected void onDraw(Canvas canvas) {

//这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色

Paint paintBackground = new Paint();

paintBackground.setColor(getResources().getColor(R.color.xxx)); //从Res中找到名为xxx 的color颜色定义

canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //设置当前画布的背景颜

色为paintBackground中定义的颜色,以0,0作为为起点,以当前画布的宽度和高度为重点即整块画布来填充。

具体的请查看Android123未来讲到的Canvas和Paint,在Canvas中我们可以实现画路径,图形,区域,线。而Paint作为绘画方式的对象可以设置颜色,大小,甚至字体的类型等等。

}

当然还有就是处理窗口还原状态问题(一般用于横竖屏切换),除了在Activity中可以调用外,开发游戏时我们尽量在View中使用类似

@Override

protected Parcelable onSaveInstanceState() {

Parcelable p = super.onSaveInstanceState();

Bundle bundle = new Bundle();

bundle.putInt("x", pX);

bundle.putInt("y", pY);

bundle.putParcelable("android123_state", p);

return bundle;

}

@Override

protected void onRestoreInstanceState(Parcelable state) {

Bundle bundle = (Bundle) state;

dosomething(bundle.getInt("x"), bundle.getInt("y")); //获取刚才存储的x和y信息

super.onRestoreInstanceState(bundle.getParcelable("android123_state"));

return;

}

在View中如果需要强制调用绘制方法onDraw,可以使用invalidate()方法,它有很多重载版本,同时在线程中的postInvailidate()方法将在Android游戏开发之旅六中的自定义View完整篇讲到。

Android游戏开发之旅四Canvas和Paint实例

昨天我们在Android游戏开发之旅三View详解中提到了onDraw方法,有关详细的实现我们今天主要说下Android的Canvas和Paint对象的使用实例。

Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本,下面是Canvas类常用的方法,当然Android开发网提示大家很多方法有不同的重载版本,参数更灵活。

void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域

void drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象

void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) //贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(Android123提示这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。

void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) //画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint画刷对象。

void drawPoint(float x, float y, Paint paint) //画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。

void drawText(String text, float x, float y, Paint paint) //渲染文本,Canvas类除了上面的还可以描绘文字,参数一是String类型的文本,参数二x轴,参数三y轴,参数四是Paint对象。

void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) //在路

径上绘制文本,相对于上面第二个参数是Path路径对象

从上面来看我们可以看出Canvas绘制类比较简单同时很灵活,实现一般的方法通常没有问题,同时可以叠加的处理设计出一些效果,不过细心的网友可能发现最后一个参数均为Paint对象。如果我们把Canvas当做绘画师来看,那么Paint就是我们绘画的工具,比如画笔、画刷、颜料等等。

Paint类常用方法:

void setARGB(int a, int r, int g, int b) 设置Paint对象颜色,参数一为alpha透明通道

void setAlpha(int a) 设置alpha不透明度,范围为0~255

void setAntiAlias(boolean aa) //是否抗锯齿

void setColor(int color) //设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义

.

void setFakeBoldText(boolean fakeBoldText) //设置伪粗体文本

void setLinearText(boolean linearText) //设置线性文本

PathEffect setPathEffect(PathEffect effect) //设置路径效果

Rasterizer setRasterizer(Rasterizer rasterizer) //设置光栅化

Shader setShader(Shader shader) //设置阴影

void setTextAlign(Paint.Align align) //设置文本对齐

void setTextScaleX(float scaleX) //设置文本缩放倍数,1.0f为原始

void setTextSize(float textSize) //设置字体大小

Typeface setTypeface(Typeface typeface) //设置字体,Typeface包含了字体的类型,粗细,还有倾斜、颜色等。

void setUnderlineText(boolean underlineText) //设置下划线

最终Canvas和Paint在onDraw中直接使用

@Override

protected void onDraw(Canvas canvas) {

Paint paintRed=new Paint();

paintRed.setColor(Color.Red);

canvas.drawPoint(11,3,paintRed); //在坐标11,3上画一个红点

}

下一次Android123将会具体讲到强大的Path路径,和字体Typeface相关的使用。

Android游戏开发之旅(五)Path和Typeface

今天我们继续处理上次Android游戏开发之旅(四)Canvas和Paint实例中提到的Path路径和Typeface字体两个类。对于Android游戏开发或者说2D绘图中来讲Path 路径可以用强大这个词来形容。在Photoshop中我们可能还记得使用钢笔工具绘制路径的方法。Path路径类在位于android.graphics.Path中,Path的构造方法比较简单,如下

Path cwj=new Path(); //构造方法

复制代码

下面我们画一个封闭的原型路径,我们使用Path类的addCircle方法

cwj.addCircle(10,10,50,Direction.CW); //参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是逆时针方向

复制代码

结合Android上次提到的Canvas类中的绘制方法drawPath和drawTextOnPath,我们继续可以在onDraw中加入。

canvas.drawPath(cwj,paintPath); //Android123提示大家这里paintPath为路径的画刷颜色,可以见下文完整的源代码。

canvas.drawTextOnPath("Android123 - CWJ",cwj,0,15,paintText); //将文字绘制到路径中去,

复制代码

有关drawTextOnPath的参数如下:

方法原型

public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)

复制代码

参数列表

text 为需要在路径上绘制的文字内容。

path 将文字绘制到哪个路径。

hOffset 距离路径开始的距离

vOffset 离路径的上下高度,这里Android开发网提示大家,该参数类型为float浮点型,除了精度为8位小数外,可以为正或负,当为正时文字在路径的圈里面,为负时在路径的圈外面。paint 最后仍然是一个Paint对象用于制定Text本文的颜色、字体、大小等属性。

下面是我们的onDraw方法中如何绘制路径的演示代码为:

@Override

protected void onDraw(Canvas canvas) {

Paint paintPath=new Paint();

Paint paintText=new Paint();

paintPath.setColor(Color.Red); //路径的画刷为红色

paintText.setColor(Color.Blue); //路径上的文字为蓝色

Path pathCWJ=new Path();

pathCWJ.addCircle(10,10,50,Direction.CW); // 半径为50px,绘制的方向CW为顺时针

canvas.drawPath(pathCWJ,paintPath);

canvas.drawTextOnPath("Android123 - CWJ",pathCWJ,0,15,paintText); //在路径上绘制文字

}

复制代码

有关路径类常用的方法如下:

void addArc(RectF oval, float startAngle, float sweepAngle) //为路径添加一个多边形

void addCircle(float x, float y, float radius, Path.Direction dir) //给path添加圆圈

void addOval(RectF oval, Path.Direction dir) //添加椭圆形

void addRect(RectF rect, Path.Direction dir) //添加一个区域

void addRoundRect(RectF rect, float[] radii, Path.Direction dir) //添加一个圆角区域

boolean isEmpty() //判断路径是否为空

void transform(Matrix matrix) //应用矩阵变换

void transform(Matrix matrix, Path dst) //应用矩阵变换并将结果放到新的路径中,即第二个参数。

复制代码

有关路径的高级效果大家可以使用PathEffect类,有关路径的更多实例Android123将在今后的游戏开发实战中讲解道。

Typeface字体类

平时我们在TextView中需要设置显示的字体可以通过TextView中的setTypeface方法来指定一个Typeface对象,因为Android的字体类比较简单,我们列出所有成员方法

static Typeface create(Typeface family, int style) //静态方法,参数一为字体类型这里是Typeface的静态定义,如宋体,参数二风格,如粗体,斜体

static Typeface create(String familyName, int style) //静态方法,参数一为字体名的字符串,参数二为风格同上,这里我们推荐使用上面的方法。

static Typeface createFromAsset(AssetManager mgr, String path) //静态方法,参数一为AssetManager对象,主要用于从APK的assets文件夹中取出字体,参数二为相对于Android 工程下的assets文件夹中的外挂字体文件的路径。

static Typeface createFromFile(File path) //静态方法,从文件系统构造一个字体,这里参数可以是sdcard中的某个字体文件

static Typeface createFromFile(String path) //静态方法,从指定路径中构造字体

static Typeface defaultFromStyle(int style) //静态方法,返回默认的字体风格

int getStyle() //获取当前字体风格

final boolean isBold() //判断当前是否为粗体

final boolean isItalic() //判断当前风格是否为斜体

复制代码

本类的常量静态定义,首先为字体类型名称

Typeface DEFAULT

Typeface DEFAULT_BOLD

Typeface MONOSPACE

Typeface SANS_SERIF

Typeface SERIF

字体风格名称

int BOLD

int BOLD_ITALIC

int ITALIC

int NORMAL

明天我们将在Android游戏开发之旅六自定义View 一文中具体讲解onDraw以及什么时候会触发绘制方法,来实现我们自定义或子类化控件。

Android游戏开发之旅六自定义View

有关Android的自定义View的框架今天我们一起讨论下,对于常规的游戏,我们在View中需要处理以下几种问题: 1.控制事件 2.刷新View 3. 绘制View

1. 对于控制事件今天我们只处理按键事件onKeyDown,以后的文章中将会讲到屏幕触控的具体处理onTouchEvent以及Sensor重力感应等方法。

2. 刷新view的方法这里主要有invalidate(int l, int t, int r, int b) 刷新局部,四个参数分别为左、上、右、下。整个view刷新invalidate(),刷新一个矩形区域invalidate(Rect dirty) ,刷新一个特性Drawable,invalidateDrawable(Drawable drawable) ,执行invalidate类的方法将会设置view为无效,最终导致onDraw方法被重新调用。由于今天的view比较简单,Android123提示大家如果在线程中刷新,除了使用handler方式外,可以在Thread中直接使用postInvalidate 方法来实现。

3. 绘制View主要是onDraw()中通过形参canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等等。view方法内部还重写了很多接口,其回调方法可以帮助我们判断出view的位置和大小,比如onMeasure(int, int) Called to determine the size requirements for this view and all of its children. 、onLayout(boolean, int, int, int, int) Called when this view should assign a size and position to all of its children 和onSizeChanged(int, int, int, int) Called when the size of this view has changed. 具体的作用,大家可以用Logcat获取当view变化时每个形参的变动。

下面cwjView是我们为今后游戏设计的一个简单自定义View框架,我们可以看到在Android 平台自定义view还是很简单的,同时Java支持多继承可以帮助我们不断的完善复杂的问题。

public class cwjView extends View {

public cwjView(Context context) {

super(context);

setFocusable(true); //允许获得焦点

setFocusableInTouchMode(true); //获取焦点时允许触控

}

@Override

protected Parcelable onSaveInstanceState() { //处理窗口保存事件

Parcelable pSaved = super.onSaveInstanceState();

Bundle bundle = new Bundle();

//dosomething

return bundle;

}

@Override

protected void onRestoreInstanceState(Parcelable state) { //处理窗口还原事件

Bundle bundle = (Bundle) state;

//dosomething

super.onRestoreInstanceState(bundle.getParcelable("cwj"));

return;

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) //处理窗口大小变化事件

{

super.onSizeChanged(w, h, oldw, oldh);

}

@Override

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

{

super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不让父类处理记住调用setMeasuredDimension

}

@Override

protected void onLayout (boolean changed, int left, int top, int right, int bottom)

{

super.onLayout (changed,left,top, ight,bottom) ;

}

@Override

protected void onDraw(Canvas canvas) {

Paint bg = new Paint();

bg.setColor(Color.Red);

canvas.drawRect(0, 0, getWidth()/2, getHeight()/2, bg); //将view的左上角四分之一填充为红色

}

@Override

public boolean onTouchEvent(MotionEvent event) {

return super.onTouchEvent(event); //让父类处理屏幕触控事件

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) { //处理按键事件,响应的轨迹球事件为public boolean onTrackballEvent (MotionEvent event)

switch (keyCode) {

case KeyEvent.KEYCODE_DPAD_UP:

break;

case KeyEvent.KEYCODE_DPAD_DOWN:

break;

case KeyEvent.KEYCODE_DPAD_LEFT:

break;

case KeyEvent.KEYCODE_DPAD_RIGHT:

break;

case KeyEvent.KEYCODE_DPAD_CENTER: //处理中键按下

break;

default:

return super.onKeyDown(keyCode, event);

}

return true;

}

}

上面我们可以看到onMeasure使用的是父类的处理方法,如果我们需要解决自定义View的大小,可以尝试下面的方法

@Override

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

{

height = View.MeasureSpec.getSize(heightMeasureSpec);

width = View.MeasureSpec.getSize(widthMeasureSpec);

setMeasuredDimension(width,height); //这里面是原始的大小,需要重新计算可以修改本行

//dosomething

}

Android游戏开发之旅七自定义SurfaceView

今天我们说下未来的Android游戏引擎模板架构问题,对于游戏我们还是选择SurfaceView,相关的原因Android123已经在Android游戏开发之旅二View和SurfaceView中说的很清楚了,这里我们直接继承SurfaceView,实现SurfaceHolder.Callback接口,处理surfaceCreated、surfaceChanged以及surfaceDestroyed方法,这里我们并没有把按键控制传入,最终游戏的控制方面仍然由View内部类处理比较好,有关SurfaceView的具体我们可以参见Android开源项目的Camera中有关画面捕捉以及VideoView的控件实现大家可以清晰了解最终的用意。

public class cwjView extends SurfaceView implements SurfaceHolder.Callback {

public cwjView(Context context, AttributeSet attrs) {

super(context, attrs);

SurfaceHolder holder=getHolder();

holder.addCallback(this);

setFocusable(true);

}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

public void surfaceCreated(SurfaceHolder holder) {

}

public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override

public void onWindowFocusChanged(boolean hasWindowFocus) {

}

}

Android游戏开发之旅八SurfaceView类实例

有关SurfaceView我们将通过三个系统自带的例子来深入掌握Android绘图必会的SurfaceView,今天我们以SDK中的Sample游戏lunarlander中的LunarView具体实现,Android123建议大家导入该游戏工程到你的Eclipse然后自己编译先玩一下这个游戏,然后再看代码比较好理解。

class LunarView extends SurfaceView implements SurfaceHolder.Callback { class LunarThread extends Thread {

/*

* Difficulty setting constants

*/

public static final int DIFFICULTY_EASY = 0;

public static final int DIFFICULTY_HARD = 1;

public static final int DIFFICULTY_MEDIUM = 2;

/*

* Physics constants

*/

public static final int PHYS_DOWN_ACCEL_SEC = 35;

public static final int PHYS_FIRE_ACCEL_SEC = 80;

public static final int PHYS_FUEL_INIT = 60;

public static final int PHYS_FUEL_MAX = 100;

public static final int PHYS_FUEL_SEC = 10;

public static final int PHYS_SLEW_SEC = 120; // degrees/second rotate

public static final int PHYS_SPEED_HYPERSPACE = 180;

public static final int PHYS_SPEED_INIT = 30;

public static final int PHYS_SPEED_MAX = 120;

/*

* State-tracking constants

*/

public static final int STATE_LOSE = 1;

public static final int STATE_PAUSE = 2;

public static final int STATE_READY = 3;

public static final int STATE_RUNNING = 4;

public static final int STATE_WIN = 5;

/*

* Goal condition constants

*/

public static final int TARGET_ANGLE = 18; // > this angle means crash

public static final int TARGET_BOTTOM_PADDING = 17; // px below gear

public static final int TARGET_PAD_HEIGHT = 8; // how high above ground

public static final int TARGET_SPEED = 28; // > this speed means crash

public static final double TARGET_WIDTH = 1.6; // width of target

* UI constants (i.e. the speed & fuel bars)

*/

public static final int UI_BAR = 100; // width of the bar(s)

public static final int UI_BAR_HEIGHT = 10; // height of the bar(s) private static final String KEY_DIFFICULTY = "mDifficulty";

private static final String KEY_DX = "mDX";

private static final String KEY_DY = "mDY";

private static final String KEY_FUEL = "mFuel";

private static final String KEY_GOAL_ANGLE = "mGoalAngle"; private static final String KEY_GOAL_SPEED = "mGoalSpeed"; private static final String KEY_GOAL_WIDTH = "mGoalWidth";

private static final String KEY_GOAL_X = "mGoalX";

private static final String KEY_HEADING = "mHeading";

private static final String KEY_LANDER_HEIGHT = "mLanderHeight"; private static final String KEY_LANDER_WIDTH = "mLanderWidth"; private static final String KEY_WINS = "mWinsInARow";

private static final String KEY_X = "mX";

private static final String KEY_Y = "mY";

/*

* Member (state) fields

*/

/** The drawable to use as the background of the animation canvas */ private Bitmap mBackgroundImage;

/**

* Current height of the surface/canvas.

*

* @see #setSurfaceSize

*/

private int mCanvasHeight = 1;

/**

* Current width of the surface/canvas.

*

* @see #setSurfaceSize

*/

private int mCanvasWidth = 1;

/** What to draw for the Lander when it has crashed */

private Drawable mCrashedImage;

* Current difficulty -- amount of fuel, allowed angle, etc. Default is * MEDIUM.

*/

private int mDifficulty;

/** Velocity dx. */

private double mDX;

/** Velocity dy. */

private double mDY;

/** Is the engine burning? */

private boolean mEngineFiring;

/** What to draw for the Lander when the engine is firing */

private Drawable mFiringImage;

/** Fuel remaining */

private double mFuel;

/** Allowed angle. */

private int mGoalAngle;

/** Allowed speed. */

private int mGoalSpeed;

/** Width of the landing pad. */

private int mGoalWidth;

/** X of the landing pad. */

private int mGoalX;

/** Message handler used by thread to interact with TextView */ private Handler mHandler;

/**

* Lander heading in degrees, with 0 up, 90 right. Kept in the range * 0..360.

*/

private double mHeading;

/** Pixel height of lander image. */

private int mLanderHeight;

/** What to draw for the Lander in its normal state */

private Drawable mLanderImage;

/** Pixel width of lander image. */

private int mLanderWidth;

/** Used to figure out elapsed time between frames */

private long mLastTime;

/** Paint to draw the lines on screen. */

private Paint mLinePaint;

/** "Bad" speed-too-high variant of the line color. */

private Paint mLinePaintBad;

/** The state of the game. One of READY, RUNNING, PAUSE, LOSE, or WIN */ private int mMode;

/** Currently rotating, -1 left, 0 none, 1 right. */

private int mRotating;

/** Indicate whether the surface has been created & is ready to draw */

private boolean mRun = false;

/** Scratch rect object. */

private RectF mScratchRect;

/** Handle to the surface manager object we interact with */

private SurfaceHolder mSurfaceHolder;

/** Number of wins in a row. */

private int mWinsInARow;

/** X of lander center. */

private double mX;

/** Y of lander center. */

private double mY;

public LunarThread(SurfaceHolder surfaceHolder, Context context, Handler handler) {

// get handles to some important objects

mSurfaceHolder = surfaceHolder;

mHandler = handler;

mContext = context;

Resources res = context.getResources();

// cache handles to our key sprites & other drawables

mLanderImage = context.getResources().getDrawable( https://www.360docs.net/doc/1c7714965.html,nder_plain);

mFiringImage = context.getResources().getDrawable(

https://www.360docs.net/doc/1c7714965.html,nder_firing);

mCrashedImage = context.getResources().getDrawable( https://www.360docs.net/doc/1c7714965.html,nder_crashed);

// load background image as a Bitmap instead of a Drawable b/c // we don't need to transform it and it's faster to draw this way mBackgroundImage = BitmapFactory.decodeResource(res, R.drawable.earthrise);

// Use the regular lander image as the model size for all sprites mLanderWidth = mLanderImage.getIntrinsicWidth();

mLanderHeight = mLanderImage.getIntrinsicHeight();

// Initialize paints for speedometer

mLinePaint = new Paint();

mLinePaint.setAntiAlias(true);

mLinePaint.setARGB(255, 0, 255, 0);

mLinePaintBad = new Paint();

mLinePaintBad.setAntiAlias(true);

mLinePaintBad.setARGB(255, 120, 180, 0);

mScratchRect = new RectF(0, 0, 0, 0);

mWinsInARow = 0;

mDifficulty = DIFFICULTY_MEDIUM;

// initial show-up of lander (not yet playing)

mX = mLanderWidth;

mY = mLanderHeight * 2;

mFuel = PHYS_FUEL_INIT;

mDX = 0;

mDY = 0;

mHeading = 0;

mEngineFiring = true;

}

/**

* Starts the game, setting parameters for the current difficulty.

*/

public void doStart() {

synchronized (mSurfaceHolder) {

// First set the game for Medium difficulty

mFuel = PHYS_FUEL_INIT;

mEngineFiring = false;

mGoalWidth = (int) (mLanderWidth * TARGET_WIDTH);

mGoalSpeed = TARGET_SPEED;

mGoalAngle = TARGET_ANGLE;

int speedInit = PHYS_SPEED_INIT;

// Adjust difficulty params for EASY/HARD

if (mDifficulty == DIFFICULTY_EASY) {

mFuel = mFuel * 3 / 2;

mGoalWidth = mGoalWidth * 4 / 3;

mGoalSpeed = mGoalSpeed * 3 / 2;

mGoalAngle = mGoalAngle * 4 / 3;

speedInit = speedInit * 3 / 4;

} else if (mDifficulty == DIFFICULTY_HARD) {

mFuel = mFuel * 7 / 8;

mGoalWidth = mGoalWidth * 3 / 4;

mGoalSpeed = mGoalSpeed * 7 / 8;

speedInit = speedInit * 4 / 3;

}

// pick a convenient initial location for the lander sprite

mX = mCanvasWidth / 2;

mY = mCanvasHeight - mLanderHeight / 2;

// start with a little random motion

mDY = Math.random() * -speedInit;

mDX = Math.random() * 2 * speedInit - speedInit;

mHeading = 0;

// Figure initial spot for landing, not too near center

while (true) {

mGoalX = (int) (Math.random() * (mCanvasWidth - mGoalWidth));

if (Math.abs(mGoalX - (mX - mLanderWidth / 2)) > mCanvasHeight / 6) break;

}

mLastTime = System.currentTimeMillis() + 100;

setState(STATE_RUNNING);

}

}

13简单快速学会金口诀之地支三合

13简单快速学会金口诀之地支三合 各位易友大家好,我是吉娘。 我在写关于金口诀预测的系列文章,这是我写的第十三篇文章,它是可以免费阅读的,有部分文章我设置为付费文章,因为有付出才有收获。 讲完刑再来讲三合。 寅午戌合火局、亥卯未合木局,巳酉丑合金局、申子辰合水局。 另外,课内天干不参与三合,当有天干凑成三合时,这叫虚合三合局。有这个气势没那个力气,好比领导来到你的办公室,他虽然没有管你,但你不敢不认真工作,因为他的权威摆在那了。 还要注意的是,只有首尾两个支出现,缺中间那个支,是不成半合的,如如寅戌不论半合论克,但可以作为应期。 寅午戌合火局,文书、财帛、喜美之和,不好的时候是有口舌是非事。 寅午戌三个支都是阳的,而且从左往右依次相生,是美梦成真的合,有喜美的事。有文书、财帛上的好事。因为火主文化,是文书上的好事。寅财神出现,也有财喜。 怕有亥、子水来坏局,有子来冲午的话,这个火局就合不成了。 在三合局中,缺头一个字时,如火局无寅,这个叫万事俱备,只欠东风。

如果缺午,这就像青年男女相爱,情到了,就是无时机结合,叫欠时机。 无戌,是做事虎头蛇尾,有冲天壮志,就是坚持不下去,输在个人毅力上。 亥卯未合木局,主交易、婚姻、和会之合,不好的时候是纠缠不清,问婚姻、合作是过程缓慢、吃力,不好搞,也有不愉快的事。 因为三个支都是阴,亥是汽水,没用的水,不成器,卯克未犯啰索,当断不断反受其乱,所以后继问题要考虑好,比如买电器就考虑维修保养等后继问题。 另外,木局怕申酉金坏局。 巳酉丑合金局,阴阳、淫滥、轻薄之合。 也是从革之合,代表着大的改变。 这种合像辰酉合一样,是一种私下的合,有暗昧、私下交易、约定、私会的味。金局的合好的时候是可以改头换面,当你想要作出什么改变时,遇到金局就能如愿更改。 坏的时候是带有暧昧、不明朗、见不得光的意味。不过当你要做的事正好不适合公开的话那就正合你意了。 金局忌午火坏局。 申子辰合水局,是行移、征战、干蛊之合。

安卓开发环境搭建教程及个人经验

安卓入门教程及环境搭建(附笔记) ------By 仙人张 需要的软件包有三个,截止到2012年7月这些软件都是最新版本的:分别是JDK、SDK、Eclipse(版本4.2 Juno)他们的名字和大小如下 一、软件包的下载 1、JDK的下载(jdk-7u5-windows-i586) https://www.360docs.net/doc/1c7714965.html,/technetwork/java/javase/downloads/index.html

2、SDK的下载(installer_r20-windows)https://www.360docs.net/doc/1c7714965.html,/sdk/index.html 3、Eclipse的下载(eclipse-jee-juno-win32)https://www.360docs.net/doc/1c7714965.html,/downloads/

二、软件安装 说说我的文件夹是怎么安排的,软件安装前先在自己安装软件的那个盘新建一个文件夹名字可以取为Android,然后这三个软件分别安装到里面的三个文件夹里就可以了,然后在Android文件夹里新建一个文件夹专门放自己的工程文件。 1、JDK的安装 上面下载的jdk-7u5-windows-i586是一个安装包,直接双击就可以安装了,记得路径选择Android文件夹里的Java 文件夹。 2、Eclipse的安装 上面下载的eclipse-jee-juno-win32是一个压缩包,解压后就可以直接用了,将解压后的文件夹eclipse-jee-juno-win32也放在Android文件夹下。 3、SDK的安装 上面下载的installer_r20-windows是一个安装包,将它安装到Android文件夹里的android-sdk文件夹。 装好以后像我的文件夹就是这样了

6简单快速学会金口诀之定旺衰

6简单快速学会金口诀之定旺衰 各位易友你们好,我是吉娘。 我在写关于金口诀预测的系列文章,这是我写的第六篇文章,它是可以免费阅读的,有部分文章我设置为付费文章,因为有付出才有收获。 上次我们讲完了定用爻,接着是定四位旺衰。 定四位旺衰是根据课内四位五行金、木、水、火、土的搭配来定的。 五行之间有两种关系,生与克。 生的关系是:金生水、水生木、木生火、火生土、土生金。 克的关系是:金克木、木克土、土克水、水克火、火克金。 1、如何定出四位的衰旺? 四位指的是人元、贵神、将神和地分。每一个课起出来,这四位都有属于各自的衰旺状态。 定四位旺衰是根据五行的态势规律来定的。 五行的态势规律是:五行中,当某一个五行处于旺的态势时,它所生的五行处于相,生它的五行处于休的态势,克它的五行处于囚的态势;被它克的五行处于死的态势。

比如当火处于旺势时,火生土,土处相,木生火,木处休,水克火,水处囚,火克金,金处死。 当我们定出课中那个最旺的那一爻之后,以这个旺爻为基准,就可以定出另外三位的相、休、囚的状态。 2、定四位旺衰步骤。 金口诀定四位旺衰有下面这几个步骤,按照先后的顺序分别是: 一是,不受克者为旺。 当课中的五行数量都是一个,没有重复的五行时,那么没有被克的那一个五行比其他被克的五行旺,把它定为旺爻。 比如: 甲旺 乙丑死 庚午相 子休 这一课中,丑土被甲木克,午火被子水克,子水被丑土克,只有甲木没有被克,所以定甲木为旺爻。 这里要注意,贵神和将神的天干是不参与旺衰判断的。

把甲木定为旺爻之后,甲木生午火,午火为相,子水生甲木,子水为休,甲木克丑土,丑土为死。 我们在这四位旁边标记它们各自的状态。 二是,克他者为旺 当课中出现有两个不受克的五行时,第一条准则就不适用了,釆用第二条准则,以克他者为旺来比较这两个不受克的五行哪个旺,哪一行有克其他五行,它就是旺爻。 比如: 辛旺 甲子相 乙亥相 卯死 课中辛金和子水、亥水都没被克,但辛金克了卯木,所以取辛金为课中旺爻。辛金生子、亥水,它们处相地,辛金克卯木,卯木处死地。 三是,受生者旺。 当课中只有两个五行,这时前面两个准则都无法判断,就要依据受生的那个比没被受生的那一五行旺。

基于android的游戏开发开题报告总结.doc

开题报告 (1)研究的目的和意义 Android 操作系统最初是由 Andy Rubin 制作,最初主要支持手机,在2005 年被搜索巨头 Google 收购注资,并组建开放手机联盟开发改良随后,逐渐扩展到平板电脑及 其他领域上,2008年全球第一步安卓智能手机问世,标志着安卓的重生。而在2011 年 11 月份的调查, android 智能机一跃超过苹果,以全球市场占有率76%,中国 90% 遥遥领先。在安卓手机中以三星的GALAXY III系列为领头羊,领跑安卓手机最新科技。 当人类步入 21 世纪,随着科技的日趋发展,智能手机 ,平板电脑等高端电子产品进 入了我们的日常生活,随着 3G 时代已经慢慢的融入了我们的日常生活,随着社会的进 步和科技的发展手机已经从单纯的通讯工具转变为集娱乐,学习,通讯为一体的高端电子 产品,随着诺基亚塞班系统的没落,安卓系统迎来了春天。据市场调查,智能手 机市场已经形成了二足鼎力的态势,安卓和苹果的 IOS作为领军者遥遥领先于 windows phone 系统。同时各种 android 应用程序已经有了比较明朗的发展前景,尤其以手机游 戏这个亮点受到广泛的关注和喜爱,正是由于android 拥有广大的用户群, android 手 机游戏拥有巨大的潜力,它也主宰者手机游戏的未来,此次毕业设计顺应时代发展潮 流,依托现在硬件上的优势,以 android 为平台,旨在玩家打造一款优秀的安卓小游戏, 使玩家身临其境,爱不释手。在安卓游戏的市场上,使得 android 手机游戏种类更加丰 富多彩,为安卓手机游戏的发展做出贡献。 (2)国外同类研究的概况 手机游戏种类和资源日益丰富,游戏界面越来越华丽,游戏规则日益复杂,已经 具备了很强的娱乐性和交互性的复杂形态。 2003 年 10 月,Andy Rubin 等人创建了 Android 公司,google 公司于 2005 年 8 月 17 日低调收购 android 以及其团队,Andy Rubin 成为 Google 公司 android 项目工程部

学习android的心得体会

学习android的心得体会 【篇一:android实训心得体会】 项目总结 时间过的好快,为期三个月的实训生活即将结束了,每一次的实训我们都受益匪浅,我 们学到的不仅仅是课内还有课外,实训让我们的课内知识得到了巩固,专业知识、编程水平 都有很大的提高,我们非常感谢这次实训。刚开始二周的高强度的课程安排让我们受益匪浅;接下来的项目实训又让我们可以巩固 了课程。这让我觉得实习生活充实而有意义。乐淘购物项目和android优化大师,我更好的学习了ui的设计,如何使界面漂亮,美观, 巩固了listview,gridview,的使用,学会了动画进入界面的,和会移动的画廊等等。在这 两个项目中,除了让我明白工作中需要能力,素质,知识之外,更重要的是学会了如何去完 成一个任务,懂得了享受工作。当遇到问题,冷静,想办法一点一点的排除障碍,到最后获 取成功,一种自信心由然而生,这就是工作的乐趣。有时候也需要虚心请教,从别人的身上 真得能学习到不自己没有的东西,每一次的挫折只能使我更接近成功。音乐播放器项目,我们是七个人组成小组完成的,由组长带领我们,分配任务,每个人, 都发挥自己的长处,更好地去完成任务。对于团队开发来说,团结一致使我深有体会。团队 的合作注重沟通和信任,不能不屑于做小事,永远都要保持亲和诚信,把专业理论运用到具 体实践中,不仅加深我对理论的掌握和运用,还让我拥有了一次又一次难忘的开发经历,这是也是实训最大的收获。这次实训对于我以后学习、找工作也真是受益菲浅,在这3个月中让我初步从理性回到 感性的重新认识,也让我初步的认识这个社会,对于以后做人所应把握的方向也有所启发!

11简单快速学会金口诀之地支六害

11简单快速学会金口诀之地支六害 各位易友大家好,我是吉娘。 我在写关于金口诀预测的系列文章,这是我写的第十一篇文章,它是可以免费阅读的,有部分文章我设置为付费文章,因为有付出才有收获。 接着再来讲地支的六害,把左手掌摊开,两两垂直相对的地支是相害的关系。有:子未害、丑午害、寅巳害、申亥害,卯辰害、酉戌害。 相害的关系,是相互对峙不让,关系僵持,貌合神离。 在恩惠中产生仇恨而引起的灾难,一般家庭关系容易产生这种关系,由恩变恨,比如父母对孩子好,方式不对,引起孩子的怨恨。 遇到六害时,人也容易引起神经系统的疾病,因为人长期处在僵局当中,精神紧绷。 1、子未相害,又是克又是害,关系恶劣,是所有相害关系中最严重的一种。子水处暗地,未是阴妇,都是阴神,组合在一起是容易犯小人。 工作也有变动,因为未为食禄,是饭碗。 当人处在这种关系的时候,容易变得个性极端,对人无理要求,而别人也是不帮忙还添乱。

2、丑午害,是又生又害的关系,就像母亲对孩子关心过了头,天冷了就使劲给他加衣服,孩子明明不冷。 这就导致人容易生气,耐性差。因为午是发光,丑是湿土泄火气,双方都不好过。 3、寅巳相害,寅是财帛、文书,遇巳来害,代表缺钱花,问财或文书事会有受制。 遇寅巳相害的人,很能说,该说的说,不该说的也说,到处去揭密,让人涶弃。寅代表财还代表人的才华,巳来害,个人才华也很难得到显露。 寅巳是驿马时,是驿马害,出行不顺。 占婚如果离婚了,也有可能还同住一屋檐下。 总之寅巳相害,无恩情、人情,是非多,易犯小人。 4、申亥相害,五行根据不同气度分成十二长官,长生、浴沐、冠带、临官、帝旺、死、墓、绝、胎、养。 其中,申是金的临官,亥是水的临官,临官代表一个人长成授官,开始要施展大图。 所以申亥相遇,各恃临官,都以为自己了不起,竟妒才能,互相为害。 遇到这种害的人,就要防范被对手陷害。 5、卯辰相害,这两个地支是挨在一起的,就是身边人之间的害。

Android游戏开发(快速入门必备)

Android游戏开发之旅一长按Button原理 今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。 对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类 public class RepeatingImageButton extends ImageButton { private long mStartTime; //记录长按开始 private int mRepeatCount; //重复次数计数 private RepeatListener mListener; private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下 public RepeatingImageButton(Context context) { this(context, null); } public RepeatingImageButton(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.imageButtonStyle); } public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setFocusable(true); //允许获得焦点 setLongClickable(true); //启用长按事件 } public void setRepeatListener(RepeatListener l, long interval) { //实现重复按下事件listener mListener = l; mInterval = interval; } @Override public boolean performLongClick() { mStartTime = SystemClock.elapsedRealtime(); mRepeatCount = 0;

33简单快速学会金口诀财动

33简单快速学会金口诀财动 各位易友你们好,我是吉娘。 我在写关于金口诀预测的系列文章,这是我写的第33篇文章,这是一篇付费文章,一共1000多字。 通过这篇文章你将对财动有更深的了解。 将神是财爻,财爻动便称为财动。 将神是内财,贵神是外财,将神克贵神,便是以内财去博取外财,以财求财,这叫动本求财,适合投资、做生意。 将神也是己身,代表自己,自己去克贵神换来的财,就是出外求得的财,或出卖自己的时间、精力换来的工资,或是需要自己花费力气求得的财。 属于自主求财,需要努力求得的。 其实求财的方式有很多种,有利用自己的工作使利得的财,也就是油水,贵神生将神就是这样的。 有别人主动送财来给你的,自己什么都不用干的,比如人元生将神。 有利用房子收租金来的钱,比如地分生将神。 而将神去克贵神比起前三种得来的财要辛苦些,因为去克别人是需要花费力量的,而等着别人来生我多轻松。

将神在四象所属图中代表己身和妻妾,贵神代表尊长父母,将神克贵神,也说明对父母不好不尊重。 在内外关系中,贵神为外,将神为内,将克贵,即是内克外,看人就是有出外的打算,看财就是财出去了,花钱了,占求财就是要动本求财,先投入自己的本钱赚来的钱。 下面再用歌诀加深理解。 财动利求财,占官定不谐。 家中人出外,身灾并妻妾。 疾病忧难愈,营求喜自来。 财物终有损,职位恐多乖。 财动利求财,这句话我觉得有偏失了,通过上面的讲解,我们知道,发生了财动,占求财的话,是用内财换外财,是动本求财,可以肯定的是财会往外出去。 所以倒数第二句说财物终有损,财一定会有所损失,这是肯定的。 因为是将神财爻主动向外克出去的,财肯定会出去一部分,至少利不利求财,还得看整体的课内情况,这个在以后分类占求财的时候讲。 财动只能说明有求财的象。 我们记忆把这两句口诀时,可以放在一起加深这种印象。

Android开发入门书籍推荐

Android开发入门书籍推荐 Android编程入门教程andbook andbook是我看到的最简单但最好的Android程序开发入门书籍,内容仅有60多页,图文并茂,如果你从来没有接触过Android开发,也完全可以通过阅读此书了解程序开发过程,甚至对APK程序的基本原理和Android UI界面开发有个清晰的认识,相信你花上几个小时读过后,一定会跃跃欲试加入Android开发行列,心动吧,那就行动吧。。。 Android应用开发详解 Android应用开发详解是一本Android应用开发书籍,既适合Android初学者,也适合具备了一定Android开发经验但需要开发案例的高级读者。该书分为三个部分,共18章,由浅入深地详细介绍了Android的每个开发细节。该书基础翔实,实例丰富,案例真实。从基础到案例覆盖了Android应用开发的三大领域:基础应用、网络应用和游戏应用。读者所需要学习的,正是该书描述的。

深入浅出Android–Google手持设备应用程序设计 入门书籍,作者写的很不错,可以在阅读SDK的同时阅读这本书,中间的一些使用介绍的非常清楚,最重要的是中文版的 Google Android应用框架原理与程式设计36技 最早介绍Android的中文书籍,台湾人写的繁体版的,看得有些影响,不过还是值得耐心阅读的 Android A Programmer’s Guide

多个专家写的介绍Android的书籍,内容写的很不错,Ask the Expert部分针对一些问题作了详细的说明 Android Essentials 对Android介绍的比较全面,从安装到开发,应该有新版本了。 Google Android SDK开发范例大全(第2版)

云梦轩金口诀入门教材讲义一

云梦轩  金口诀入门教材讲义  、八 前言 辛苦写的金口诀入门教材讲义,比我期许的差了一点,不过写完第五讲,忽然有点脱虚的感觉,这部教材是我唯一一次从基础从零写起的东西。 希望有志于此道的朋友可以研习。 仅仅五章讲义,已经完全打开了金口诀的入门之径。 剩下就靠大家努力了。 云梦轩金口诀入门教材讲义 编写人孤魂云梦

金口诀的结构有四大组成部分 我们可以把它看成四层楼 如下 人元就是配合地分的天干运用当日的五子遁求来的。 贵神有名天将是运用口诀配合白天黑夜,顺时针或逆时针加临在地支上。

月将用月建六合推测出来的 地分 就是地支在手掌上的固定位置 第一步先学会地分的定位。详细看下图。 第二步推出当月的月将 月将是月建的7K合O 比如这个月为丙申月,月建就是申,而申金的六合是巳。我们可以知道这个月的月将是巳火,如果下个月酉月,则月将是辰。 六合关系

子丑合 寅亥合 卯戌合 辰酉合 巳申合 午未合 合的关系是相互的,我们可以叫午合未,也可以看成未合午后。 F面请看六合图。 当然月将也是是有名字的。只是为了它跟地支做一个区分关系而赋予了名字。 子神后

丑大吉 卯太冲辰天罡巳太乙午胜光未小吉 亥登明

当申月月将是巳的时候,我们可以叫这个月的月将是太乙。 之所以把月将的名字列出来是因为,它们本身赋予了很多信息在内。 第三部月将加时。 预测都会有模拟系统,金口诀运用月将加时而模拟天地之道的运行。月将为天道和地支为地道。 时就是我们所说的时辰,什么时候预测,预测的那一刻当下是什么时辰,然后把当月月将加在时辰上,顺指针旋转从而完成这一步。 我们可以举例比如丙申月在午时问卦 月将申月为巳火太乙做月将问卦的时辰是午时把月将巳加在地分午上即可 月将巳午未申酉戌亥子丑寅卯辰

安卓(Android)游戏以及手机游戏开发的详细步骤

安卓(Android)游戏以及手机游戏开发的详细流程【精华版】 >>首先说游戏设计部门 通常这是如下职位:游戏设计主负责(也有称主策划) 执行游戏设计师(称执行策划):分剧情策划,数据策划,也有不分的,大家一起提高。辅助员(称辅助策划):做一些比较简单的表据维护,资料收集。 工作职责: 游戏设计主负责人:主要负责游戏设计的整体把握、给大家安排工作,审核工作,提高部门人员士气。, 剧情策划一般负责背景,任务等等故事性比较强的,要求文笔要好 数据策划再细分,为规则和数据平衡,包括规则的描述,公式确定,数据表设定等等。 辅助员,主要是收集资料,维护表格等等,比较不涉及核心的工作。 *注:有一些公司或者团队,在策划岗位,还有新的岗位,如: 表现策划:主要负责特效、动作、音效收集并提需求,部分如音效部分亦有策划来完成。资源策划:主要负责UI设计,模型相关配置,资源管理等等。

>>下面是程序部门 主程序与主设计师,是对游戏引擎最了解的人,以主程序为最强。主程的主要工作,安排程序部门工作,定游戏的数据结构,定一些主要方案的完成方法。 一般程序员,分服务器端与客户端、服务器端程序,对于数据库结构,数据传输、通讯方式等等。客户端程序,对图像及优化有研究的会易受重用。 >>美术部门 主美负责整体美术风格的把握 原画绘制原画交于3D 2D负责贴图,游戏界面等的制作 3D负责3D建模,动作等方面工作

>>脚本与编辑器 在具体游戏实现时,越来越多的公司不会说把游戏中的数据写在C++里,而是用“脚本与数据库”的方式。 C++的作用是用来解释脚本和调用数据库的 在脚本中,写上, if { player hp >=30%hpmax add hp=hpmax } 这里的东西是写在脚本里的,C++就会解释,player、hp、hpmax是什么,hp、hpmax 对应数据库是什么列主要的游戏内核是写在C里的,脚本用来实现游戏具体的一些东西。如每个场景、每个NPC、每个道具都有可能有个脚本文件制定命令及数据一般由主程与主设计师一起来做,具体写脚本,一般为游戏设计部门按规范做这个工作。 编辑器:是高于脚本的一个给游戏设计部门或是美术部门用的工作工具优点是使用简单,界面化的东西,可以自动生成脚本。 缺点是,把一些比较活的东西,写死到工具中了,将来要加功能改结构很麻烦 这些都是程序部门的工作 另外,在程序部门中主要交流就是服务器端与客户端的。这实际就是说,一个游戏主体置放与传输的问题。

30简单快速学会金口诀妻动

30简单快速学会金口诀妻动 各位易友你们好,我是吉娘。 我在写关于金口诀预测的系列文章,这是我写的第30篇文章,这是一篇付费文章,一共1700多字。 通过这篇文章你将对妻动有更深的了解,知道断不同的事,遇到妻动会有不同的信息解读。 前面讲的是四位所属图,金口诀断课必须要用到的断课框架。 其实金口诀的内容很简单,主要就是四位框架和生克,这两个内容结合起来断课而已。 我们现在要学的内容就是来跟你讲明白四位框架和生克是怎么综合起来去断课的。 金口诀中的三动五动分别是根据四位框架和生克原理去读出不同的信息来,对于初学者,是快速入门的法宝,一定要细细理解。 三动分别是妻动、官动、鬼动、财动、贼动,三动是父母动、子孙动、兄弟动。先来讲三动中的妻动。 干克方为妻动,也就是人元克地分,为什么人元克地分叫妻动呢?

在金口诀的课式中,人元为天,地分为地,将神与贵神为人和,这样就有了天地人三才的配置。 在古代传统的思想当中,男人是天,女人是地,天去克地,男克女,事关女人,所以叫妻动,在女人方面有动向。 另一个说法是,把人元当为自己,我克者为妻,所以叫妻动。 不管前面两个说法,我们按金口诀上下内外的框架来理解妻动。 人元克地分,就是最上的克最下面的,最外面的克最里面的,用这个思路来理解关于妻动的口诀就可以了。 外克内,上克下,最明显的信息就是对自己很多方面都是不利的,那是外来欺压我的家内,上层来欺压下层。 比如求财那得动老本了,因地分是存款、家才,家里库存的一些财产。 也是外来劫我的财,动到地分了,因为地分是根基,根都动了,事比较大。 而且人元隔着贵神和将神来克地分,肯定要涉及到这二神,所以牵涉的人多,事也比较复杂。 我们可以用妻动的一些口诀来辅助理解上克下,外克内会出现什么情况。 妻动于妻妾,妻动事关我的妻妾,我的妻子和家里人,包括孩子、家里的老人、保姆、工人。

Android游戏与应用开发最佳学习路线图

Android游戏与应用开发最佳学习路线图 为了帮助大家更好的学习Android,并快速入门特此我们为大家制定了以下学习路线图,希望能够帮助大家。 一、路线图概括: 二、具体需要掌握知识点:

三、 具体知识点与目标 Java 三、 具体知识点与目标 Java 基础

Android游戏与应用开发

四、免费在线视频教程 Android教程之Android简介 https://www.360docs.net/doc/1c7714965.html,/zxjc/122.html Android教程之Android-HelloWorld https://www.360docs.net/doc/1c7714965.html,/zxjc/123.html Android教程之Android 应用程序基本原理 https://www.360docs.net/doc/1c7714965.html,/zxjc/124.html Android教程之Android 用户界面布局简介 https://www.360docs.net/doc/1c7714965.html,/zxjc/125.html Android教程之Android 用户界面-选项菜单 https://www.360docs.net/doc/1c7714965.html,/zxjc/126.html

Android教程之Android 用户界面-使用XML文件创建菜单 https://www.360docs.net/doc/1c7714965.html,/zxjc/127.html Android教程之Android 用户界面-上下文菜单 https://www.360docs.net/doc/1c7714965.html,/zxjc/128.html Android教程之Android 用户界面-创建子菜单 https://www.360docs.net/doc/1c7714965.html,/zxjc/129.html Android教程之Android 用户界面-对话框 https://www.360docs.net/doc/1c7714965.html,/zxjc/130.html Android教程之Android 用户界面-其他常见的对话框 https://www.360docs.net/doc/1c7714965.html,/zxjc/131.html Android教程之Android 用户界面Toast https://www.360docs.net/doc/1c7714965.html,/zxjc/132.html Android教程之Android 用户界面-布局管理 https://www.360docs.net/doc/1c7714965.html,/zxjc/133.html Android教程之Android 用户界面-布局管理-相对布局 https://www.360docs.net/doc/1c7714965.html,/zxjc/172.html Android教程之Android 用户界面-表格布局 https://www.360docs.net/doc/1c7714965.html,/zxjc/173.html Android教程之Android 用户界面-表格布局2 https://www.360docs.net/doc/1c7714965.html,/zxjc/174.html Android教程之Android 中的事件处理 https://www.360docs.net/doc/1c7714965.html,/zxjc/175.html Android教程之Android 用户界面-常用组件 https://www.360docs.net/doc/1c7714965.html,/zxjc/176.html Android教程之Android 用户界面-自动完成文本框(AutoCompleteTextView) https://www.360docs.net/doc/1c7714965.html,/zxjc/177.html Android教程之Android 用户界面-ListView

android游戏开发教程

一章概述了Android 的历史,引出了本书其余部分将涉及的概念。现在你可能迫不及 待地想编写代码了。本章首先介绍使用Android SDK 开发应用程序的前提条件,学习安装开发环境。接下来,将逐步演示“Hello World!”应用程序,之后详细分析一个稍大型的应用程序。然后将解释Android 应用程序生命周期,最后简单讨论使用A VD (Android Virtual Devices ,Android 虚拟设备)调试应用程序。 要为Android 开发应用程序,需要JDK (Java SE Development Kit ,Java SE 开发工具包)、Android SDK 和一个开发环境。严格来讲,可以使用简单的文本编辑器开发应用程序,但本书将使用常见的Eclipse IDE 。Android SDK 需要JDK 5或更高版本(我们在示例中使用的是JDK 6)和Eclipse 3.3或更高版本(我们使用的是Eclipse 3.5,也叫Galileo )。本书使用Android SDK 2.0。 最后,为了使开发过程更加简单,需要使用ADT 。ADT 是一个Eclipse 插件,支持使用Eclipse IDE 开发Android 应用程序。实际上,本书中的所有示例都是结合使用Eclipse IDE 和ADT 工具开发的。 上

2.1 安装环境 21 2 2.1 安装环境 要开发Android 应用程序,需要建立一个开发环境。本节将介绍如何下载JDK 6、Eclipse IDE 、Android SDK 和ADT ,以及如何配置Eclipse 来开发Android 应用程序。 Android SDK 兼容Windows (Windows XP 、Windows Vista 和Windows 7)、Mac OS X (仅限英特尔平台)和Linux (仅限英特尔平台)。本章将展示如何为所有这些平台建立环境(对于Linux ,我们仅介绍Ubuntu 版本)。我们不会在其他章讨论与平台差异有关的细节。 2.1.1 下载JDK 6 首先需要的是JDK 。Android SDK 需要JDK 5或更高版本,我们使用JDK 6来开发本书中的示例。对于Windows 来说,从Sun 网站(https://www.360docs.net/doc/1c7714965.html,/javase/downloads/)下载JDK 6并安装。只需要JDK ,不需要其他程序包。对于Mac OS X 来说,从苹果公司网站(http://developer. https://www.360docs.net/doc/1c7714965.html,/java/download/)下载JDK ,选择适用于具体的Mac OS 版本的文件,然后安装。要安装JDK for Linux ,打开一个终端窗口并键入以下命令: sudo apt-get install sun-java6-jdk 这将安装JDK 及任何依赖关系,比如JRE (Java Runtime Environment ,Java 运行时环境)。 接下来,设置JAVA_HOME 环境变量以指向JDK 安装文件夹。在Windows XP 机器上,可以转到“开始”?“我的电脑”,右键单击并选择“属性”,选择“高级”选项卡,然后单击“环境变 量”。单击“新建”添加JAVA_HOME 变量,如果该变量已存在,单击“编辑”修改它。JAVA_HOME 的值类似于C:\Program Files\Java\jdk1.6.0_16。对于Windows Vista 和Windows 7,调出“ 环境变

8简单快速学会金口诀之天干关系

8简单快速学会金口诀之天干关系 各位易友大家好,我是吉娘。 我在写关于金口诀预测的系列文章,这是我写的第八篇文章,它是可以免费阅读的,有部分文章我设置为付费文章,因为有付出才有收获。 金口诀预测跟所有的术数一样,都离不开对天干地支之间的关系解读。 天干和地支之间的关系除了五行所带的生、克关系之外,还有以下几种。 天干之间除了生和克,还有合的关系。 地支之间除了生和克还有六合、三合、冲、破、刑、害、绝这七种关系。 人事纷繁复杂,我们身处其中常常很难理清,但借用这十种关系,就能直观看清。因为易来自生活,这么多的关系正是体现了我们世界的复杂性。 接下来的学习就是抱天干地支的关系好好理清楚。 先来看天干之间的关系。 五行之间的生克我们已经知道了,金生水,水生木,木生火,火生土,土生金。还有金克木,木克土,土克水、水克火,火克金。 所以甲、乙木生丙、丁火,丙、丁火生戊、己土,戊、己土生庚、辛金,庚、辛金生壬、癸水,壬、癸水生甲、乙木。

甲、乙木克戊、己土,丙、丁火克庚、辛金,戊、己土克壬、癸水,庚、辛金克甲、乙木,壬、癸水克戊、己土。 天干在克的关系中,根据异性相吸,同性相斥的道理,还衍生出了相冲和相合的关系。 甲庚相冲、乙辛相冲、壬丙相冲、癸丁相冲。 因为土是生养万物的东西,任何五行来到它这里,它都接纳,所以戊、己土没有与它相冲的五行。 相冲的力量最大、最快速,能使事态急速转变。 如果占夫妻关系的话,天干相冲,他们会很容易一言不和就谈离婚,在一块也是噼里啪啦的吵架。 天干五合的有:甲己合、乙庚合、丙辛合、丁壬合、壬癸合。 相合的力量长久而缓慢,在消无声息中发生变化。 根据两个天干性质的不同,每个五合的性质也是不同的。 甲己是中正之合,甲阳木品质仁义,己阴土镇静淳笃,就像两位品德高尚的人一起为人类发展事业一起奋斗团结。 乙庚是仁义之合,乙阴木性仁质柔,庚阳金坚强不屈,它俩结合是刚柔并济,仁义廉资。

android游戏开发入门: 贪吃蛇 源代码分析

android游戏开发入门:贪吃蛇源代码分析 贪吃蛇是一款足够经典的游戏。它的经典,在于用户操作的简单,在于技术实现的简介,在于他的经久不衰。这里的贪吃蛇的android实现,是SDK Samples中的开源例程。可能各位都有看过~界面如下图啦~ 作为一个刚入门或者还没入门的新手,着实花了我一些力气来理解这段代码。对于各种不懂的地方,慢慢查询资料,对于新的方法,通过修改代码尝试效果。到现在终于能算个一知半解。在代码中,对于自己有所收获的地方,我都做了相应的注释。回过头来,觉得从这段代码中,能学到不少东西~~包括android应用的基本架构,他的面向对象的思想,以及代码的简洁明了。于是,我想到,何不将这些东西分享出来,如果碰巧对感兴趣的朋友们有搜帮助,那就更好了~好了,闲话不说~代码和注释如下(处于对源码的敬意,原本 的英文注释部分都没有删去~大家可以配合理解):PS:最近我正在写自己的“贪吃蛇”,说事贪吃蛇,其实完全颠覆了这 个经典版本的设计理念和操作方式。具体细节先卖一个关子,作品准备参加这次第二届大学生android应用开发大赛。应该一个月内能完成,到时候也会开源出代码来~欢迎大家讨 论指 正·~*************************************************************

****************************************************************** *****Snake工程中,总共有三个文件:*TileView是基于Android的View类实现的方块图类,用来支撑上层类的调用,绘制方块图的显示界面。通过这些代码,能打之了解如何扩展View,实现特色的界面效果。*SnakeView调用了TileView,实现了游戏逻辑和具体的显示。*Snake为主Activity类。建议大家按照上面的顺序看三个文件,可能逻辑上更舒服一点~~下面贴上代码和注释。PS: 调试版本为android2.2。其他版本应该也没问题吧,不过得用虚拟机。因为它是上下左右按键操作,现在大多数android机是没有方向键的吧。TileView.javapackage com.example.android.snake;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.View;/** * TileView: a View-variant designed for handling arrays of 'icons' or other * drawables. * */public class TileView extends View { /** * Parameters controlling the

【原创】金口诀拨雾篇

【原创】金口诀拨雾篇 金口诀拨雾篇 ——论金口诀纵断法的入手 玉函(kai_y) 易学心得分享 2016.4.23 序 所谓拨雾,指现在流行的主流金口诀解断法写的并不是很清

楚,看它的人会感觉如在雾中,看着明白,用起来就觉的晕乎乎的。 我曾经写过《金口诀纵横论》一文,一直也潜心于纵断法,时间一长我发现要完成纵断法,在断法的入手处,我们现在大部人已经吃亏了,走入了一些弯道,虽然对横断法没什么影响,但要想达到纵断,这些弯道不纠正是难以达到纵断法的,因为要改变现在的解断思维才可能达到纵断的程度,于是便有了本文。 本文的重点在于阐述因事而择,因人而异的解课观点,以及纠以往断课中,对于动用这两个内容的误解。 学习金口的绝大部分人都是以用爻为入手,以四象所属定位取象为技巧,结合五动,神煞。这种解课方法对于刚入门者来说确实有一定的帮助,也是主流金口界一直以来传授的,可以帮助新人快速的掌握这门数术的运用方法,那它是否就是唯一呢?我觉的并不是,当然它可以是初期学习金口解断的一种选择。 本文要介绍的是已经掌握这种解课方法,希望接下来深入研究解课,应该从哪下手的问题,又或者说谈一谈我自己在经

过了那个阶段后选择了哪些改变。 介绍现有非常规解法 其实在很早的时候就有易友朝着这个方向在前进了,下面介绍我了解到的几种解法: 1、李怀珠的解课方法,他最早期的课例都是他自己思考的,解的过程是以地分开始,以人元作为结束,整个过程主要以相临两个五行生克结合事情来解断。当然,这种解法也不是没有理论支持,在《六壬金口诀指玄》一书中有‘地分章’一节,主要论述地分的重要作用,地分与日的关系就是六壬的先锋门,所以李从地分开始入手也不是不可以接受。 2、未道的解法以七格为体(包括分合局格,刑狱格,关格锁格,三刑格,顺向生克格,连茹格,四绝格)这七种课格结合三动五动入手,然后看用神旺衰(这里的用神非用爻),结合二十七种神煞,组成解课三大要素。这也算是未道前辈

初学者对Android开发的认识

初学者对Android开发的认识 Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续进行对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。 2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的

手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:华为、中兴、联想等。 随着采用Android系统的谷歌手机、平板电脑等产品逐渐扩大市场占有率,Android 平台人才的缺口日益显现。据业内统计,目前国内的3G研发人才缺口有三、四百万,其中Android研发人才缺口至少30万。 Android开发人才占总需求的72%。 职场专家指出,想要从事Android开发的人员,除了基础的计算机技术知识要扎实之外,要根据各类企业、各类岗位的不同需求,补充与岗位相关的Android技术知识。此外,还要注重项目经验的积累。 据职酷网数据统计显示:目前热招的Android技术相关岗位约有3882个,而一个月内的有效岗位量在2298个。主要热招职位包括Android开发工程师、Android软件工程师、Android应用开发工程师、系统驱动工程师,Android手机游戏开发、Android系统软件开发、Android程序员、Android游戏应用版本管理、人机交互分析工程师、Android 中间层开发工程师等。 从人才需求类型来看,目前对Android人才需求一类是偏向硬件驱动的Android人才需求,一类是偏向软件应用的Android人才需求。从目前的招聘需求来看,后者的需求最大,包括手机游戏、手机终端应用软件和其他手机应用软件的开发。据职酷网职位搜索库统计显示,目前企业对这类应用软件的Android开发人才占总需求的72%。 职业专家分析说,由于目前Android技术较新,无论是相关书籍、培训还是大学教育,都处于初级阶段,因此Android人才短期将供不应求。从长期来看,随着各种移动应用和手机游戏等内容需求日益增加,也将激励大中小型手机应用开发商加大对Android应用的开发力度,因此Android人才的就业前景也非常广泛。 做Android开发要培养沟通交流能力、以及团队协作能力和项目经验的积累,“项目是

5简单快速学会金口诀之阴阳变化趋势

5简单快速学会金口诀之阴阳变化趋势 各位易友大家好,我是吉娘。 我在写关于金口诀预测的系列文章,这是我写的第五篇文章,它是可以免费阅读的,有部分文章我设置为付费文章,因为有付出才有收获。 这次要讲的内容是把太极图装在金口诀四位中来看看有什么妙用。 金口诀定用爻有这样一段话的描述: 三阳一阴,以阴为用,主事在男。事情在在向正面的方向发展,前途光明。四位配合再好,就无往不胜。 三阴一阳,以阳为用。主事在女,事物向反方向发展,前途不明,配合再不好,就往往一败涂地。 二阴二阳,以将为用,事情还不太明朗化,问事情男女不明,吉凶不定。 纯阴反阳,以将为用,主事体由隐秘开始向公开化发展。比如种子破出而出,问事体由女子转向男子或由男子转向女子。事情开始向有利的因素发展,做事不可操之过急。 纯阳反阴,以神为用。四位纯阳,阳气过盛,旺极转衰,事体开始走向它的反面,不利因素开始增加,事体开始过渡,由男转女,或由女转男。此时做事且速不易迟,趁风头还好,自己还处在绝对优势,应好好把握机遇,不要错过机会,因好运很快要用完了。

虽然这段文字描述讲得很详细,但很多人不知道这里面的含意,也不知道怎么用,所以都选择忽略这些内容。 其实只要把太极图装在四位上就完全明白它为什么这样说了。 从这张图看,这个太极是按顺时针转的。我们把它按图划分成四等份,分出四象,分别是少阳、少阴、太阳、太阴。 再来看看定用爻的口诀: 三阴一阳,以阳为用, 三阳一阴,以阴为用, 二阴二阳,以将为用; 纯阴反阳,以将为用; 纯阳反阴,以神为用. 你会发现这个口诀跟太极图的关系了。 三阴一阳是在太极图少阴的区域, 三阳一阴是在少阳的区域, 二阴二阴是太极图处于阴阳平衡时用爻在阴阳鱼曲线相交的位置。 纯阴反阳是在太极图太阴的位置,

相关文档
最新文档