3D游戏编程 homework 2

简答题

游戏对象运动的本质是什么?

在游戏中一个对象的运动都是相对于某一个坐标系的运动,实质上就是坐标的改变,通过坐标改变的速度以及方法实现各种运动。

请用三种方法以上方法,实现物体的抛物线运动

方法一:使用向量计算出每个时刻球应该在的位置,再把这个向量的坐标赋给球的位置,通过translate函数实现

public class move : MonoBehaviour
{
    private float vx = 5f, vy = 0f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 po = new Vector3(Time.deltaTime * vx, Time.deltaTime * vy, 0);
        this.transform.Translate(po);
        vy = vy - 10 * Time.deltaTime;
    }
}

方法二:对物体的position进行直接更改

public class move : MonoBehaviour
{
    private float vx = 5f, vy = 0f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 po = new Vector3(Time.deltaTime * vx, Time.deltaTime * vy, 0);
        this.transform.position += po;
        vy = vy - 10 * Time.deltaTime;
    }
}

方法三:使用vector3的差值函数实现

public class move : MonoBehaviour
{
    private float vx = 5f, vy = 0f;
    // Use this for initialization
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 po = new Vector3(Time.deltaTime * vx, Time.deltaTime * vy, 0);
        transform.position = Vector3.Lerp(transform.position, transform.position + po, 1);
        vy -= 10 * Time.deltaTime;
    }
}
写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上

主要是用到了RotateAround函数来实现各个行星绕太阳的旋转。然后对于法平面的控制主要由Vector3向量来实现,而速度则是RotateAround的第三个参数。代码如下:

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

public class move : MonoBehaviour
{
    
    // Use this for initialization
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        GameObject.Find("水星").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 50 * Time.deltaTime);
        GameObject.Find("金星").transform.RotateAround(Vector3.zero, new Vector3(1, 1, 0), 55 * Time.deltaTime);
        GameObject.Find("地球").transform.RotateAround(Vector3.zero, new Vector3(2, 0, 0), 60 * Time.deltaTime);
        GameObject.Find("月亮").transform.RotateAround(GameObject.Find("地球").transform.position, Vector3.up, 300 * Time.deltaTime);
        GameObject.Find("火星").transform.RotateAround(Vector3.zero, new Vector3(1, 2, 0), 65 * Time.deltaTime);
        GameObject.Find("木星").transform.RotateAround(Vector3.zero, new Vector3(0.2f, 1, 0), 70 * Time.deltaTime);
        GameObject.Find("土星").transform.RotateAround(Vector3.zero, new Vector3(0.3f, 1, 0), 75 * Time.deltaTime);
        GameObject.Find("天王星").transform.RotateAround(Vector3.zero, new Vector3(0.4f, 1, 0), 85 * Time.deltaTime);
        GameObject.Find("海王星").transform.RotateAround(Vector3.zero, new Vector3(-0.7f, 1, 0), 80 * Time.deltaTime);
    }
}

搭建的模型如下:
在这里插入图片描述
运行过程截图如下:
在这里插入图片描述
在这里插入图片描述

编程实践

阅读以下游戏脚本

Priests and Devils

Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the river. They all want to get to the other side of this river, but there is only one boat and this boat can only carry two persons each time. And there must be one person steering the boat from one side to the other side. In the flash game, you can click on them to move them and click the go button to move the boat to the other direction. If the priests are out numbered by the devils on either side of the river, they get killed and the game is over. You can try it in many > ways. Keep all priests alive! Good luck!

程序需要满足的要求:

play the game ( http://www.flash-game.net/game/2535/priests-and-devils.html )
列出游戏中提及的事物(Objects)
用表格列出玩家动作表(规则表),注意,动作越少越好
请将游戏中对象做成预制
在 GenGameObjects 中创建 长方形、正方形、球 及其色彩代表游戏中的对象。
使用 C# 集合类型 有效组织对象
整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成!!! 。 整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的 通讯耦合 语句。 违背本条准则,不给分
请使用课件架构图编程,不接受非 MVC 结构程序
注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!

  1. 游戏中的事物
    游戏中主要有牧师、魔鬼、小船、河岸、河水。

  2. 玩家动作表

动作条件
上岸船里有人,船在岸边
上船船上人数小于2,人和船在相同的岸边
下船船上有人,船在岸边
开船船上有人,船在岸边
成功牧师和魔鬼都在左岸
失败有至少一个牧师死亡
牧师被吃一边的岸上加船上(如果传靠岸)牧师数量小于魔鬼数量

为了使用MVC模型,所以需要将控制与图像物体区分开来编写主要采用了往届师兄的代码。
首先为了达到各个脚本文件之间的通信,所以使用到命名空间,这个命名空间放到Base.cs文件中,在这个文件中还定义了之后需要使用到的各种函数。主要的有Director导演,实例化唯一的一个导演来对游戏进行控制,还有对船的相关操作的定义控制,对系统需要响应的动作的控制,对岸边的控制,其中河岸与船实际上都可以使用实例化来解决。
然后是对view的控制,使用userGUI与clickGUI来分别定义用户的操作,(例如开始与重来)与点击事件(上船,下船,船过河)
详细的过程可以看代码的注释部分。
游戏运行过程如下
在这里插入图片描述
恶魔与牧师
运行视频

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值