`
weihe6666
  • 浏览: 439118 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android PlayGame

阅读更多
PushBox

这里介绍一款经典小游戏:PushBox,共分四部分介绍。在编写代码之前,应先设计游戏的框架,了解各个类之间的关系,游戏的流程,前期的准备是做出游戏的必备条件。
  • 欢迎动画界面的设计与实现


当玩家运行游戏时,首先看到的是欢迎界面,欢迎界面是整个游戏的门面,良好的欢迎界面会增加玩家对游戏的视觉体验。下面将开始对欢迎动画界面的开发进行介绍。


[1].PushBoxActivity类框架的搭建
public class PushBoxActivity extends Activity{  //主类 
	WelcomeView welcomeView = null;//欢迎界面
	WelcomeViewGoThread welcomeViewGoThread = null;//欢迎界面中的移动线程
	MenuView menuView = null;
	MenuViewGoThread menuViewGoThread = null;//菜单界面中的移动线程
	GameView gameView = null;
	
	boolean isSound = true;//是否播放声音
	MediaPlayer pushBoxSound;//推箱子声音
	MediaPlayer backSound;//背景音乐
	MediaPlayer winSound;//胜利的音乐
	MediaPlayer startSound;//开始和菜单时的音乐
	
	int map1[][];
	int map2[][];//当前游戏的地图
	int selectMap = 0;//选中的地图
	
	MySprite mySprite;//精灵
	
	KeyThread kt;//键盘监听线程
	int action = 0;//键盘的状态,二进制表示 从左往右表示上下左右
	
	Handler myHandler = new Handler(){//用来更新UI线程中的控件
        public void handleMessage(Message msg) {
        	if(msg.what == 1){//收到WelcomeViewGoThread/Welcome发来的消息    有各个Thread发来msg
        		welcomeViewGoThread.setFlag(false);
        		if(welcomeView != null){
        			welcomeView = null;  
        		}
        		initAndToMenuView();
        	}
        	else if(msg.what == 2){//收到MenuView发来的消息
        		if(menuView != null){
        			menuView = null;  
        		}
        		initAndToGameView();
        	}   
        	else if(msg.what == 3){
        		if(gameView != null){
        			gameView = null;  
        		}
        		initAndToMenuView();
        	}   
        	else if(msg.what == 4){//收到GameView来的消息,进入下一关
    			if(selectMap+1<MapList.map1.length){
    				selectMap = selectMap+1;
    				initAndToGameView();
    			}
    			else {
    				selectMap = 0;
    				initAndToGameView();
    			}
        	}
        }
	}; 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
		//全屏
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,  
		              WindowManager.LayoutParams.FLAG_FULLSCREEN);
		
        pushBoxSound = MediaPlayer.create(this, R.raw.sound2);//推箱子的声音
        winSound = MediaPlayer.create(this, R.raw.winsound);//胜利的声音
        backSound  = MediaPlayer.create(this, R.raw.sound1);//背景音乐
        backSound.setLooping(true); //设置循环
        startSound = MediaPlayer.create(this, R.raw.sound3);
        startSound.setLooping(true);
		initAndToWelcomeView();
    }
    
    public void initAndToWelcomeView(){
    	welcomeView = new WelcomeView(this);
        if(isSound){
        	startSound.start();
        }
    	this.setContentView(welcomeView);
    	welcomeViewGoThread = new WelcomeViewGoThread(this);
    	welcomeViewGoThread.start();
    }
    
    public void initAndToMenuView(){
    	menuView = new MenuView(this);
    	this.setContentView(menuView);
    	menuViewGoThread = new MenuViewGoThread(this);
    	menuViewGoThread.start();
    }
    
    public void initAndToGameView(){
		map1 = new int[MapList.map1[selectMap].length][MapList.map1[selectMap][0].length];
		for(int i=0; i<MapList.map1[selectMap].length; i++){
			for(int j=0; j<MapList.map1[selectMap][i].length; j++){
				map1[i][j] = MapList.map1[selectMap][i][j];//初始化第一层
			}
		}
		map2 = new int[MapList.map2[selectMap].length][MapList.map2[selectMap][0].length];
		for(int i=0; i<MapList.map2[selectMap].length; i++){
			for(int j=0; j<MapList.map2[selectMap][i].length; j++){
				map2[i][j] = MapList.map2[selectMap][i][j];//初始化第二层
			}
		}    	
    	gameView = new GameView(this);
    	mySprite = new MySprite(this);
        kt = new KeyThread(this);//添加键盘监听
        kt.start();
		if(isSound){
			backSound.start();//播放声音
		}
    	this.setContentView(gameView);
    }
    
	public boolean onKeyUp(int keyCode, KeyEvent event) {//键盘抬起
    	if(keyCode == 19){//上
    		action = action & 0x37;
    	}
    	if(keyCode == 20){//下
    		action = action & 0x3B;
    	}    	
    	if(keyCode == 21){//左
    		action = action & 0x3D;
    	}    	
    	if(keyCode == 22){//右
    		action = action & 0x3E;
    	}
		return false;
	}
    
    public boolean onKeyDown(int keyCode, KeyEvent event){//键盘按下监听
    	if(keyCode == 19){//上
    		action = action | 0x08;
    	}
    	if(keyCode == 20){//下
    		action = action | 0x04;
    	}    	
    	if(keyCode == 21){//左
    		action = action | 0x02;
    	}    	
    	if(keyCode == 22){//右
    		action = action | 0x01;
    	}
		return false;
    }	
}


PushBoxActivity作为各个部分之间跳转的桥梁,承担找纽带作用。

这个类中Handler方法起到接受各个类的消息,并作出相应的动作。
Handler myHandler = new Handler(){//用来更新UI线程中的控件
        public void handleMessage(Message msg) {
        	if(msg.what == 1){//收到WelcomeViewGoThread/Welcome发来的消息    有各个Thread发来msg
        		welcomeViewGoThread.setFlag(false);
        		if(welcomeView != null){
        			welcomeView = null;  
        		}
        		initAndToMenuView();
        	}
        	else if(msg.what == 2){//收到MenuView发来的消息
        		if(menuView != null){
        			menuView = null;  
        		}
        		initAndToGameView();
        	}   
        	else if(msg.what == 3){
        		if(gameView != null){
        			gameView = null;  
        		}
        		initAndToMenuView();
        	}   
        	else if(msg.what == 4){//收到GameView来的消息,进入下一关
    			if(selectMap+1<MapList.map1.length){
    				selectMap = selectMap+1;
    				initAndToGameView();
    			}
    			else {
    				selectMap = 0;
    				initAndToGameView();
    			}
        	}
        }
	}; 


当Welcome动作完成之后,相应的会发出一个Message,比如:       
if(msg.what == 1){//收到WelcomeViewGoThread/Welcome发来的消息    有各个Thread发来msg
        welcomeViewGoThread.setFlag(false);
        if(welcomeView != null){
        welcomeView = null; 
        }
        initAndToMenuView();
        }
受到这个消息后,进入初始化菜单的界面initAndToMenuView()。

[2].WelcomeView
public class WelcomeView extends SurfaceView implements SurfaceHolder.Callback, OnClickListener{
	PushBoxActivity pushBoxActivity;
	WelcomeViewDrawThread welcomeViewDrawThread = null;
	Bitmap bitmap;
	Bitmap wallLeft;//左面的墙
	Bitmap wallRight;//右面的墙
	Bitmap iron;//铁门
	Bitmap woodLeft;//左面的木门
	Bitmap woodRight;//右面的木门
	Bitmap background;
	Bitmap mountain;//背景的山
	
	int wallLeftX = 15;//墙的坐标
	int wallLeftY = 10;
	int wallRightX = 150;
	int wallRightY = 10;

	int ironX = 15;//铁门的坐标
	int ironY = 10;
	
	int woodLeftX = 15;//木门的坐标
	int woodLeftY = 10;
	int woodRightX = 150;
	int woodRightY = 10; 		
	public WelcomeView(PushBoxActivity pushBoxActivity) {//构造器
		super(pushBoxActivity);
		this.pushBoxActivity = pushBoxActivity;
		getHolder().addCallback(this);
		welcomeViewDrawThread = new WelcomeViewDrawThread(this,getHolder());
		wallRight = BitmapFactory.decodeResource(getResources(), R.drawable.wallright);
		wallLeft = BitmapFactory.decodeResource(getResources(), R.drawable.wallleft); 
		bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image4);
		iron = BitmapFactory.decodeResource(getResources(), R.drawable.image2);
		woodLeft = BitmapFactory.decodeResource(getResources(), R.drawable.image33);
		woodRight = BitmapFactory.decodeResource(getResources(), R.drawable.image3);
		background = BitmapFactory.decodeResource(getResources(), R.drawable.background);//背景的水
		mountain = BitmapFactory.decodeResource(getResources(), R.drawable.mountain2);		
	}
	protected void onDraw(Canvas canvas) {
		canvas.drawColor(Color.WHITE);//背景白色
		canvas.drawBitmap(background, 0, 0, new Paint());//绘制背景
		canvas.drawBitmap(mountain, 0, 0, new Paint());//后面的山图片
		canvas.drawBitmap(wallLeft, wallLeftX, wallLeftY,new Paint());//墙的左面
		canvas.drawBitmap(wallRight, wallRightX, wallRightY,new Paint());//墙的右面
		canvas.drawBitmap(iron, ironX, ironY,new Paint());//铁门
		canvas.drawBitmap(woodLeft, woodLeftX, woodLeftY,new Paint());//木头门左面
		canvas.drawBitmap(woodRight, woodRightX, woodRightY,new Paint());//木头门右面
		canvas.drawBitmap(bitmap, 0, 0, new Paint());
		this.setOnClickListener(this);
	}	
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
	}
	public void surfaceCreated(SurfaceHolder holder) {
		welcomeViewDrawThread.setFlag(true);
		welcomeViewDrawThread.start();//启动刷帧线程
	}
	public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        welcomeViewDrawThread.setFlag(false);//停止刷帧线程
        while (retry) {
            try {
            	welcomeViewDrawThread.join();//等待刷帧线程结束
                retry = false;
            } 
            catch (InterruptedException e) {//不断地循环,直到等待的线程结束
            }
        }
	}
	public void onClick(View v) {
		pushBoxActivity.myHandler.sendEmptyMessage(1);
	}	
}

这个类主要对View初始化,
分享到:
评论

相关推荐

    Android游戏中加入Google play game排行榜与成就榜

    国内Google play game service排行榜的例子很少,所以我上传这个例子供Cocos2d-x、Android、Unity3D、Libgdx、Android Studio等开发者参考。 打开项目时,要先配置好Google play game service的框架。 总的来说...

    Mastering.Android.Game.Development.1783551771

    Master game development with the Android SDK to develop highly interactive and amazing games About This Book Develop complex Android games from scratch Learn the internals of a game engine by ...

    Google Play Game ServiceDemo

    这个Demo包含了多种功能的实现,例如玩家登录、成就解锁、排行榜展示以及多人游戏等功能,旨在帮助开发者更好地理解和实践Google Play Game Service的API。 Google Play 游戏服务是Google为移动游戏开发者提供的一...

    Beginning Android C++ Game Development

    making games and the considerations involved in designing games which people will want to play. Sometimes the best way to develop this knowledge is to begin at the very beginning, so we’ll look at ...

    cocos2dx 3.x 加入google play game 排行榜demo

    3. **添加依赖库**:在Cocos2dx项目中,你需要导入Google Play Game Services的Android SDK。这通常通过在`build.gradle`文件中添加依赖项来完成,确保应用在运行时能够访问所需的库。 4. **初始化服务**:在Cocos2...

    flash for android avoider game

    本篇文章将深入探讨如何使用Flash技术来创建适用于Android平台的游戏,即所谓的"flash for android avoider game"。Flash作为一款强大的多媒体创作工具,曾广泛应用于网页动画和游戏制作。随着移动设备的普及,Flash...

    Mastering Android Game Development with Unity

    Finally you will polish your game with stats, sounds, and Social Networking, followed by testing the game on Android devices and then publishing it on Google Play, Amazon, and OUYA Stores. ...

    Learning.Unreal.Engine.Android.Game.Development

    Once you've created the game, you will learn how to port and publish your game to the Google Play Store. In addition to building an Android game from start to finish, you will also discover how to ...

    Android NDK Game Development Cookbook 无水印pdf 0分

    For C++ developers, this is the book that can swiftly propel you into the potentially profitable world of Android games. The 70+ step-by-step recipes using Android NDK will give you the wide-ranging ...

    beginning_android_game源码和pdf版书本

    8. **游戏引擎**:附带的"Android game engines.txt"可能涉及到游戏引擎的使用,如Cocos2d-x或Unity。这些引擎可以简化游戏开发,提供预设的物理系统、动画工具和资源管理,让开发者更专注于游戏内容的创作。 9. **...

    Learning Unreal Engine Android Game Development

    最后,本书将介绍如何打包和发布Android游戏,包括设置Android签名、构建APK文件以及通过Google Play或其他分发渠道进行部署。读者还将了解到版本控制的重要性,如使用Git来管理和协同开发项目。 总的来说,《学习...

    processing-google-play-game-services-sample:Processing-Android with Google Play Game Services Sample

    Processing-Android with Google Play Game Services Sample 如何运行样本 看: 雅: 在 Google Developer Console 上注册您的项目 创建排行榜和成就 修改res/values/ids.xml,列出2中得到的ID。 修改 project....

    Android-Game-master (2).zip

    这个名为"Android-Game-master (2).zip"的压缩包可能包含了一个完整的Android游戏项目,供学习者研究和参考。以下是围绕Android游戏开发的一些核心知识点: 1. **Android Studio**: Android游戏开发的基础是使用...

    paopaolong.zip_android_game_zip

    《泡泡龙克隆版》是一款基于Android平台的解谜...总的来说,"paopaolong.zip_android_game_zip"揭示了Android游戏开发的一个侧面,包括了游戏的设计、开发、测试、修复和发布等过程,涉及到的技术和知识广泛且深入。

    AndroidGame初学者游戏开发框架

    "AndroidGame初学者游戏开发框架"这个主题旨在引导新手开发者快速入门,理解并掌握Android游戏开发的基本流程和技术栈。以下是对这个主题的详细阐述: 一、Android游戏开发基础 Android游戏开发主要是基于Java或...

    Game2048Android小游戏

    在Android平台上发布游戏,开发者需要将应用上传到Google Play Store,遵循其提交指南和政策。同时,通过社交媒体、广告推广等方式吸引用户下载。对于《Game2048》这样的小游戏,口碑传播和用户评价也是获取新用户的...

    KLSD.zip_android_game

    此外,项目还涉及版本控制、测试和打包发布,了解APK的签名过程,以及如何将游戏上传到Google Play Store或其他分发平台。 通过"KLSD.zip"项目,开发者不仅能学习到Android游戏的基本架构,还能深入理解游戏开发的...

    Learning Android Game Programming

    "Learning Android Game Programming"是一本专为初学者设计的教程,旨在帮助读者掌握Android游戏开发的基础知识。这本书可能涵盖了以下核心知识点: 1. **Android基础知识**:首先,学习者需要了解Android操作系统...

    Learning.Android.Game.Programming源代码(15章)

    《Learning.Android.Game.Programming》是一本专为Android游戏开发爱好者和专业人员编写的教程书籍,其源代码提供了15章的实践项目,帮助读者深入理解Android游戏编程的各个环节。本书覆盖了从基础到进阶的各种游戏...

Global site tag (gtag.js) - Google Analytics