在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → Angle v1.0_2D游戏引擎

Angle v1.0_2D游戏引擎

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.27M
  • 下载次数:7
  • 浏览次数:243
  • 发布时间:2015-09-10
  • 实例类别:Android平台开发
  • 发 布 人:crazycode
  • 文件格式:.ZIP
  • 所需积分:2
 相关标签: 游戏 引擎

实例介绍

【实例简介】
【实例截图】

【核心代码】

package com.android.game;

import android.graphics.Typeface;
import android.view.MotionEvent;

import com.android.angle.AngleActivity;
import com.android.angle.AngleFont;
import com.android.angle.AngleObject;
import com.android.angle.AngleSound;
import com.android.angle.AngleSprite;
import com.android.angle.AngleSpriteLayout;
import com.android.angle.AngleString;
import com.android.angle.AngleUI;
import com.android.angle.AngleVector;

/** 
* @author Ivan Pajuelo
*/
public class GameUI extends AngleUI
{
	private static final float sSightSpeed = 5;
	public Field mField;
	private Sight mSight;
	private AngleObject ogDashboard;
	private AngleSprite sprTrackPad;
	private AngleVector mAim;
	private AngleVector mTrackPadPos;
	private AngleVector mTrackPadDelta;
	private AngleString strScore;
	private AngleString strLifes;
	public AngleSpriteLayout slGround;
	public AngleSpriteLayout slSmiley;
	public AngleSpriteLayout slSight;
	private AngleSound sndMachineGun;
	public int mScore;
	private int mLifes;
	private boolean mInverted;
	
	//STEP 15
	//This is the entry point
	//Here we initialize all the variables that need when this UI is just activated
	//>PASO 15:
	//>Este ser?el punto de entrada
	//>Aqu?inicializaremos todas la variables que necesitemos cuando se acabe de activar esta UI
	@Override
	public void onActivate()
	{
		mLifes=3;
		mScore=0;
		strLifes.set("" mLifes);
		strScore.set("" mScore);
		super.onActivate();
	}

	public GameUI(AngleActivity activity)
	{
		super(activity);
		
		//STEP 16:
		//We created all the SpriteLayouts that we will need 
		//>PASO 16:
		//>Creamos todos los SpriteLayouts que vayamos a necesitar
		slGround=new AngleSpriteLayout(mActivity.mGLSurfaceView,com.android.tutorial.R.drawable.fondo);
		slSmiley=new AngleSpriteLayout(mActivity.mGLSurfaceView,32,45,com.android.tutorial.R.drawable.salto,0,0,32,45,8,8); 
		slSight=new AngleSpriteLayout(mActivity.mGLSurfaceView,32,32,com.android.tutorial.R.drawable.mira,0,0,32,32,2,2);

		//STEP 17:
		//Create and load a sound effect		
		//>PASO 17:
		//>Creamos y cargamos un efecto de sonido
		sndMachineGun=new AngleSound(mActivity,com.android.tutorial.R.raw.machinegun);
		
		//STEP 18:
		//Create a font for the dashboard strings		
		//>PASO 18:
		//>Creamos una fuente para los marcadores
		AngleFont fntBazaronite=new AngleFont(mActivity.mGLSurfaceView, 18, Typeface.createFromAsset(mActivity.getAssets(),"bazaronite.ttf"), 222, 0, 2, 255, 100, 255, 255);

		//STEP 19:
		//Create the game objects
		//Here we use the quick insertion form
		//>PASO 19:
		//>Creaci髇 de los objetos de juego
		//>Aqu?usamos la forma de inserci髇 r醦ida

		//For the battlefield,
		//>Para el campo de batalla,
		mField=(Field)addObject(new Field(this));
		//The sight
		//>El punto de mira
		mSight=(Sight)addObject(new Sight(this));
		//And a group for dashboard and other floating things
		//>y un grupo para marcadores y dem醩 cosas flotantes
		ogDashboard=addObject(new AngleObject());
		sprTrackPad=(AngleSprite) ogDashboard.addObject(new AngleSprite(160,380,new AngleSpriteLayout(mActivity.mGLSurfaceView,320,200,com.android.tutorial.R.drawable.panel)));

		//STEP 20:
		//Add the 2 dashboard strings
		//>PASO 20:
		//>Insertamos los 2 Strings de los marcadores
		strScore = (AngleString) ogDashboard.addObject(new AngleString(fntBazaronite, "0", 310, 30, AngleString.aRight));
		strLifes = (AngleString) ogDashboard.addObject(new AngleString(fntBazaronite, "0", 60, 30, AngleString.aRight));
		
		//STEP 21:
		//Create some vectors to store bidimensional values
		//>PASO 21:
		//>Creamos unos vectores para guardar varios valores bidimensionales
		mAim=new AngleVector();
		mTrackPadPos=new AngleVector();
		mTrackPadDelta=new AngleVector();
		
		//Esta variable indica si el control est?invertido
		mInverted=false;
	}

	//Step 22:
	//Create a function for the game logic.
	//This function will be called every time you paint the screen and get as parameter
	//the number of seconds that have elapsed since the last time you called it.
	//Calling super.step, the step function of all children is called
	//In this case, the field of battle, the sight and dashboard
	//In this step by step, I will not comment on the game logic. Only the parts of
	//the engine itself.
	//>Paso 22:
	//>Creamos una funci髇 para la l骻ica del juego.
	//>Esta funci髇 ser?llamada cada vez que se pinte la pantalla y recibe como par醡etro
	//>la cantidad de segundos que han pasado desde la 鷏tima vez que se la llam?
	//>Al llamar a super.step, hacemos que se llame a la funci髇 step de todos los hijos que 
	//>tenga este objeto por debajo. En este caso, el campo de batalla, la mirilla y los marcadores
	//>En este paso a paso, no voy a comentar la l骻ica del juego. S髄o las partes que correspondan 
	//>al motor en si.
	@Override
	public void step(float secondsElapsed)
	{
		super.step(secondsElapsed);
		mSight.moveTo(mTrackPadPos);
		mTrackPadDelta.set(mTrackPadPos);
		mTrackPadDelta.mul(sSightSpeed*secondsElapsed);
		mAim.add(mTrackPadDelta);
		if (mAim.mX>1)
			mAim.mX=1;
		if (mAim.mX<-1)
			mAim.mX=-1;
		if (mAim.mY>1)
			mAim.mY=1;
		if (mAim.mY<-1)
			mAim.mY=-1;
		mField.moveTo(mAim);
	}

	//Step 23:
	//Overload the onTouchEvent event to handle when the 
	//player touchs the screen.
	//Also we can overload any other events such as onKeyDown or onTrackballEvent to
	//respond to different input methods.
	//>Paso 23:
	//>Sobrecargamos el evento onTouchEvent para responder a las pulsaciones que haga
	//>el jugador en la pantalla.
	//>Tambi閚 podemos sobrecargar otros eventos como onKeyDown y onTrackballEvent para 
	//>responder a distintos m閠odos de entrada.
	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		//Prevent event flooding
		//>Impedimos que el sistema sea sobrecargado por eventos de touch
		//>M醲imo 60 por segundo
		try
		{
			Thread.sleep(16);
		} catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		// -------------------------
		float eX=event.getX();
		float eY=event.getY();
		if (event.getAction()==MotionEvent.ACTION_DOWN)
		{
			if (eX>sprTrackPad.mPosition.mX-sprTrackPad.roLayout.roWidth/2)
				if (eY>sprTrackPad.mPosition.mY-sprTrackPad.roLayout.roHeight/2)
					if (eX<sprTrackPad.mPosition.mX sprTrackPad.roLayout.roWidth/2)
						if (eY<sprTrackPad.mPosition.mY sprTrackPad.roLayout.roHeight/2)
						{
							//STEP 24:
							//Play a sound effect in an infinite loop with volume at 1005(1)
							//>PASO 24:
							//>Aqu?vemos como reproducir un sonido con volumen al 100%(1) y en un bucle infinito
							sndMachineGun.play(1,true);
							mSight.fire(true);
						}
		}
		else if (event.getAction()==MotionEvent.ACTION_UP)
		{
			//STEP 25:
			//Stop the sound playing
			//>PASO 25:
			//>Detenemos la reproducci髇 del sonido
			sndMachineGun.stop();
			mSight.fire(false);
			mTrackPadPos.set(0,0);
		}
		else if (event.getAction()==MotionEvent.ACTION_MOVE)
		{
			if (eX>sprTrackPad.mPosition.mX-sprTrackPad.roLayout.roWidth/2)
				if (eY>sprTrackPad.mPosition.mY-sprTrackPad.roLayout.roHeight/2)
					if (eX<sprTrackPad.mPosition.mX sprTrackPad.roLayout.roWidth/2)
						if (eY<sprTrackPad.mPosition.mY sprTrackPad.roLayout.roHeight/2)
						{
							if (mInverted)
								mTrackPadPos.set(-(eX-sprTrackPad.mPosition.mX)/(sprTrackPad.roLayout.roWidth/2),-(eY-sprTrackPad.mPosition.mY)/(sprTrackPad.roLayout.roHeight/2));
							else
								mTrackPadPos.set((eX-sprTrackPad.mPosition.mX)/(sprTrackPad.roLayout.roWidth/2),(eY-sprTrackPad.mPosition.mY)/(sprTrackPad.roLayout.roHeight/2));
						}
		}
		return true;
	}

	//STEP 26:
	//This callback updates the number of remaining lives, also see how to return to the menu
	//setting its UI	
	//>PASO 26:
	//>En este callback para actualizar la cantidad de vidas restantes, vemos como volver al men?
	//>estableciendo su UI
	public void updateLifes(int lifes)
	{
		mLifes =lifes;
		if (mLifes<0)
			((StepByStepGame) mActivity).setUI(((StepByStepGame) mActivity).mTheMenu);
		strLifes.set("" mLifes);
	}

	public void updateScore(int score)
	{
		mScore =score;
		strScore.set("" mScore);
	}

	//STEP 27:
	//Overload the onDeactivate event to empty the smileys' list and stop the sound
	//if it is playing
	//>PASO 27:
	//>Sobrecargamos el evento onDeactivate para vaciar la lista de smileys y parar el sonido
	//>si est?sonando
	@Override
	public void onDeactivate()
	{
		sndMachineGun.stop();
		for (int s=1;s<mField.count();s  )
			mField.childAt(s).mDie=true;
		super.onDeactivate();
	}

	///Continues in FIeld)
	//(continua en Field)
}

标签: 游戏 引擎

实例下载地址

Angle v1.0_2D游戏引擎

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警