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

//
// 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. NPOI解决由于excel删除数据导致空行读取问题

    1.解决问题思路一:申明判断是否空行变量用于判断是否空行,声明变量数组用于临时非空行数据,最后存于datatable中. /// <summary>读取excel, /// 默认第一行为表 ...

  2. [LspTrace]ReadAccConfig returns false! QT

    当qt运行出现以下信息时 [LspTrace]ReadAccConfig returns false! [LspTrace]FindMatchingProvider: inInfo is one of ...

  3. svn版本备份和恢复注意事项

    转帖的,因为我经常要用到,所以也在我的博客上记录一下:  注意:备份不备份日志,你想备份日志就要单独在客户端备了,具体步骤百度上都有 svn备份常用命令1.完全备份和增量备份svn.svnadmin  ...

  4. promise封装的ajax

    var  myNewAjax=function(url){ return new Promise(function(resolve,reject){ var xhr = new XMLHttpRequ ...

  5. Kubernetes 路由问题&网络问题

    error 信息: kubectl 获取node的host地址 kubectl get pods -n $namespace -o wide 或者在Kubernetes的service中进行查看 ku ...

  6. 函数func_get_args详解

    func_get_args ------获取一个函数的所有参数 function foo() { $numargs = func_num_args(); //参数数量 echo "参数个数是 ...

  7. sublime设置html在浏览器打开

    1.快捷键 Ctrl+Shift+P输入:pcip选择第一个 2.输入:View In Browser安装此插件 3.菜单栏Preferences->Key Bindings  输入:[{ &q ...

  8. 大数据技术之_19_Spark学习_04_Spark Streaming 应用解析 + Spark Streaming 概述、运行、解析 + DStream 的输入、转换、输出 + 优化

    第1章 Spark Streaming 概述1.1 什么是 Spark Streaming1.2 为什么要学习 Spark Streaming1.3 Spark 与 Storm 的对比第2章 运行 S ...

  9. gulp点滴

    var gulp = require('gulp'), connect = require('gulp-connect'), browserify = require('gulp-browserify ...

  10. [Jenkins] 配置任务中的坑s

    Jenkins 坑1:sh: adb: command not found 背景:在任务中使用了adb命令 adb 使用时要在服务器上配Android-home的环境变量的 配置完成之后发现在服务器上 ...