从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();
}
@Override
public 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);
//定时器 schedule
schedule("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可以按照一定的顺序执行,一次执行完所有的action
CCSequence 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就差不多了
源代码下载地址:打飞机源代码下载