Android 打飞机小游戏 cocos2d

来源:互联网 发布:莎布 尼古拉斯trpg数据 编辑:程序博客网 时间:2024/04/27 22:32

从cocos2d官网上下载合适的框架

导入自己的应用程序中。

1、CCDirector:导演类是游戏当中的组织者和领导者,负责调度游戏当中的一切对象和资源;


      Director是一个单例,在全部游戏中只存在一个实例。Director类似电影中的“导演”,正如其名,它经管Cocos2d-x中的所有场景的调度:可以切换当前场景(游戏中只有一个当前场景),暂停场景中的动作—这跟实际中的导演喊“咔”是一样的—会暂停全部场景中所有的动作或音效等,当然也可以开始一个场景中的动作和音效。总之,Director扮演着一个导演的角色。


         2、CCScene:场景可以简单的理解为一个关卡,多 个关卡组合在一起就形成了游戏;


         Scene就像一个舞台会摆放各类的元素,有的是固定的:布景和道具,有的元素是可以移动的:男、女主角等。在游戏世界里也如此,在一个游戏场景中会放置不合的元素来点缀我们的场景。当然在游戏里,也未必完全跟实际相同,为了便于对元素的操作,我们将不同的元素放在不同的层。在一个场景中可以放置多个层,可以使用addChild函数来把层加入场景中。 在设计一个场景时,一般会生成场景对象,然后再在里面添加层。


      在CCScene承担的是一个容器的功能,游戏开发时需要渲染的对象在CCScene里面统一管理,包括创建、销毁和场景切换等,而且从其类的结构图可看出,其直接继承了CCNode类,CCNode是cocos2d-x的渲染链,写游戏基本上就是和它打交道了,cocos2d-x同时只能渲染一个CCScene,因此CCScene是渲染的根节点。在构建游戏时,一般是一个Scene中添加一个或者多个CCLayer,一个Layer中又添加多个CCSprite或者CCMenu,CCSprite中还可以添加CCParticleSystem等等。这样就构建了一个渲染树,cocos2d-x历遍这个树来将图像显示在屏幕上。


         3、CCLayer:一个场景可以有多个布景层构成;


          这里说的层的概念和Adobe Photoshop上的概念是一样的。在每一个游戏中,场景可以由许多层构成,每一层负责各自不同的任务,例如负责显示背景、负责显示道具和负责显示任务等。而在每一层上面,又可以添加不同的元素,如文本、精灵和菜单等。通过层与层之间的组合关系,就能让游戏显示出各种各样的界面了。当然为了看得清每一层上的东西,很多层都设置成透明或者半透明,否则只能看到最上层的东西了。


         4、CCSprite:游戏当中所有可以运动的东西几乎都 是精灵,一个布景层当中可以包含多个精灵;


         Sprite(精灵)是层中的首要构成元素,精灵CCSprite是整个游戏开发处理的主要对象,例如天上的飞机、地上的坦克、玩家控制的任务等等都是精灵。CCSprite是一幅2D图像,CCSprite可以通过图像或者图像中的一个矩形子区域创建。实际上,精灵就是一个可以不断变化的图片,变化包括位置变化、旋转、放大、运动等等。


package com.example.planegame;import org.cocos2d.layers.CCScene;import org.cocos2d.nodes.CCDirector;import org.cocos2d.opengl.CCGLSurfaceView;import org.cocos2d.sound.SoundEngine;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.Window;import android.view.WindowManager;import android.widget.Toast;public class MainActivity extends Activity {private CCGLSurfaceView view = null;protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);view = new CCGLSurfaceView(this);setContentView(view);//创建背景//获取导演对象CCDirector director = CCDirector.sharedDirector();//设置游戏引擎画面的输出目标director.attachInView(view);director.setDisplayFPS(true);//设置游戏的刷新频率director.setAnimationInterval(1/30.0f);//生成场景对象CCScene scene = CCScene.node();PlaneLayer layer = new PlaneLayer(this);//将图层加入到场景中scene.addChild(layer,1);director.runWithScene(scene);//运行场景Toast.makeText(this, "ok", Toast.LENGTH_SHORT).show();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void onDestory(){super.onDestroy();//清理音效SoundEngine.sharedEngine().realesAllSounds();SoundEngine.sharedEngine().realesAllEffects();//关闭音效SoundEngine.purgeSharedEngine();}public void onPause(){super.onPause();//清理音效SoundEngine.sharedEngine().realesAllSounds();SoundEngine.sharedEngine().realesAllEffects();//关闭音效SoundEngine.purgeSharedEngine();}}

以上是程序的入口文件,我们在onPause中就关闭了音效

package com.example.planegame;import java.util.ArrayList;import java.util.List;import org.cocos2d.actions.instant.CCCallFuncN;import org.cocos2d.actions.interval.CCMoveTo;import org.cocos2d.actions.interval.CCSequence;import org.cocos2d.config.ccMacros;import org.cocos2d.layers.CCLayer;import org.cocos2d.nodes.CCDirector;import org.cocos2d.nodes.CCSprite;import org.cocos2d.sound.SoundEngine;import org.cocos2d.types.CGPoint;import org.cocos2d.types.CGRect;import org.cocos2d.types.CGSize;import android.content.Context;import android.view.MotionEvent;public class PlaneLayer extends CCLayer{private CCSprite plane;//飞机private CCDirector director;private CGSize winSize;//窗口private CGPoint offset;private boolean flag = false;private float bulletSpeed = 500;private Context context;private List<CCSprite> bullets = new ArrayList<CCSprite>();private List<CCSprite> enemies = new ArrayList<CCSprite>();private static final int E1_TAG = 1;      private static final int E2_TAG = 2;  public PlaneLayer(Context context){this.setIsTouchEnabled(true);//设置可以触摸事件director = CCDirector.sharedDirector();winSize = this.director.winSize();this.context = context;//初始化精灵对象plane = CCSprite.sprite("plane.png");plane.setPosition(CGPoint.ccp(winSize.width/2, 40));this.addChild(plane);//定时器 scheduleschedule("addBullet",0.5f);schedule("addEnemy",1.0f);//1秒添加一次schedule("check",0.001f);//SoundEngine.sharedEngine().playSound(context, R.raw.shoot, true);//true代表循环播放}//开始触摸屏幕public boolean ccTouchesBegan(MotionEvent event){CGPoint point = director.convertToGL(CGPoint.ccp(event.getX(), event.getY()));CGRect rect = plane.getBoundingBox();flag = CGRect.containsPoint(rect, point);if(flag){offset = CGPoint.ccpSub(plane.getPosition(), point);//走过的路线}return super.ccTouchesBegan(event);}//结束触摸屏幕public boolean ccTouchesEnded(MotionEvent event){flag = false;return super.ccTouchesEnded(event);}//一直在触摸屏幕public boolean ccTouchesMoved(MotionEvent event){if(flag){CGPoint point = director.convertToGL(CGPoint.ccp(event.getX(),event.getY()));point = CGPoint.ccpAdd(point, offset);plane.setPosition(point);}return super.ccTouchesMoved(event);}//增加敌机public  void addEnemy(float delta){String imgName="plane.png";int tag = E1_TAG;//生成[0,1]之间的随机数float ran = ccMacros.CCRANDOM_0_1();if(ran>0.8){imgName = "plane.png";tag = E2_TAG;}CCSprite sprite = CCSprite.sprite(imgName);sprite.setTag(tag);//将敌机加入该图层this.addChild(sprite);enemies.add(sprite);float initY = winSize.height + sprite.getContentSize().height/2;float initX = (winSize.width-sprite.getContentSize().width) * ccMacros.CCRANDOM_0_1();CGPoint initPos = CGPoint.ccp(initX, initY);sprite.setPosition(initPos);//初始化位置float targetX = initX;float targetY = -sprite.getContentSize().height/2;CGPoint targetPos = CGPoint.ccp(targetX, targetY);//计算需要的时间float t = 3 * ccMacros.CCRANDOM_0_1()+2;//生成用于移动哦个敌机的MoveTo对象CCMoveTo moveTo = CCMoveTo.action(t, targetPos);CCCallFuncN func = CCCallFuncN.action(this, "onEmptyMoveFinished");CCSequence seq = CCSequence.actions(moveTo, func);sprite.runAction(seq);}//当敌机离开public void onEnemyMoveToFinished(Object sender){if(sender instanceof CCSprite){CCSprite sprite = (CCSprite) sender;enemies.remove(sprite);this.removeChild(sprite, true);}}//发射子弹public void addBullet(float delta){//增加精灵CCSprite bullet = CCSprite.sprite("zidan.png");this.addChild(bullet);//将新加入的子弹对象放置在bullets集合中去bullets.add(bullet);//获得精灵大小CGSize planeSize = plane.getContentSize();CGSize bullentSize = bullet.getContentSize();CGPoint initPos = plane.getPosition();initPos.y = initPos.y + planeSize.height/2 + bullentSize.height/2;//将子弹的位置初始化bullet.setPosition(initPos);//创建一个目标的坐标CGPoint targetPos = CGPoint.ccp(initPos.x, winSize.height+bullet.getContentSize().getHeight()+2);float distance  = CGPoint.ccpDistance(initPos,targetPos);float t = distance/bulletSpeed;//移动需要的时间//生成一个动画,让子弹移动到屏幕的上端CCMoveTo moveTo = CCMoveTo.action(t, targetPos);//生成一个动作对象,该动作执行时,将会调用当前对象的第二个参数对应的方法//CCCallFuncN func = CCCallFuncN.action(this, "onBulletMoveToFished");//CCSequence 允许我们把一系列的action组成一个action序列,并且这些acion可以按照一定的顺序执行,一次执行完所有的actionCCSequence seq = CCSequence.actions(moveTo, func);bullet.runAction(seq);SoundEngine.sharedEngine().playEffect(context, R.raw.shoot);}public void onBulletMoveToFinished(Object sender){if(sender instanceof CCSprite){CCSprite sprite = (CCSprite) sender;bullets.remove(sprite);this.removeChild(sprite, true);}}//判断子弹是否射中敌机public boolean isDestroy(CCSprite bullet,CCSprite enemy){float x1 = enemy.getPosition().x-enemy.getContentSize().width/2;float y1 = enemy.getPosition().y+enemy.getContentSize().height/2;float x2 = enemy.getPosition().x+enemy.getContentSize().width/2;float y2 = enemy.getPosition().y-enemy.getContentSize().height/2;float x = bullet.getPosition().x;float y = bullet.getPosition().y;//击中返回真if(x1<=x && x<= x2 && y<=y1 && y>=y2)return true;//没有击中返回假return false;}public void check(float delta){//private List<CCSprite> bullets = new ArrayList<CCSprite>();//private List<CCSprite> enemies = new ArrayList<CCSprite>();for(int i=0;i<bullets.size();i++){for(int j = 0;j<enemies.size();j++){CCSprite bullet = bullets.get(i);CCSprite enemy = enemies.get(j);if(isDestroy(bullet,enemy)){bullets.remove(bullet);this.removeChild(bullet, true);enemies.remove(enemy);this.removeChild(enemy, true);}}}}}

以上是关于飞机的代码,包括打敌机,增加敌机,发送子弹,设置音效

要注意关于schedule里面的频率问题,如果把check的频率设置的太低,那么可能会出现一个敌机需要我们击打多次的情况,我感觉0.01就差不多了


源代码下载地址:打飞机源代码下载

0 0
原创粉丝点击