文档章节

仿 微信飞机大战项目

Magic__wu
 Magic__wu
发布于 2015/07/28 17:53
字数 964
阅读 46
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

    一、 背景的循环播放

        思想:两张(或多张)背景图片循环向下移动,造成背景的动态效果。

 .
 .
public float mov_Speed =2f;  //定义背景图片移动速度
void Update()
{
    this.transform.Translate(Vector3.down * mov_Speed * Time.deltaTime) //图片(背景图片实例)向下移动
    Vector3 position = this.transform.position; //得到背景图片位置信息,为控制移动范围做准备
    if(position.y<=-8.52f)  //向下移动一定距离,循环(一般为图片的一半)
    {
        this.transform.position=new Vector3(position.x,position.y+8.52f * 2,position.z);
    }
    
}

    二、 主角的动态飞行效果

             

       思想:sprite 数组存贮 飞机的状态帧,循环播放图片

Private SpriteRenderer spriteRenderer;  //实例化动画精灵组件
public Sprite [] sprites; //创建 sprite 数组 存储动画帧
public int frameCountPersconds = 10; //每秒播放动画的帧数
void Start()
{
    spriteRenderer =  this.GetComponent<SpriteRenderer>();} // GetComponent方法得到SpriteRenderer组件
}
void Update()
{
    timer+=Time.deltaTime;  //得到游戏当前时间
    int framIndex = int((timer)/(1f/frameCountPersconds )); //得到当前播放帧
    int fram=framIndex%2; //求余得到 0、1、0、1循环
    spriteRenderer .sprite=sprites[fram]; //切换当前帧
}

    三、 敌机及奖励物品生成器Spawn

        思想:InvokeRepeating()函数

public GameObject Enemy0Prefab; 
public GameObject Enemy1Prefab;     //三种敌机实例
public GameObject Enemy2Prefab; 
public float Enemy0Rate = 8f;
 public float Enemy1Rate = 9f;
 public float Enemy2Rate = 40f;      //生成时间间隔
 public float Award1Rate=30f;
 public float Award2Rate=40f;
void Update()
{
    nvokeRepeating("CreateEnemy0",3,Enemy0Rate);
    InvokeRepeating("CreateEnemy1",5,Enemy1Rate);         
                                                    //InvokeRepeating(),延迟1s后,每EnemyRate时间后,执行CreateEnemy函数一次
    InvokeRepeating("CreateEnemy2",8,Enemy2Rate);
    InvokeRepeating("CreateAward1",30,Award1Rate);
    InvokeRepeating("CreateAward2",40,Award2Rate);}
public CreateEnemy0()
{
    float x= float x = Random.Range(-2.15f,2.15f);  //随机位置生成
    GameObject.Instantiate(Enemy0Prefab,Vector3(x,transform.position.y,0),Quaternion.identity); 
    //Instantiate函数生成物体
}
public void CreateEnemy1()
 {
    float x = Random.Range(-2.04f,2.04f);
    GameObject.Instantiate(Enemy1Prefab,new Vector3(x,transform.position.y,0),Quaternion.identity);
 }
 public void CreateEnemy2()
 {
    float x = Random.Range(-1.57f,1.57f);
    GameObject.Instantiate(Enemy2Prefab,new Vector3(x,transform.position.y,0),Quaternion.identity);
 }
 public void CreateAward1()
 {
    float x = Random.Range(-2.12f,2.12f);
    GameObject.Instantiate(AwardPrefab1,new Vector3(x,transform.position.y,0),Quaternion.identity);
 }
 public void CreateAward2()
 {
    float x = Random.Range(-2.12f,2.12f);
    GameObject.Instantiate(AwardPrefab2,new Vector3(x,transform.position.y,0),Quaternion.identity);
 }

     四、 两种子弹的发射(条件发射)

        思想:Instantiate+InvokeRepeating,构造openFire()控制

-----Gun( )-----
public GameObject bullet; //子弹实例
public float rate =0.2f //发射间隔
public Fire()
{
    GameObject.Instantiate(bullet,transform.positon,Quaternion.identity); //生成子弹
} 
public openFire()
{
    InvokeRepeating(Fire,1,rate);
}
public stopFire()
{
    CancelInvoke("Fire");
}
public Gun topGun;
public Gun leftGun;
public Gun rightGun;
public float superGunTime =10f;  //持续时间
public int gunCount =1; //触发切换标志位
void Strat()
{    
    resetsuperGunTime = superGunTime;
    superGunTime = 0;
    gunTop.OpenFire();
}
void Update()
{
    superGunTime-=time.deltaTime
    if(superGunTime>0)
    {
       if(gunCount=1)
       {
            transformToSuperGun()
        }
    } else
    {
       if(gunCount=2)
       {
            transformToNormalGun()
        }
    }
}
private void transformToSuperGun()
{
    gunCount=2;
    gunLeft.openFire();
    gunRight.openFire();
    gunTop.sotpFire();
}
private void transformToNormalGun()
{
    gunCount=1;
    gunLeft.stopFire();
    gunRight.stopFire();
    gunTop.openFire();
}
pubic void OnTriggerEnter2D()
{
    if(collider.tag=="Award")
  {
   Award award = collider.GetComponent<Award>();                        //(触发条件)碰撞检测
   if(award.type==0)
   {
    superGunTime = resetsuperGunTime;   //发生碰撞则重置标志位
    Destroy(collider.gameObject);
   }
}

         五、 鼠标(触摸)控制飞机的移动,及边界检测

        思想:GetMouseButtonDown()函数检测鼠标是否按下

public bool isMouseDown =false;
private Vector3 lastMousePosition =Vector3.Zero;  //初始位置
void Update()
{
    if(Input.GetMouseButtonDown(0))
    {
        isMouseDown =true;
    }
    if(Input.GetMouseButtonUp(0))
    {
        isMouseDown =false;
        lastMousePosition =Vector3.Zero;
    }
    if(isMouseDown)
    {
        Vector3 offSet =Input.mouseposition - lastMousePosition;   //鼠标位移量
        transform.position+=offSet;  //鼠标当前位置 = 鼠标初始位置 + 鼠标位移量
    }
    lastMousePosition = Input.mouseposition;  //更新鼠标位置
}

         注意:这样写有一个问题,所有的位置信息x、y、z都是像素坐标,而控制主角移动是以屏幕坐标为准,所以要把像素坐标转化为屏幕坐标:用到函数Camera.main.ScreenToWorldPoint()

         lastMousePosition = Input.mouseposition;    -->  lastMousePosition = Camera.main.ScreenToWorldPoint         ( Input.mouseposition);

         Vector3 offSet =Input.mouseposition - lastMousePosition;  -->  Vector3 offSet = Camera.main.ScreenToWorldPoint(Input.mouseposition) - lastMousePosition;

    边界检测:

void checkPositon()
{
    Vector3 pos =transform.position;   //得到当前位置
    float x =pos.x;
    float y =pos.y;
    if(x<-2.2f)
    x=-2.2f;
    if(x>2.2f)
    x=2.2f;
    if(y<-3.9f)
    y=-3.9f;
    if(y>3.4f)
    y=3.4f;
    transform.position = new Vector3(x,y,0);   //重置当前位置 
}

        六、 主角和敌机的死亡动画

    同主角的动画思想一致,只不过先要判断是否发生碰撞,若碰撞则播放动画。

        七、 UI界面部分

        思想:使用单例模式,统一在GameManager 里管理

using UnityEngine;
using System.Collections;
public class GameManager : MonoBehaviour 
{
 public static GameManager  _instance; 
}
void Awake()
{
    _instance=this;
}

    _instance是一个静态的句柄,在Awake()中指向自身实例,这样我们就可以在其它类中使用GameManager。_instance的形式直接取得GameManager实例,但是GameManager只能有一个实例。

© 著作权归作者所有

Magic__wu
粉丝 0
博文 10
码字总数 3489
作品 0
武汉
私信 提问
移动应用和游戏开发两个阶段在线视频培训的未来计划

在51CTO学院开线上视频课程已经3个多月了,也上了不少课。不过发现还有很多课没有开。现在就将未来的开课计划公布一下。计划分为两个阶段。第一阶段主要是Cocos2d-x和Cocos2d-js的游戏开发培...

androidguy
2018/06/29
0
0
微信demo小游戏:飞机大战从无到有

微信demo游戏飞机大战从无到有 现在创建新项目会默认给飞机大战的demo,这里给大家从基础开始讲解游戏的从无到有是怎么实现的。 具体实现步骤: 创建背景图->背景图运动起来->创建飞机并随背...

紫云之轩
06/09
0
0
iPhone飞机大战--plane-game

使用帧动画实现的飞机大战。实现飞机对战与积分。图片资源来源微信,仅作学习交流使用。

Chars-D
2015/12/16
900
0
无聊吗,写个【飞机大战】来玩吧

今天杭州又是大雨,被淋了个落汤鸡,都怪我家大狼狗非要骑电动车,我昨天吐槽要买的帅气的雨衣还没有买,不过大雨和飞机大战小游戏更配哦。 这篇文章来自我司的王老吉同学,欢迎大家关注公众号...

一个远近闻名的富婆
05/15
0
0
微信 的 飞机大战,在ipad, iphone, android 2.X 版本上跑不起来,有解决方案吗?

@mr-zhuo 你好,想跟你请教个问题:微信 的 飞机大战,在ipad, iphone, android 2.X 版本上跑不起来,有解决方案吗?

jincheng_me
2014/01/10
233
1

没有更多内容

加载失败,请刷新页面

加载更多

一篇文章教你轻松使用fastjson

前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的...

Java3y
30分钟前
4
1
分组功能(tapply,by,aggregate)和* apply系列

每当我想在R中做“ map” py任务时,我通常都会尝试在apply系列中使用一个函数。 但是,我从未完全理解它们之间的区别-{ sapply , lapply等}如何将函数应用于输入/分组输入,输出将是什么样...

javail
30分钟前
4
0
PHP环境搭建之单独安装

还在使用PHP集成环境吗?教你自定义搭建配置PHP开发环境,按照需求进行安装,安装的版本可以自己选择,灵活性更大。 目录: 1. 安装Apache 2. 安装PHP 3. 安装MySQL 4. 安装Composer 观看:h...

不冷的大叔
42分钟前
4
0
为什么JavaScript变量会以美元符号开头?

我经常看到JavaScript带有以美元符号开头的变量。 您何时/为什么选择以这种方式为变量添加前缀? (我不是在问您在jQuery和其他语言中看到的$('p.foo')语法,而是普通变量,例如$name和$orde...

技术盛宴
46分钟前
4
0
TCP 三次握手

https://my.oschina.net/u/4198159/blog/3141874

奋斗的小牛
55分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部