8月7日,小雨。“乳鸦啼散玉屏空,一枕新凉一扇风。睡起秋色无觅处,满阶梧桐月明中。”

上篇已经让飞机随手指自由移动,本篇加载子弹和音效及背景音乐。

本篇要用到的几个函数讲解:

一、cocos2d的音效、背景音乐函数如下:

1、SoundEngine.sharedEngine().playSound(Context ctxt, int resId, boolean loop)

用于播放背景音乐。

2、SoundEngine.sharedEngine().playEffect(Context app,int resId)

用于播放音效,如子弹射击、碰撞、爆炸等音乐效果。

3、SoundEngine.sharedEngine().realesAllSounds();

       SoundEngine.sharedEngine().realesAllEffects();

清理所有的音效-Clean everything up

 SoundEngine.purgeSharedEngine();

         完全关闭音响系统-Completely shut down the sound system

        二、单线程的定时器schedule

       schedule(String selector,float interval)

       第二个参数的意思是,每隔多少秒执行一次函数,记住,单位是秒。

    为了使游戏变得更加有趣,我们会随着时间连续不断地发射一些精灵出来。可以使用cocos2d的定时scheduler,并指定一个回调函数来完成此功能。一秒钟或半秒调用一次回调函数就可以了。

     三、action

      cocos2d里面提供了许多非常方便的内置的action,你可以使用这样action来让你的精灵动起来。比如move action,jump action,fade action,animation action(就是播放图片序列)等。这里,我们对目标对象子弹使用了3种类型的action:     

  • CCMoveTo: 我们使用CCMoveTo.action让子弹移动到屏幕的上端,直到移出屏幕。注意,这里我们可以指定这个过程要花费多长时间。这里使用了变化的时间间隔2-4秒。
  • CCCallFuncN: 它可以让你为某个执行此action的对象指定一个回调函数。我们指定的回调函数是:onBulletMoveToFinished。
  • CCSequence: 它允许我们把一系列的action组成一个action序列,并且这些acton可以按顺序执行。一次执行完所有的action。 

        四、MainActivity.java

package edu.eurasia.cocos2d_game03;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.Window;
import android.view.WindowManager;public class MainActivity extends Activity {// 创建一个view对象,cocos2d引擎会把图形绘制在该view对象上面private CCGLSurfaceView view = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 不显示标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置当前程序全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置不允许屏幕自动休眠getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);view = new CCGLSurfaceView(this);setContentView(view);// 获取导演对象CCDirector director = CCDirector.sharedDirector();// 设置游戏引擎画面的输出目标Viewdirector.attachInView(view);// 设置游戏是否显示FPS值// director.setDisplayFPS(true);// 设置游戏的刷新率 FPS = frame per seconddirector.setAnimationInterval(1 / 60.0f);// 生成场景对象CCScene scene = CCScene.node();// 生成图层对象PlaneLayer layer = new PlaneLayer(this);// 将图层添加至场景当中scene.addChild(layer, 1);// 通知导演,运行场景director.runWithScene(scene);}@Overrideprotected void onDestroy() {super.onDestroy();//清理所有的音效SoundEngine.sharedEngine().realesAllSounds();SoundEngine.sharedEngine().realesAllEffects();// 完全关闭音响系统SoundEngine.purgeSharedEngine();}}

       五、 PlaneLayer.java

package edu.eurasia.cocos2d_game03;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.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;// 定义子弹的速度为每秒500像素private float bulletSpeed = 500;private Context context;private List<CCSprite> bullets = new ArrayList<CCSprite>();public PlaneLayer(Context context) {super();this.context = context;// 设置当前图层是否接受触摸事件this.setIsTouchEnabled(true);director = CCDirector.sharedDirector();winSize = director.winSize();// 初始化精灵对象plane = CCSprite.sprite("p.png");// 设置精灵对象的位置plane.setPosition(CGPoint.ccp(winSize.width / 2, 200));this.addChild(plane);// 定时器scheduleschedule("addBullet", 0.5f);// 背景音乐SoundEngine.sharedEngine().playSound(context, R.raw.game_music, true);}// 当用户开始触摸屏幕,执行该方法@Overridepublic 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);}// 当用户手指离开屏幕时,执行该方法@Overridepublic boolean ccTouchesEnded(MotionEvent event) {flag = false;return super.ccTouchesEnded(event);}// 当用户手指在屏幕移动时,执行该方法@Overridepublic 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 addBullet(float delta) {// 生成一个子弹精灵对象CCSprite bullet = CCSprite.sprite("bullet.png");// 将子弹对象添加至图层当中this.addChild(bullet);// 将新添加的子弹对象放置在bullets集合当中bullets.add(bullet);// 获得精灵的大小,getContentSize函数来获得节点原始的大小CGSize planeSize = plane.getContentSize();CGSize bulletSize = bullet.getContentSize();CGPoint initPos = plane.getPosition();// 子弹的y轴的初始位置initPos.y = initPos.y + planeSize.height / 2 + bulletSize.height / 2;bullet.setPosition(initPos);// 创建一个代表坐标的对象CGPoint targetPos = CGPoint.ccp(initPos.x, winSize.height);// 计算两个坐标点之间的距离,计算子弹运行的距离float distance = CGPoint.ccpDistance(initPos, targetPos);// 计算子弹运行的时间float t = distance / bulletSpeed;// 生成一个动画对象,让子弹移动到屏幕的上端CCMoveTo moveTo = CCMoveTo.action(t, targetPos);// 生成一个动作对象,该动作执行时,将会调用当前对象的onBulletMoveToFinished方法// CCCallFuncN:// 它可以让你为某个执行此action的对象指定一个回调函数。我们指定的回调函数是:onBulletMoveToFinishedCCCallFuncN func = CCCallFuncN.action(this, "onBulletMoveToFinished");// CCSequence:// 它允许我们把一系列的action组成一个action序列,并且这些acton可以按顺序执行。一次执行完所有的action。CCSequence seq = CCSequence.actions(moveTo, func);// 通知精灵执行动作bullet.runAction(seq);// 子弹声效SoundEngine.sharedEngine().playEffect(context, R.raw.bullet);}public void onBulletMoveToFinished(Object sender) {if (sender instanceof CCSprite) {CCSprite sprite = (CCSprite) sender;// 将子弹对象从集合中移除bullets.remove(sprite);// 将子弹对象从屏幕中移除this.removeChild(sprite, true);}}}

       六、 运行结果


                  源代码下载地址:http://download.csdn.net/detail/zwszws/7731459

第三十九天 一乐在其中—Android的小游戏打飞机(三)让子弹飞相关推荐

  1. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  2. python自学篇十[ 面向对象 (四) :王者荣耀小游戏+模拟一个简单的银行进行业务办理的类]

    python基础系列: python自学篇一[ Anaconda3安装 ] python自学篇二[ pycharm安装及使用 ] python自学篇三[ 判断语句if的使用 ] python自学篇四[ ...

  3. 三十二楼层选几层最好_楼层是三十二层,如果要买,几层好?买房子要卡率哪些方面的细节?...

    你好!买房看风水,选房要看楼层风水.在选房时如何挑选楼层风水一座大厦的外在风不环境.山形道路对住宅风水会有影响.在同一栋楼里面,由于存在着命相与层数之五行的相生相克关系,因此,不同的楼层,也会对居住者 ...

  4. android休闲游戏,娱乐随时随地 十款Android休闲小游戏

    [IT168 应用]不论现在工作生活压力有多大,不论城市节奏有多快,每个人视乎都有点那么不知所措的时候,等公交时.排队吃饭时.发呆时总希望能够赶紧打发走这纠结烦躁的心情,大多数人都会选择去把玩手机,但 ...

  5. Android 魔塔小游戏--界面设计以及方向键设计(一)

    本人自小玩魔塔游戏长大的,当时学习机上的50层魔塔玩了不知道多少遍了,现在做了码农一枚,非常希望可以制作一款自己的魔塔,于是花费了一点时间,断断续续的完成了一款运行于Android上的魔塔小游戏.本人 ...

  6. python猜拳游戏三局两胜制_python石头剪刀布小游戏(三局两胜制)

    Python 石头剪刀布小游戏(三局两胜),供大家参考,具体内容如下 import random all_choioces = ['石头', '剪刀', '布'] win_list = [['石头', ...

  7. android扫雷小游戏制作,android扫雷小游戏源码

    [实例简介] 一个简易的扫雷小游戏源码,可供android初学者参考学习 [实例截图] [核心代码] MineSweep └── MineSweep ├── AndroidManifest.xml ├ ...

  8. android 数独小游戏

    偶然想起来写一个数独的小游戏自己没事的时候玩一玩,锻炼锻炼思路. 先上效果截图           数独生成的算法,参见博客:数独生成算法 数独游戏的最基础的在于生成数独,由于生成数独的算法运算问题, ...

  9. C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.小甲鱼Python项目 – 飞机大战 2.本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往 3.EasyX官方链 ...

最新文章

  1. ionic4中使用Swiper触屏滑动---心酸路
  2. 北大读博手记:怎样完成自己的博士生涯?非常具有指导性!
  3. Struts 源码分析笔记1(尚无内容-请跳过,省得浪费时间)
  4. 项目经理应该把30%的时间用在编程上
  5. 执行phpinfo();时提示:date_default_timezone_set()
  6. vs2015 支持Android arm neon Introducing Visual Studio’s Emulator for Android
  7. LeetCode 1108. IP 地址无效化
  8. 【Mockplus教程】界面闪烁花屏怎么办?
  9. 【BZOJ2751】【codevs1853】容易题,快速幂+逆元
  10. 2006毕业设计Delphi篇(二)
  11. python 条件语句且_python 条件语句
  12. 【OpenCV】 300行写出全能扫描王
  13. cannot find -l****问题的解决办法
  14. 渗透测试-文件上传/下载/包含
  15. 有哪些可以提高网站排名的更有效的SEO优化方法?
  16. 真正意义上第一个APP 可以用的 老黄历~~~
  17. 【Dash搭建可视化网站】项目13:销售数据可视化大屏制作步骤详解
  18. 短信猫实现短信验证小例子
  19. 【转】利用JMF进行多媒体编程
  20. linux如何运行windows游戏,用Steam Play在Linux系统中玩Windows游戏的方法

热门文章

  1. winrar 压缩文件方法
  2. TP5.1框架中百度富文本编辑器UEditor的使用
  3. Arduino UNO AT24C32进行单字节数据读写(二)
  4. Java高频面试题(四)
  5. Win11语音识别怎么设置关闭?
  6. 如何将html导入ie收藏,IE 如何导出和导入收藏夹(两种可行方法以IE9为例)
  7. eshop6-nginx
  8. docker发布项目的一般性步骤
  9. 点击qq或者微信对话框里面的文件跳转到自己的app时的文件路径问题
  10. 途牛旅游项目-导航条(后端数据测试)