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

//
// 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;
}
}

小妖精的完美游戏教室——东方project,同人,自机的更多相关文章

  1. 小妖精的完美游戏教室——东方PROJECT,同人,墙

    //================================================================//// Copyright (C) 东方同人社// All Rig ...

  2. 小妖精的完美游戏教室——东方PROJECT,同人,符卡系统

    //================================================================//// Copyright (C) 东方同人社// All Rig ...

  3. 小妖精的完美游戏教室——东方PROJECT,同人,th12灵梦A

    ╮(╯▽╰)╭没办法,小妖精Balous也很讨厌学院化的教育呀,一点意义都没有. 这次就上传东方地灵殿灵梦A逻辑部分的核心代码吧,估计连老师都看不懂.动画部分的代码就不放上来了. //======== ...

  4. 小妖精的完美游戏教室——东方PROJECT,同人,子机

    //================================================================//// Copyright (C)// All Rights Re ...

  5. 小妖精的完美游戏教室——人工智能,A*算法,引言

    今天也要直播魔法,求科学的! 欢迎来到小妖精Balous的完美游戏教室! 经过前两周的学习,相信米娜桑已经对状态机有所了解了呢~虽然状态机能够实现几乎所有的人工智能,但是,在实践中,你们有没有发现,自 ...

  6. 小妖精的完美游戏教室——人工智能,A*算法,启发因子篇

    //================================================================//// Copyright (C) 2017 Team Saluk ...

  7. 小妖精的完美游戏教室——人工智能,A*算法,导航网络篇

    //================================================================//// Copyright (C) 2017 Team Saluk ...

  8. 小妖精的完美游戏教室——人工智能,A*算法,结点篇

    //================================================================//// Copyright (C) 2017 Team Saluk ...

  9. 小妖精的完美游戏教室——人工智能,A*算法,实现篇

    //================================================================//// Copyright (C) 2017 Team Saluk ...

随机推荐

  1. spring boot2+jpa+thymeleaf增删改查例子

    参考这遍文章做了一个例子,稍微不同之处,原文是spring boot.mysql,这里改成了spring boot 2.Oracle. 一.pom.xml引入相关模块web.jpa.thymeleaf ...

  2. HTML基础(2)——边框

    边框:(尺寸 样式 颜色) div{border:1px solid red;} 样式可能的值: dotted(点状边框,在大多数浏览器里呈现实线) dashed(虚线.在大多数浏览器中呈现为实线) ...

  3. Spring.Net —IOC详解

    一. Spring.net中IOC介绍 1. 什么是IOC,控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中 ...

  4. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  5. C++类的大小计算

    转自http://www.tuicool.com/articles/uiUJry 一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分? 一个Class对 ...

  6. 七天学会ASP.NET MVC ——深入理解ASP.NET MVC

    七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC   系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二) ...

  7. Android中如何解决editText一进入activity就自动获取焦点的bug

    有时候我们在进入activity 的时候,EditText会自动聚焦 有人说搞个宽高 都为0dp的EditText 但是我们搞代码的肯定要从实际层面解决,这样更能说服人 所以只需要在EditText的 ...

  8. CSS清除浮动的方法及优缺点

    浮动是CSS布局里面用的比较多的属性.浮动的框向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 因为浮动会使当前元素产生向上浮的效果,所以浮动的元素会脱离正常的文档流,它包围的内容在 ...

  9. python functiontools模块中的 wraps

    直接上代码看效果: # 定义一个最简单的装饰器 def user_login_data(f): def wrapper(*args, **kwargs): return f(*args, **kwar ...

  10. MVC 简介

     是AOP (Aspect-Oriented Programming.面向侧 面的程序设计或面向方面的程序设计,是对面向对象程序设计的改进和扩展)内的概念 当 一 件事被细分为各个单元后,各个单元的复 ...