`

如何构建自己的游戏框架并且制作游戏(二)(附源码)

阅读更多

原文地址:http://www.cnblogs.com/feifei1010/archive/2012/08/24/2653768.html

 

现在我们进行第二篇教学,有了框架我们可以自由地在屏幕上绘制我们想要的东西了。背景是用的 BackGround组件 ,人物和子弹,还有精灵都是用的 Sprite精灵组件

 

GameActivity类,游戏的主Activity类,在这里继承基类,只需要将界面替换为GameView就可以了。

?
package com.mocn.airBottle;
 
import android.R;
import android.os.Bundle;
 
import com.mocn.framework.BaseActivity;
import com.mocn.framework.BaseView;
 
/**
  * 游戏的Activity类
  *
  * @author Administrator
  *
  */
public class PlaneGameActivity extends BaseActivity {
 
         public BaseView baseView; // 引用BaseView
 
         public GameView gameView; // 引用GameView
 
         @Override
         public void onCreate(Bundle savedInstanceState) {
                 super .onCreate(savedInstanceState);
                 baseView = new GameView( this ); // 得到baseView对象
                 setContentView(baseView);; // 设置显示界面为baseView
         }
}

  GameView类,游戏的主界面绘制类,在这里我们要绘制飞机和敌军,判断检测子弹和敌军的碰撞事件

?
package com.mocn.airBottle;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
 
import com.mocn.framework.BackGroundLayer;
import com.mocn.framework.BaseView;
import com.mocn.framework.Utils;
 
public class GameView extends BaseView implements OnTouchListener {
         BackGroundLayer backLayer; // 背景组件
         Plane plane; // 飞机类
         public boolean pressPlane = false ;
 
         public GameView(Context context) {
                 super (context);
                 setOnTouchListener( this );
                 // 绘制背景
                 backLayer = new BackGroundLayer(Utils.getBitmap( "game/bg.png" ), 800 ,
                                 480 );
                 backLayer.setPosition( 0 , 0 );
 
                 // 绘制飞机
                 plane = new Plane(Utils.getBitmap( "game/plane.png" ), 150 , 179 );
                 plane.setPosition( 40 , 300 );
 
         }
 
         @Override
         public void drawSurfaceView(Canvas canvas, Paint paint) {
                 super .drawSurfaceView(canvas, paint);
                 GameData.bulletsAndEnemy(); // 判断子弹和敌军的碰撞
                 GameData.createEnemy(); // 创建敌军
         }
 
         /**
          * 触摸事件执行的方法
          */
         @Override
         public boolean onTouch(View v, MotionEvent event) {
                 if (event.getAction() == MotionEvent.ACTION_DOWN) { // 按下执行的事件
                         // 按下点中飞机执行的方法
                         if (Utils.inRect(plane.x - plane.w / 2 , plane.y - plane.h / 2 ,
                                         plane.w, plane.h, event.getX(), event.getY())) {
                                 pressPlane = true ; // 将飞机可移动设置为true
                         }
                 } else if (event.getAction() == MotionEvent.ACTION_MOVE) { // 拖动执行的事件
                         if (pressPlane) {
                                 plane.setPosition(event.getX(), event.getY()); // 将飞机的坐标设置为拖动时的坐标
                         }
                 } else if (event.getAction() == MotionEvent.ACTION_UP) { // 释放按键时执行的方法
                         pressPlane = false ; // 将飞机可移动设置为false
                 }
                 return true ;
         }
 
}

  Plane,飞机类,在飞机类中我们给它顺便装上子弹

?
package com.mocn.airBottle;
 
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
 
import com.mocn.framework.LayerManager;
import com.mocn.framework.Sprite;
import com.mocn.framework.Utils;
 
/**
  * 飞机类
  *
  * @author Administrator
  *
  */
public class Plane extends Sprite {
         public int timeSpan = 1000 ; // 飞机的发子弹间隔时间
         public long updateTime = 0 ; // 飞机的更新时间
 
         public Plane(Bitmap bitmap, int w, int h) {
                 super (bitmap, w, h, true );
         }
 
         @Override
         public void drawSelf(Canvas canvas, Paint paint) {
                 super .drawSelf(canvas, paint);
                 // 给飞机装上子弹
                 if (System.currentTimeMillis() > updateTime) {
                         // 创建子弹
                         Bullet b = new Bullet(Utils.getBitmap( "game/buttle.png" ), 50 , 50 );
                         b.setPosition(x + w / 2 , y); // 设置子弹的位置
                         b.setAction( "bb" ); // 设置子弹的动作
                         LayerManager.insert(b, this ); // 在飞机层的前面插入子弹层
                         GameData.bullets.add(b); // 添加一颗子弹
                         updateTime = System.currentTimeMillis() + timeSpan;
                 }
         }
 
}

  Buttle类,子弹类,在这个类中我们要设置子弹的动作和路线

 

?
package com.mocn.airBottle;
 
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
 
import com.mocn.framework.LayerManager;
import com.mocn.framework.Sprite;
 
/**
  * 子弹类,继承精灵类
  *
  * @author Administrator
  *
  */
public class Bullet extends Sprite {
         public int speed = 10 ; // 子弹的速度
 
         public Bullet(Bitmap bitmap, int w, int h) {
                 super (bitmap, w, h, false );
                 addAction( "bb" , new int [] { 0 , 1 , 2 , 3 , 4 , 5 }, new int [] { 50 , 50 , 50 ,
                                 50 , 50 , 50 });
         }
 
         @Override
         public void drawSelf(Canvas canvas, Paint paint) {
                 super .drawSelf(canvas, paint);
                 x += speed; // 让子弹移动
                 // 当子弹超出屏幕移除子弹
                 if (x >= 800 ) {
                         LayerManager.deleteLayer( this );
                         GameData.bullets.remove( this );
                 }
 
         }
 
}

 

  Enemy类,敌军类,在这个类中我们要给它设置动作和路 线

?
package com.mocn.airBottle;
 
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
 
import com.mocn.framework.Sprite;
 
/**
  * 敌军的绘制类
  *
  * @author Administrator
  *
  */
public class Enemy extends Sprite {
 
         public Enemy(Bitmap bitmap, int w, int h) {
                 super (bitmap, w, h, true );
                 addAction( "left" , new int [] { 0 , 1 , 2 , 3 , 4 }, new int [] { 50 , 50 , 50 ,
                                 50 , 50 }); // 设置动作集合
         }
 
         @Override
         public void drawSelf(Canvas canvas, Paint paint) {
                 super .drawSelf(canvas, paint);
                 x -= 2 ; // 敌军往左移动
         }
 
}

 最后一个,GameData类,游戏数据类,在这里我们有创建敌军的方法和子弹和敌军的碰撞处理

?
package com.mocn.airBottle;
 
import java.util.Vector;
 
import com.mocn.framework.LayerManager;
import com.mocn.framework.Utils;
 
/**
  * 游戏数据类,用于控制敌军的出现和子弹与敌军的碰撞
  *
  * @author Administrator
  *
  */
public class GameData {
         public static Vector<Bullet> bullets = new Vector<Bullet>();
         public static Vector<Enemy> enemys = new Vector<Enemy>();
         private static long updateTime; // 设置更新时间
 
         /**
          * 创建敌军的方法
          */
         public static void createEnemy() {
                 if (System.currentTimeMillis() < updateTime)
                         return ;
                 updateTime = System.currentTimeMillis() + 3000 ; // 设置更新时间,3秒出一只
                 // 创建敌军
                 Enemy e = new Enemy(Utils.getBitmap( "game/enemy.png" ), 72 , 69 );
                 e.setPosition( 800 , ( float ) Math.random() * 480 ); // 设置敌军的位置,x坐标固定,y坐标随机
                 e.setAction( "left" ); // 设置动作
                 enemys.add(e); // 在Vector中添加一个敌军
         }
 
         /**
          * 子弹和敌军碰撞后的处理方法
          */
         public static void bulletsAndEnemy() {
                 // 遍历子弹和敌军
                 for ( int i = bullets.size() - 1 ; i >= 0 ; i--) {
                         Bullet b = bullets.elementAt(i);
                         for ( int j = enemys.size() - 1 ; j >= 0 ; j--) {
                                 Enemy e = enemys.elementAt(j);
                                 // 调用工具类中的碰撞检测方法
                                 boolean t = Utils.colliseWidth(b.x - b.w / 2 , b.y - b.h / 2 ,
                                                 b.w, b.h, e.x - e.w / 2 , e.y - e.h / 2 , e.w, e.h);
                                 if (t) {
                                         bullets.remove(b); // 移除Vector中的子弹
                                         enemys.remove(e); // 移除Vector中的敌军
                                         LayerManager.deleteLayer(b); // 移除组件中的子弹
                                         LayerManager.deleteLayer(e); // 移除组件中的敌军
                                 }
                         }
                 }
         }
}

  至此,整个游戏教学完成。
这 是一个简单的游戏,但是代码量却不少,特别是框架部分,但是这个框架可以说是很基础的,但却囊括了游戏的很多方面,如果以后有机会去游戏公司,框架部分会 更复杂,现在的辛苦只是为了以后的轻松而准备,我相信,如果一个人可以克服困难,看懂它的话,那他离真正的游戏大师也差不多远了,真正的机遇留个有准备的 人!

源码下载:

 http://files.cnblogs.com/feifei1010/AirBottle2.zip

分享到:
评论

相关推荐

    unity RPG动作游戏框架源码.zip

    unity RPG动作游戏框架源码.zip

    2D游戏基础框架源码

    这个“2D游戏基础框架源码”正是为了满足这样的需求,它是一个简化的2D游戏开发起点,允许开发者在此基础上进行个性化的定制和扩展,以制作出属于自己的2D游戏。 首先,我们要理解2D游戏的基本结构。2D游戏通常包含...

    一个战棋游戏源码,制作相当精美

    《一个战棋游戏源码,制作相当精美》 在IT领域,游戏开发是极具挑战性和创新性的部分,而源码则是游戏开发的核心。本资源提供了一个战棋游戏的源码,其精美的制作展现了开发者对游戏设计的深入理解和高超的技术水平...

    VB制作小游戏 连连看 附:源码

    标题中的“VB制作小游戏 连连看 附:源码”揭示了这是一个关于使用Visual Basic(VB)编程语言开发的小游戏——连连看。连连看是一款经典的休闲益智游戏,玩家需要找出并消除屏幕上的成对相同图案,直到所有图案都被...

    RPG文字游戏源码

    《RPG文字游戏源码详解:COCOS2DX框架与游戏设计实践》 RPG(Role-Playing Game)文字游戏源码是开发者们学习和理解游戏开发过程的重要参考资料,尤其是针对COCOS2DX这一跨平台的游戏开发框架。COCOS2DX是一款基于...

    CocosCreator小游戏源码

    【CocosCreator小游戏源码】是一款基于CocosCreator开发的微信小游戏项目,旨在提供一个参照著名游戏《羊了个羊》的编程实践案例。...对于想要尝试自己动手制作小游戏的爱好者,这是一个不容错过的学习资源。

    40个H5小游戏完整源码-new

    "40个H5小游戏完整源码-new"这个标题表明你拥有一个包含40款不同H5小游戏的源代码集合,并且这个集合是更新过的版本,可能是对原有版本的优化或者增加了新的游戏。H5小游戏通常是指基于HTML5技术开发的小型互动游戏...

    纵横四海文字游戏源码

    【纵横四海文字游戏源码】是一款基于WAP技术开发的文字冒险类游戏,它通过简单的文字叙述和用户交互,为玩家构建了一个丰富的虚拟世界。在这款游戏中,玩家可以通过输入指令来推动剧情发展,进行角色扮演,体验不同...

    pulpcore源码(游戏框架)

    是一个open source 游戏框架源码

    分享 mud 文字游戏 源码

    为了进行二次开发,你需要具备一定的编程基础,理解源码使用的编程语言,并且对游戏开发有基本的认知。你可以根据需求修改现有的房间、物品、命令或者添加新的功能。例如,你可以扩展游戏世界,增加新的地图和剧情;...

    40个安卓小游戏源码

    这些安卓小游戏源码是极好的学习资源,对于想要深入了解Android游戏开发的程序员来说,它们提供了丰富的实践案例。每个源码都是一个独立的游戏项目,涵盖了不同的游戏类型和编程技术,可以帮助开发者提升技能,理解...

    cocosCreator塔防游戏源码

    2. **游戏架构**:源码中展示了如何搭建一个塔防游戏的基本框架,包括游戏场景的创建、游戏对象的管理、事件处理等,这对于理解游戏开发的架构设计至关重要。 3. **怪物寻路算法**:在塔防游戏中,怪物需要从起点...

    AVG游戏Android移植框架源码(吉里吉里与NS)

    AVG游戏Android移植框架源码主要涉及了将传统的AVG(冒险游戏)从桌面平台迁移到Android设备的技术,其中核心是吉里吉里(KRIKRI)引擎和NS(Nscripter)引擎的实现。这两款引擎在游戏开发者中非常流行,主要用于...

    基于Unity开源框架GameFramewrk实现的一款塔防游戏Demo源码+项目说明.zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和...基于Unity开源框架GameFramewrk实现的一款塔防游戏Demo源码+项目说明.zip

    微信小游戏源码80套.zip

    学习这个源码包,你可以了解到游戏的架构设计、游戏循环机制、碰撞检测、动画制作、用户输入处理、得分系统实现、网络通信(如与服务器同步用户数据)以及微信小游戏特有的API使用等。通过分析和实践,你可以提升...

    Unity3d制作简单拼图游戏源码+工程

    本资源提供的"Unity3d制作简单拼图游戏源码+工程",是一个适合初学者和有一定基础的开发者学习的游戏项目,通过它,你可以了解Unity3D的基本操作和游戏逻辑实现。 首先,让我们从标题开始。"Unity3d制作简单拼图...

    红中麻将游戏源码

    《红中麻将游戏源码解析与二次开发指南》 红中麻将游戏源码是一套完整的棋牌游戏解决方案,基于Cocos2D引擎与Lua脚本语言,提供了详尽的游戏逻辑和丰富的美术资源,为开发者提供了一个理想的参考平台,同时也支持...

    网狐6.6完整源码+内核源码+105款游戏源码(已解密).zip

    通过分析这些源码,开发者可以了解到如何构建一个稳定、高效的网络游戏系统,包括如何处理并发用户请求、如何优化数据读写速度、如何设计友好的用户交互界面等。 其次,"内核源码"则是指整个系统的核心部分,它负责...

    asp.net core敏捷开发框架c#源码

    这个"asp.net core敏捷开发框架c#源码"提供了完整的C#源代码,适用于那些希望深入理解ASP.NET Core工作原理或者需要快速构建自己的应用框架的开发者。 在ASP.NET Core中,C#是主要的编程语言,它是一种面向对象的、...

    MFC扫雷游戏源码 自己做的 适合初学者

    【标题】"MFC扫雷游戏源码 自己做的 适合初学者"涉及的主要知识点包括MFC(Microsoft Foundation Classes)框架、游戏编程基础、扫雷游戏逻辑以及源码阅读与学习。 MFC是微软提供的一套面向对象的C++类库,它用于...

Global site tag (gtag.js) - Google Analytics