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

//
// 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. Cmd Markdown 编辑阅读器

    我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想和分享知识提供更专业的工具. 您可以使用 Cmd ...

  2. Qt Windows打开指定文件注意替换双斜杠为单斜杠

    QProcess::startDetached(QString("explorer %1").arg(strFilePath)); 其中,在windows上使用时,strFileP ...

  3. Query the tables and index which will caus rebuild index fail

    On MSSQL server database, while rebuild index failed, we can use the follow sql statement to see if ...

  4. Hbasewindows系统下启动报错及解决办法

    今天在本地windows电脑上,装pinpoint时,需要先安装一个Hbase数据库,按照教程下载启动Hbase数据库时,却启动报错:java.io.IOException: Could not lo ...

  5. MySQL中case then用法

    1.查询图书价格,若价格为null,则显示unknown,若价格为10到20, 则显示10 to 20 SELECT price, CASE WHEN price='null' THEN 'UnKno ...

  6. 【警告】WARN: Establishing SSL connection without server's identity verification is not recommended.

    1.Java访问Mysql时出现如下警告: 2019-04-02 10:30:50.545 INFO 1290 --- [nio-8080-exec-1] com.zaxxer.hikari.Hika ...

  7. Archiva 2.2.3 安装运行的时候出现协议版本错误

    在 Archiva 安装成功后运行的时候出现协议版本错误: Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_ ...

  8. python中mysql数据库的操作-sqlalchemy

    MySQLdb支持python2.*,不支持3.* ,python3里面使用PyMySQL模块代替 python3里面如果有报错  django.core.exceptions.ImproperlyC ...

  9. python+unittest+requests+HTMLRunner编写接口自动化测试集

    问题描述:搭建接口测试框架,执行用例请求多个不同请求方式的接口 实现步骤: ① 创建配置文件config.ini,写入部分公用参数,如接口的基本url.测试报告文件路径.测试数据文件路径等配置项 [D ...

  10. Android测试(一)——Apk文件结构以及Android组件介绍

    APK文件结构: assests目录:一般存放的是不会被编译处理的文件,一般是资源性质的文件或者配置文件: libs目录:程序依赖的native库,包含针对特定处理器软件层的编译代码: res目录:存 ...