zoukankan      html  css  js  c++  java
  • 小妖精的完美游戏教室——东方project,同人,自机

    //================================================================

    //
    // Copyright (C)
    // All Rights Reserved
    //
    // Author:小妖精Balous

    //

    //Summary:啊咧咧,小妖精Balous因为要应付学校的作业,同时要照顾新手程序员,所以把项目改成了东方project同人作了呢~

    //      向神主大人致敬!然后,这是段自机代码的初稿呢~~不知米娜桑能不能看得小妖精Balous写的代码呢~~~~
    //
    //================================================================

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public abstract class Player : MonoBehaviour
    {
    public GameObject baseBullet;
    /// <summary>
    /// 子机
    /// </summary>
    public GameObject subCraft;
    private List<SubCraft> subCraftList;

    /// <summary>
    /// 残机,最大为8
    /// </summary>
    public int player
    {
    get
    {
    return _player;
    }
    set
    {
    if (value > 8) _player = 8;
    else if (value < 0) _player = 0;
    else _player = value;
    }
    }
    private int _player;
    /// <summary>
    /// 残机碎片,收集5个增加1残机
    /// </summary>
    public int playerFragment
    {
    get
    {
    return _playerFragment;
    }
    set
    {
    if (value <= _playerFragment || player == 8) return;
    _playerFragment++;
    if(_playerFragment == 5)
    {
    _playerFragment = 0;
    _player++;
    }
    }
    }
    private int _playerFragment;

    /// <summary>
    /// 力量,最大为4.00
    /// </summary>
    public float power
    {
    get
    {
    return _power;
    }
    set
    {
    if (value > 4f) _power = 4f;
    else if (value < 0f) _power = 0f;
    else _power = value;

    if (subCraft != null)
    {
    int difference = (int)_power - subCraftList.Count;
    while (difference > 0)
    {
    GameObject subCraftClone = Instantiate(subCraft);
    subCraftList.Add(subCraftClone.GetComponent<SubCraft>());
    difference--;
    }
    while (difference < 0)
    {
    SubCraft subCraftClone = subCraftList[subCraftList.Count - 1];
    subCraftList.Remove(subCraftClone);
    Destroy(subCraftClone.gameObject);
    difference++;
    }
    }
    }
    }
    private float _power;

    /// <summary>
    /// 炸弹,最大为8
    /// </summary>
    public int bomb
    {
    get
    {
    return _bomb;
    }
    set
    {
    if (value > 8) _bomb = 8;
    else if (value < 0) _bomb = 0;
    else _bomb = value;
    }
    }
    private int _bomb;
    /// <summary>
    /// 炸弹碎片,收集5个增加1炸弹
    /// </summary>
    public int bombFragment
    {
    get
    {
    return _bombFragment;
    }
    set
    {
    if (value <= _bombFragment || bomb == 8) return;
    _bombFragment++;
    if(_bombFragment == 5)
    {
    _bombFragment = 0;
    _bomb++;
    }
    }
    }
    private int _bombFragment;

    /// <summary>
    /// 擦弹
    /// </summary>
    public int graze
    {
    get
    {
    return _graze;
    }
    set
    {
    if (value <= 0) _graze = 0;
    else if (value > _graze)
    {
    _graze++;
    _score += 300;
    }
    }
    }
    private int _graze;

    /// <summary>
    /// 得分
    /// </summary>
    public int score
    {
    get
    {
    return _score;
    }
    set
    {
    if (value < 0) _score = 0;
    else if (value > 999999999) _score = 999999999;
    else _score = value;
    }
    }
    private int _score;

    /// <summary>
    /// 无敌持续时间,大于0f为无敌
    /// </summary>
    protected float invincibleTime;
    /// <summary>
    /// 距离下次自机子弹生成的剩余时间,大于0f不会生成子弹
    /// </summary>
    private float shootTime;
    /// <summary>
    /// 距离下次可以使用炸弹的剩余时间,大于0f不能使用炸弹
    /// </summary>
    protected float bombTime;
    /// <summary>
    /// 自机子弹生成间隔
    /// </summary>
    public float timeInterval;

    public float normalMoveSpeed;
    public float slowMoveSpeed;
    private float moveSpeed;

    protected virtual void Move()
    {
    if (Controller.Slow()) moveSpeed = slowMoveSpeed;
    else moveSpeed = normalMoveSpeed;

    //up,left,down,right
    int[] direction = new int[4] { 0, 0, 0, 0 };
    if (Controller.LeftArrow()) direction[1] = 1;
    if (Controller.DownArrow()) direction[2] = 1;
    if (direction[1] == 0 && Controller.RightArrow()) direction[3] = 1;
    if (direction[2] == 0 && Controller.UpArrow()) direction[0] = 1;

    int count = 0;
    foreach (int i in direction) count += i;

    if (count == 0) return;
    if (count == 1)
    {
    if (direction[1] == 1) transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
    else if (direction[3] == 1) transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
    else if (direction[2] == 1) transform.Translate(Vector3.down * moveSpeed * Time.deltaTime);
    else transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
    }
    else
    {
    if (direction[2] == 1) transform.Translate(Vector3.down * moveSpeed * Time.deltaTime * 0.7071067812f);
    else if (direction[0] == 1) transform.Translate(Vector3.up * moveSpeed * Time.deltaTime * 0.7071067812f);
    if (direction[1] == 1) transform.Translate(Vector3.left * moveSpeed * Time.deltaTime * 0.7071067812f);
    else if (direction[3] == 1) transform.Translate(Vector3.right * moveSpeed * Time.deltaTime * 0.7071067812f);
    }
    }

    protected virtual void Init()
    {
    player = 3;
    power = 1f;
    bomb = 3;
    graze = 0;
    score = 0;
    invincibleTime = 3f;
    shootTime = 0f;
    bombTime = 0f;
    _playerFragment = 0;
    _bombFragment = 0;

    subCraftList = new List<SubCraft>();
    if (subCraft != null)
    {
    GameObject subCraftClone = Instantiate(subCraft);
    subCraftList.Add(subCraftClone.GetComponent<SubCraft>());
    }
    }

    protected virtual void Shoot()
    {
    GameObject baseBulletClone = Instantiate(baseBullet, transform.position + new Vector3(-0.1f, 0.2f, 0f), Quaternion.identity);
    Destroy(baseBulletClone, 13f);
    baseBulletClone = Instantiate(baseBullet, transform.position + new Vector3(0.1f, 0.2f, 0f), Quaternion.identity);
    Destroy(baseBulletClone, 13f);
    }

    protected abstract void Bomb();

    void Start ()
    {
    Init();
    }

    void Update ()
    {
    if (invincibleTime > 0f) invincibleTime -= Time.deltaTime;
    if (bombTime > 0f) bombTime -= Time.deltaTime;
    if (shootTime > 0f) shootTime -= Time.deltaTime;

    Move();

    if (shootTime <= 0f && Controller.Shoot() && baseBullet != null)
    {
    shootTime += timeInterval;
    Shoot();
    }

    if (Controller.BombDown() && bombTime <= 0f) Bomb();
    }

    private void OnEnable()
    {
    if (GameManager.player != null) Debug.LogError("你尝试创建2个Player,这种情况不允许!");
    GameManager.player = this;
    }

    private void OnDisable()
    {
    GameManager.player = null;
    }
    }

  • 相关阅读:
    vijos p1782——借教室(noip2012提高组第2题)
    vijos p1781——同余方程(noip2012提高组第1题)
    vijos p1905——生活大爆炸版 石头剪刀布(noip2014提高组第一题)
    URAL_1018 二叉苹果树
    b_lc_统计同构子字符串的数目(找规律 / dp)
    a_lc_完成所有工作的最短时间(暴搜 / 状压)
    lc_b_栈和队列设计(都需要不断踢出非法元素的过程)
    a_lc_缺失的第一个整数 I~II(暴力 / 不断放到正确位置)
    b_lc_最短无序连续子数组(暴力 / )
    b_lc_把二叉搜索树转换为累加树(逆中序遍历 / 迭代)
  • 原文地址:https://www.cnblogs.com/balous/p/6820480.html
Copyright © 2011-2022 走看看