小妖精的完美游戏教室——东方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;
}
}
小妖精的完美游戏教室——东方project,同人,自机的更多相关文章
- 小妖精的完美游戏教室——东方PROJECT,同人,墙
//================================================================//// Copyright (C) 东方同人社// All Rig ...
- 小妖精的完美游戏教室——东方PROJECT,同人,符卡系统
//================================================================//// Copyright (C) 东方同人社// All Rig ...
- 小妖精的完美游戏教室——东方PROJECT,同人,th12灵梦A
╮(╯▽╰)╭没办法,小妖精Balous也很讨厌学院化的教育呀,一点意义都没有. 这次就上传东方地灵殿灵梦A逻辑部分的核心代码吧,估计连老师都看不懂.动画部分的代码就不放上来了. //======== ...
- 小妖精的完美游戏教室——东方PROJECT,同人,子机
//================================================================//// Copyright (C)// All Rights Re ...
- 小妖精的完美游戏教室——人工智能,A*算法,引言
今天也要直播魔法,求科学的! 欢迎来到小妖精Balous的完美游戏教室! 经过前两周的学习,相信米娜桑已经对状态机有所了解了呢~虽然状态机能够实现几乎所有的人工智能,但是,在实践中,你们有没有发现,自 ...
- 小妖精的完美游戏教室——人工智能,A*算法,启发因子篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- 小妖精的完美游戏教室——人工智能,A*算法,导航网络篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- 小妖精的完美游戏教室——人工智能,A*算法,结点篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- 小妖精的完美游戏教室——人工智能,A*算法,实现篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
随机推荐
- LINQ之路16:LINQ Operators之集合运算符、Zip操作符、转换方法、生成器方法
本篇将是关于LINQ Operators的最后一篇,包括:集合运算符(Set Operators).Zip操作符.转换方法(Conversion Methods).生成器方法(Generation M ...
- 浅谈String中的==和对象中引用对象类型的==
@Test public void test02() { StringBuffer sb = new StringBuffer(); sb.append('a'); sb.append(11); Sy ...
- BluetoothGattCallback
/** * 用于实现 BluetoothGatt 的回调 */public abstract class BluetoothGattCallback { /** * GATT客户端连接或断开到远程的时 ...
- 以太坊钱包开发系列2 - 账号Keystore文件导入导出
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...
- 覃超:Facebook的项目开发流程和工程师的绩效管理机制
覃超:Facebook的项目开发流程和工程师的绩效管理机制 http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992350&am ...
- JAVA多线程 总结
1. Thread 和 Runnable java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接 ...
- 查看局域网指定IP的电脑名
nbtstat -a 192.168.0.139 节点 IP 址址: [192.168.0.140] 范围 ID: [] NetBIOS 远程计算机名称表 名称 类型 状态 ------------- ...
- leetcode-algorithms 目录
leetcode算法目录 题号 链接 难度等级 36 leetcode-algorithms-36 Valid Sudoku medium 35 leetcode-algorithms-35 Sear ...
- PostgreSQL work_mem理解
官方说法: work_mem (integer) Specifies the amount of memory to be used by internal sort operations and h ...
- select * from 后有多个表的使用方法
已知一个表的结构为: ------------------- 姓名 科目 成绩 张三 语文 20 张三 数学 30 张三 英语 50 李四 语文 70 李四 数学 60 李四 英语 90 怎样通过 ...