第一课:@H_502_2@
1、什么是Cocos2d引擎@H_502_2@
2、为什么要使用Cocos2d引擎@H_502_2@
3、Cocos2d引擎的特点@H_502_2@
4、Cocos2d应用程序结构@H_502_2@
5、总结@H_502_2@
什么是游戏引擎:@H_502_2@
已经编写好的游戏系统的核心组件:@H_502_2@
渲染引擎@H_502_2@、物理引擎@H_502_2@、碰撞检测系统@H_502_2@、音效引擎@H_502_2@、脚本引擎@H_502_2@、动画系统@H_502_2@
没有游戏引擎也能开发游戏,但是开发的周期会变长。使用cocos2d能提高开发效率。@H_502_2@
@H_502_2@
精灵:一切能动的物体。布景层:俗称图层。场景:每一个关卡。@H_502_2@
Cocos2d的核心类:@H_502_2@
1、CCDirector:导演类是游戏当中的组织者和领导者,负责调度游戏当中的一切对象和资源。@H_502_2@
2、CCSence:场景可以简单的理解为一个关卡,多个关卡组合在一起就形成了一个游戏。@H_502_2@
3、CCLayer:一个场景可以有多个布景层构成。@H_502_2@
4、CCSprite:游戏当中所用可以运动的东西几乎都是精灵,一个布景层当中可以包含多个精灵。@H_502_2@
Cocos2d的下载地址:https://github.com/ZhouWeikuan/cocos2d@H_502_2@@H_502_2@
本身是一个库文件,设置成非库文件。@H_502_2@@H_502_2@
第三课:@H_502_2@
@H_502_2@@H_502_2@
1、创建一个Cocos2d应用程序。@H_502_2@@H_502_2@@H_502_2@
1)创建一个Android应用程序。@H_502_2@@H_502_2@@H_502_2@@H_502_2@
2)生成一个SurfaceView对象,作为Activity当中所显示的内容。@H_502_2@@H_502_2@@H_502_2@@H_502_2@
3)得到CCDirector对象,并通过该对象设置应用程序的各种属性。@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@@H_502_2@@H_502_2@@H_502_2@
2、设置应用程序基本属性。@H_502_2@@H_502_2@@H_502_2@
1)director.attachInView(mGLSurfaceView)@H_502_2@@H_502_2@@H_502_2@@H_502_2@
用于设置应用程序所使用的GL视图对象@H_502_2@
2)director.setDeviceOrientation(CCDirector.kCCDeviceOrientationLandscapeLeft)@H_502_2@
用于设置应用程序的方向。@H_502_2@
3)director.setDisplayFPS(true)@H_502_2@
设置应用程序是否需要显示应用程序的FPS值。@H_502_2@
4)director.setAnimationInterval(1.0f/30)@H_502_2@
设置没帧所需要的时间@H_502_2@
3、生成场景与布景层。@H_502_2@@H_502_2@@H_502_2@
1)创建一个布景层类,继承CCLayer。@H_502_2@
@H_502_2@@H_502_2@@H_502_2@
2)调用CCScence的node()方法生成场景对象。@H_502_2@@H_502_2@@H_502_2@@H_502_2@
3)生成布景层对象,并添加至场景对象当中。@H_502_2@@H_502_2@@H_502_2@@H_502_2@
4)执行场景对象。@H_502_2@@H_502_2@@H_502_2@@H_502_2@
4、运行Cocos2d应用程序。@H_502_2@@H_502_2@@H_502_2@
5、总结@H_502_2@@H_502_2@@H_502_2@
我的第一个游戏:@H_502_2@
一、FirstGame_MainActivity extends Activity@H_502_2@@H_502_2@@H_502_2@
游戏的基本结构@H_502_2@@H_502_2@@H_502_2@
package com.atgaozhen.firstgame;
import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCNode;
import org.cocos2d.opengl.CCGLSurfaceView;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class FirstGame_MainActivity extends Activity {
@H_502_2@//Cocos2d引擎将会把图绘制到view对象上
@H_502_2@//是SurfaceView的自雷
@H_502_2@private CCGLSurfaceView view=null;
@H_502_2@
@H_502_2@@Override
@H_502_2@protected void onCreate(Bundle savedInstanceState) {
@H_502_2@super.onCreate(savedInstanceState);
@H_502_2@//1、获得view
@H_502_2@view=new CCGLSurfaceView(this);
@H_502_2@setContentView(view);
@H_502_2@//2、获得CCDirector对象,获得导演。
@H_502_2@CCDirector director=CCDirector.sharedDirector();
@H_502_2@//3、设置应用程序的相关的属性
@H_502_2@//设置当前游戏程序当中所使用的view对象
@H_502_2@
@H_502_2@director.attachInView(view);
@H_502_2@//设置游戏是否显示FPS值
@H_502_2@director.setDisplayFPS(true);
@H_502_2@//设置游戏渲染一帧所需要的时间
@H_502_2@//每秒刷新的帧数
@H_502_2@director.setAnimationInterval(1/30.0);
@H_502_2@
@H_502_2@//生成一个游戏场景对象
@H_502_2@CCScene scene=CCScene.node();
@H_502_2@
@H_502_2@//生成布景层对象
@H_502_2@GameLayer gameLayer=new GameLayer();
@H_502_2@//将布景层添加到游戏场景中
@H_502_2@scene.addChild(gameLayer);
@H_502_2@
@H_502_2@//运行游戏场景
@H_502_2@director.runWithScene(scene);
@H_502_2@
@H_502_2@}
@H_502_2@@Override
@H_502_2@public boolean onCreateOptionsMenu(Menu menu) {
@H_502_2@// Inflate the menu; this adds items to the action bar if it is present.
@H_502_2@getMenuInflater().inflate(R.menu.first_game__main,menu);
@H_502_2@return true;
@H_502_2@}
}
@H_502_2@
二、图层对象GameLayer@H_502_2@@H_502_2@@H_502_2@
package com.atgaozhen.firstgame;
import org.cocos2d.actions.interval.CCJumpTo;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.types.CGPoint;
public class GameLayer extends CCLayer {
//声明一个精灵对象
@H_502_2@CCSprite player;
@H_502_2@public GameLayer(){
@H_502_2@//初始化精灵对象
@H_502_2@player=CCSprite.sprite("player.png");
@H_502_2@//设置精灵对象的位置
@H_502_2@CGPoint point=CGPoint.ccp(250,500);
@H_502_2@player.setPosition(point);
@H_502_2@//将精灵对象添加到布景层中
@H_502_2@this.addChild(player);
@H_502_2@CGPoint target=CGPoint.ccp(700,500);
@H_502_2@CCJumpTo jumpTo=CCJumpTo.action(3,target,800,100);
player.runAction(jumpTo);
@H_502_2@}
}
@H_502_2@
1、精灵是游戏当中的一个元素,通常用于代表画面当中的一个事物,例如主人公、npc和背景元素等@H_502_2@@H_502_2@
3、精灵对象通常可以通过运行动作对象CCAction来产生动画效果。@H_502_2@
public class GameLayer extends CCLayer {@H_502_2@
//声明一个精灵对象@H_502_2@
@H_502_2@CCSprite player;@H_502_2@
public GameLayer(){@H_502_2@
//初始化精灵对象@H_502_2@
player=@H_502_2@CCSprite@H_502_2@@H_502_2@.sprite("player.png");@H_502_2@
//设置精灵对象的位置@H_502_2@
@H_502_2@CGPoint@H_502_2@@H_502_2@@H_502_2@@H_502_2@ point=@H_502_2@CGPoint@H_502_2@@H_502_2@.ccp(250,500);@H_502_2@
player.setPosition(point);@H_502_2@
//将精灵对象添加到布景层中@H_502_2@
@H_502_2@this@H_502_2@@H_502_2@.addChild(player);@H_502_2@
@H_502_2@CGPoint@H_502_2@@H_502_2@ target=@H_502_2@CGPoint@H_502_2@@H_502_2@.ccp(700,51); font-family:SimHei; font-size:18px; white-space:pre">@H_502_2@CCJumpTo@H_502_2@@H_502_2@ jumpTo=@H_502_2@CCJumpTo.action@H_502_2@@H_502_2@(3,100);@H_502_2@
player.runAction(jumpTo);@H_502_2@
}@H_502_2@
}@H_502_2@
@H_502_2@
CCSprite、CGPoint、CCJumpTo、CGPoint@H_502_2@@H_502_2@.ccp(250,500)、CCJumpTo.action@H_502_2@@H_502_2@(3,100);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@
第五课、第六课、第七课、第八课:@H_502_2@
@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
action@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
package com.example.action_1;
import org.cocos2d.actions.base.CCRepeatForever;
import org.cocos2d.actions.instant.CCCallFunc;
import org.cocos2d.actions.instant.CCFlipX;
import org.cocos2d.actions.instant.CCFlipY;
import org.cocos2d.actions.instant.CCHide;
import org.cocos2d.actions.interval.CCBlink;
import org.cocos2d.actions.interval.CCFadeIn;
import org.cocos2d.actions.interval.CCFadeOut;
import org.cocos2d.actions.interval.CCJumpBy;
import org.cocos2d.actions.interval.CCMoveBy;
import org.cocos2d.actions.interval.CCMoveTo;
import org.cocos2d.actions.interval.CCRepeat;
import org.cocos2d.actions.interval.CCRotateTo;
import org.cocos2d.actions.interval.CCScaleTo;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.actions.interval.CCSpawn;
import org.cocos2d.actions.interval.CCTintBy;
import org.cocos2d.actions.interval.CCTintTo;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.ccColor3B;
import android.content.Context;
import android.widget.Toast;
public class GameLayer extends CCLayer {
@H_502_2@CCSprite sprite;
@H_502_2@CCSprite sprite1;
@H_502_2@ccColor3B ccColor3B=null;
public GameLayer(){
@H_502_2@ sprite=CCSprite.sprite("yumi.png");
@H_502_2@ this.addChild(sprite);
@H_502_2@ CGPoint Init=CGPoint.ccp(300,100);
@H_502_2@ sprite.setPosition(300,100);
@H_502_2@ CGPoint target=CGPoint.ccp(400,800);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
3@H_502_2@@H_502_2@、CCMoveTo@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@方法:移动到@H_502_2@
@H_502_2@ CCMoveTo ccMoveTo1=CCMoveTo.action(6,target);@H_502_2@
@H_502_2@ CCMoveTo ccMoveTo2=CCMoveTo.action(6,Init);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@8@H_502_2@@H_502_2@、CCSequence(连续几个动作,不定个数参数,只要把action放进去)@H_502_2@、CCRepeat、CCRepeatForever、ccColor3B、@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@CCFadeOut、CCFadeIn@H_502_2@
@H_502_2@ CCSequence ccSequence=CCSequence.actions(ccMoveTo1,ccMoveTo2);@H_502_2@
@H_502_2@ CCRepeat ccRepeat=CCRepeat.action(ccSequence,3);@H_502_2@
@H_502_2@ CCRepeatForever repeatForever=CCRepeatForever.action(ccRepeat);@H_502_2@
@H_502_2@ sprite.runAction(repeatForever);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
颜色定义色光@H_502_2@三原色@H_502_2@是指红、绿、蓝三色@H_502_2@
//@H_502_2@ @H_502_2@ ccColor3B=ccColor3B.ccc3(-120,255,-120);@H_502_2@
//@H_502_2@@H_502_2@ //CCTintTo tintTo=CCTintTo.action(3,ccColor3B);@H_502_2@
//@H_502_2@@H_502_2@ CCTintBy tintBy=CCTintBy.action(3,ccColor3B);@H_502_2@
//@H_502_2@@H_502_2@ // CCFadeOut@H_502_2@@H_502_2@ ccFadeOut=CCFadeOut.action(5);@H_502_2@
//@H_502_2@@H_502_2@ //CCFadeIn ccFadeIn=CCFadeIn.action(5);@H_502_2@
//@H_502_2@@H_502_2@ sprite.runAction(tintBy);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@1、CCFlipX、CCFlipY方法:沿着x、y轴旋转@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@ ////////@H_502_2@@H_502_2@//1.生成动作对象@H_502_2@
////////@H_502_2@@H_502_2@CCFlipX flipX=CCFlipX.action(true);@H_502_2@
////////@H_502_2@@H_502_2@//2.使用精灵对象执行动作对象@H_502_2@
////////@H_502_2@@H_502_2@ sprite.runAction(flipX);@H_502_2@
////////@H_502_2@@H_502_2@CCFlipY fiFlipY=CCFlipY.action(true);@H_502_2@
////////@H_502_2@@H_502_2@sprite.runAction(fiFlipY);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@2、CCHide@H_502_2@、CCShow@H_502_2@@H_502_2@方法:精灵的隐藏和显示@H_502_2@
////////@H_502_2@ @H_502_2@CCHide hide=CCHide.action();@H_502_2@
////////@H_502_2@@H_502_2@sprite.runAction(hide);@H_502_2@
//////@H_502_2@@H_502_2@/*总结:@H_502_2@
//////@H_502_2@@H_502_2@* 1、生成动作对象@H_502_2@
//////@H_502_2@@H_502_2@* 2、调用精灵的run方法@H_502_2@
//////@H_502_2@@H_502_2@*/@H_502_2@
//////@H_502_2@@H_502_2@CGPoint point=CGPoint.ccp(800,800);@H_502_2@
////////@H_502_2@@H_502_2@CCMoveTo ccMoveTo=CCMoveTo.action(6,point);@H_502_2@
////////@H_502_2@@H_502_2@sprite.runAction(ccMoveTo);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
4@H_502_2@@H_502_2@、CCRotateTo@H_502_2@@H_502_2@@H_502_2@@H_502_2@:旋转@H_502_2@
////////@H_502_2@ @H_502_2@CCRotateTo ccRotateTo=CCRotateTo.action(6,-180);@H_502_2@
////////@H_502_2@@H_502_2@sprite.runAction(ccRotateTo);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
5@H_502_2@@H_502_2@、CCBlink@H_502_2@@H_502_2@@H_502_2@@H_502_2@:闪烁@H_502_2@
//////@H_502_2@ @H_502_2@//CCBlink blink=CCBlink.action(10,20);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
6@H_502_2@@H_502_2@、CCBlink@H_502_2@@H_502_2@@H_502_2@:缩放@H_502_2@
//////@H_502_2@ @H_502_2@CCScaleTo scaleTo=CCScaleTo.action(10.0f,60.0f,1.5f);@H_502_2@
//////@H_502_2@@H_502_2@sprite.runAction(scaleTo);@H_502_2@
//////@H_502_2@@H_502_2@sprite=CCSprite.sprite("yumi.png");@H_502_2@
//////@H_502_2@@H_502_2@sprite1=CCSprite.sprite("yumi.png");@H_502_2@
//////@H_502_2@@H_502_2@this.addChild(sprite);@H_502_2@
//////@H_502_2@@H_502_2@this.addChild(sprite1);@H_502_2@
////@H_502_2@@H_502_2@ CGPoint Initpoint=CGPoint.ccp(400,400);@H_502_2@
//////@H_502_2@@H_502_2@sprite1.setPosition(Initpoint);@H_502_2@
////@H_502_2@@H_502_2@sprite.setPosition(Initpoint);@H_502_2@
//////@H_502_2@@H_502_2@CGPoint dltaPoint=CGPoint.ccp(0,400);@H_502_2@
//////@H_502_2@@H_502_2@//向量的加法@H_502_2@
//////@H_502_2@@H_502_2@CGPoint targetPoint=CGPoint.ccpAdd(Initpoint,dltaPoint);@H_502_2@
//////@H_502_2@@H_502_2@CGPoint targetPoint=CGPoint.ccp(0,100);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
@H_502_2@7@H_502_2@@H_502_2@、CCMoveBy、CCJumpBy@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@:向量@H_502_2@
//////@H_502_2@ @H_502_2@CCMoveBy ccMoveBy=CCMoveBy.action(6,targetPoint);@H_502_2@
//////@H_502_2@@H_502_2@sprite.runAction(ccMoveBy);@H_502_2@
////@H_502_2@@H_502_2@CGPoint targetPoint=CGPoint.ccp(300,100);@H_502_2@
////@H_502_2@@H_502_2@CCJumpBy ccJumpBy=CCJumpBy.action(20,targetPoint,200,20);@H_502_2@
//// sprite.runAction(ccJumpBy);@H_502_2@
//@H_502_2@@H_502_2@
//@H_502_2@@H_502_2@ sprite=CCSprite.sprite("yumi.png");@H_502_2@
//@H_502_2@@H_502_2@ CGPoint initPoint=CGPoint.ccp(100,100);@H_502_2@
//@H_502_2@@H_502_2@ this.addChild(sprite);@H_502_2@
//@H_502_2@@H_502_2@ sprite.setPosition(initPoint);@H_502_2@
//@H_502_2@@H_502_2@ @H_502_2@
//@H_502_2@@H_502_2@ CGPoint targetPoint=CGPoint.ccp(300,300);@H_502_2@
//@H_502_2@@H_502_2@ CCMoveTo ccMoveTo=CCMoveTo.action(3,targetPoint);@H_502_2@
//@H_502_2@@H_502_2@ @H_502_2@
//@H_502_2@@H_502_2@ CCRotateTo ccRotateTo=CCRotateTo.action(2,180);@H_502_2@
//@H_502_2@@H_502_2@ CCScaleTo ccScaleTo=CCScaleTo.action(2,1);@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
//java动态性的体现
//@H_502_2@ @H_502_2@ CCCallFunc func=CCCallFunc.action(this,"onActionFinished");@H_502_2@@H_502_2@
//@H_502_2@@H_502_2@ CCSequence@H_502_2@ ccSequence=CCSequence.actions(ccMoveTo,func);@H_502_2@
//@H_502_2@@H_502_2@ //CCSpawn(动作一起执行)@H_502_2@ccSpawn=CCSpawn.actions(ccMoveTo,ccRotateTo,ccScaleTo);@H_502_2@
//@H_502_2@@H_502_2@ //CCSequence ccSequence=CCSequence.actions(ccMoveTo,ccScaleTo);@H_502_2@
//@H_502_2@@H_502_2@ sprite.runAction(ccSequence);@H_502_2@
//@H_502_2@@H_502_2@
}@H_502_2@
//public void onActionFinished(){@H_502_2@
//@H_502_2@@H_502_2@Toast.makeText(null,"onActionFinished",2);@H_502_2@
//}@H_502_2@
}@H_502_2@
@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@@H_502_2@
1、Android平台触摸事件回顾@H_502_2@
2、设置图层接受触摸事件@H_502_2@
4、触摸坐标转换@H_502_2@
5、总结@H_502_2@
@H_502_2@
package com.example.touchaction;import org.cocos2d.layers.CCLayer;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.types.CGPoint;
import android.view.MotionEvent;
//接受用户触摸的事件,首先必须对当前图层进行设置
public class GameLayer extends CCLayer {
public GameLayer(){
@H_502_2@//设置当前图层是否接受触摸事件
@H_502_2@this.setIsTouchEnabled(true);
}
@Override
public boolean ccTouchesBegan(MotionEvent event) {
@H_502_2@float x=event.getX();
@H_502_2@float y=event.getY();
@H_502_2@CGPoint p1=CGPoint.ccp(x,y);
@H_502_2@//触摸坐标转换
@H_502_2@CGPoint p2=CCDirector.sharedDirector().convertToGL(p1);
@H_502_2@
@H_502_2@return super.ccTouchesBegan(event);
}
@Override
public boolean ccTouchesEnded(MotionEvent event) {
@H_502_2@System.out.println("end");
@H_502_2@return super.ccTouchesEnded(event);
}
@Override
public boolean ccTouchesMoved(MotionEvent event) {
@H_502_2@System.out.println("move");
@H_502_2@return super.ccTouchesMoved(event);
}
}
1、为什么需要事件调度@H_502_2@
3、delta参数的作用@H_502_2@
总结@H_502_2@
public class GameLayer extends CCLayer { public GameLayer(){ //调用schedule方法,传输函数名,以及间隔时间 this.schedule("fun",1); } public void fun(float delta){ //delta往往来表示增量,在当前的例子当中, //改变了为上次fun函数与调用fun函数之间的时间差 } } @H_502_2@