Commit 63d2a76c authored by 魔法少女赵志辉's avatar 魔法少女赵志辉 🍊
Browse files

Update documents for project3

parent de8e4538
\documentclass{dreamClass}
\def\CC{ {C\nolinebreak[4]\hspace{-.05em}\raisebox{.4ex}{\small\bf ++}} }
\title{
\vspace{-50pt}
\textbf{\Huge Project3}\\
\textbf{\huge 文档预览器}\\
\small Version 1.0.0
}
\author{刘添翼\thanks{\href{mailto:tyi.liu@outlook.com}{tyi.liu@outlook.com}}}
\affil{计算机科学与技术系,南京大学}
\date{\today}
\begin{document}
\maketitle
\thispagestyle{empty}
\section{最后期限}
Project3的最后期限是\textbf{北京时间2021年12月19日23时59分}
在此之前,每位同学需要提交课程项目的源码、可执行文件和项目报告到Github Classroom的对应于Project3的assignment中去。
\section{概述}
我们已经实现了一个支持多种格式的文档预览器!
是时候加入GUI,和实现一些(容易使用GUI实现的)实用功能了!
\section{原则}
预览器必须是从第一行代码开始写成的,符合面向对象和泛型程序设计范式的,\CC{}程序。
推荐使用第三方的\CC{}图形库来完成界面的绘制,键盘鼠标事件的捕获和处理等等内容,这样可以集中精力设计和实现预览器的架构。
推荐使用第三方的库来完成zip文件的解压缩和XML文件的读取。
预览器应当基于Project2中已经完成的部分,只在确实有必要的情况下重构已有的代码。
\section{技术指标}
我们凭借直觉,制订了这份技术指标。
本节是Project3的基本要求,其中描述的所有内容,除了显式说明成\emph{可以自由发挥}的之外,都需要完成。
\section{文件搜索界面}
在Project2中,我们已经实现了一个功能相对完备的预览器,但是这个预览器并不好用,其中一个原因是需要指定想要预览的文档的位置。
因此,在Project3中,我们需要实现一个即时的文件搜索界面,用于按照文档的文件名和扩展来搜索想要预览的文档。
具体的实现细节可以自由发挥,但笼统地说,在搜索界面,我们需要可以:
\begin{enumerate}
\item 指定一个根目录,只有在这个目录里的文档才可能成为搜索的结果。
\item 通过文档的扩展名筛选文档,只有扩展名符合某些条件的文档才可能成为搜索的结果。
\item 通过给出一个正则表达式,来筛选文档,只有文件名和该表达式匹配文档才可能成为搜索的结果。
\item 根据输入,即时展示所有搜索结果,而不需要敲回车键(这太棒了!)
\end{enumerate}
一旦从搜索界面选定一个文件,就可以进行预览。
\begin{note}
在测试时请\textbf{不要}用自己的个人文件夹作为根目录!编写不良的程序可能会删掉各位同学的文件,造成重大的损失!
\end{note}
\section{Q\&A}
\begin{problem}
我需要在Project3里实现GUI吗?
\end{problem}
对,至少需要实现一个能够以网页的形式展示HTML的界面,和一个能即时展示搜索结果的搜索界面。
功能相对完备的图形库大多带有可以渲染和展示HTML网页的设施。请查阅相关的手册然后自行尝试。
FLTK似乎没有;
wxWdigets的用户可以参考\url{https://docs.wxwidgets.org/3.0/classwx_web_view.html}
Qt的用户可以参考\url{https://doc.qt.io/qt-5/qtwebenginewidgets-module.html}
\begin{problem}
我应该使用哪个图形库?
\end{problem}
原则上任何一个都可以。实际一点的话,考虑到这个项目的现实情况,一个相对功能完备的图形库会比较合适。
具体而言,有良好的HTML渲染引擎,有文件管理相关的设施,有内置的XML解析器和文本编辑器的会比较合适。
\end{document}
\documentclass{dreamClass}
\def\CC{ {C\nolinebreak[4]\hspace{-.05em}\raisebox{.4ex}{\small\bf ++}} }
\title{
\vspace{-50pt}
\textbf{\Huge Project3}\\
\textbf{\huge 塔防游戏}\\
\small Version 1.0.0
}
\author{刘添翼\thanks{\href{mailto:tyi.liu@outlook.com}{tyi.liu@outlook.com}}}
\affil{计算机科学与技术系,南京大学}
\date{\today}
\begin{document}
\maketitle
\thispagestyle{empty}
\section{最后期限}
Project3的最后期限是\textbf{北京时间2021年12月19日23时59分}
在此之前,每位同学需要提交课程项目的源码、可执行文件和项目报告到Github Classroom的对应于Project3的assignment中去。
\section{概述}
我们已经完成了一个比较复杂的塔防游戏!
是时候加入GUI,和实现一些(容易使用GUI实现的)实用功能了!
\section{原则}
游戏必须是从第一行代码开始写成的,符合面向对象和泛型程序设计范式的,\CC{}程序。推荐使用第三方的\CC{}图形库来完成图形的绘制,键盘鼠标事件的捕获和处理等等内容,这样可以集中精力设计和实现游戏的架构。
游戏应当基于Project2中已经完成的部分,只在确实有必要的情况下重构已有的代码。
\section{技术指标}
我们参考《明日方舟》和《植物大战僵尸》等游戏,制订了这份技术指标。本节是Project3的基本要求,其中描述的所有内容,除了显式说明成\emph{可以自由发挥}的之外,都需要完成。
\subsection{展示单位的攻击和受伤效果}
在Project2中,我们实现了游戏的核心逻辑。
但是,如果远程单位在攻击时一声不响,近战单位在攻击时不展示任何动作,单位在受到攻击时也不会有任何变化,那么双方单位的血量就悄悄地减少着。这就会损害游玩的体验。
因此,在Project3中,我们需要在游戏的界面中展示双方单位的攻击和受伤效果:
\begin{enumerate}
\item 单位发起、受到攻击时,需要绘制出相应的效果。
\begin{itemize}
\item 不必播放一整段的动画,
\item 可以简单地把表示这个单位的图形闪烁一下,
\item 或者可以在它的头上飘一个数字,表示这个单位受到了多少伤害。
\item 欢迎其他的想法,总之,它只要动了就可以。
\end{itemize}
\item 对于远程单位,还需要表示出它在攻击哪个或者哪些敌方单位。
\begin{itemize}
\item 比如可以发射一些飞向敌方单位的飞行物,那么这种攻击不是立即生效的;
\item 也可以绘制一道光束之类,这种则属于立即生效的。
\item 非常欢迎其他的想法。
\end{itemize}
\end{enumerate}
\subsection{展示单位的状态}
现在单位已经有了攻击和受伤效果,但是我们还是需要表示出它们的状态。
因此,在Project3中,我们需要在游戏的界面中展示双方单位的重要状态:
\begin{enumerate}
\item 需要展示(存在血量的)单位的血量:
\begin{itemize}
\item 不必画出一条血槽,
\item 可以只是头顶的一个数字,
\item 或者可以通过表示单位的图形的颜色或者形状变化来表示,
\item 欢迎其他的想法,总之,只要能从界面中看出单位的血量就可以。
\end{itemize}
\item 需要展示处在特殊状态的单位的状态:
\begin{itemize}
\item 不必播放一整段的动画,
\item 可以只是简单闪烁几下,
\item 或者在单位附近贴一些小的图标,
\item 非常欢迎其他的想法。
\end{itemize}
\end{enumerate}
这些状态未必需要是常显的,见\cref{sec:mouse-interaction}
\subsection{用键鼠与单位进行互动}\label{sec:mouse-interaction}
现在只剩下键鼠操作了!
在Project3中,我们需要能用键鼠选定单位,以便直观地观察和改变单位的状态。在选定一个单位之后,需要能够:
\begin{enumerate}
\item 展示单位的攻击范围,
\begin{itemize}
\item 直接画在游戏界面上就可以,
\item 也可以只画攻击范围中处在某条路径上的部分。
\end{itemize}
\item 展示单位的重要状态,
\begin{itemize}
\item 直接画在游戏界面的某处就可以,
\item 也可以在一个新的窗口中展示。
\end{itemize}
\item 设置单位的策略。
\begin{itemize}
\item 对于存在朝向的单位,可以在此时设置其朝向;
\item 对于会自动放置其他单位的单位,可以在此时设置偏好的自动放置位置。
\item 其他情况可以自由发挥。
\end{itemize}
\end{enumerate}
\section{Q\&A}
\begin{problem}
我可以使用EasyX、Unreal Engine、NoesisGUI之类的库吗?
\end{problem}
可以,只要它们为程序的开发者提供的API是\CC{}的即可。
过于复杂和高级的库可能并不容易学习掌握,打包和发布程序或许也会相对困难;过于简单的库则缺乏一些必要的基础设施,会不必要地加大任务量。
一般来说,我们会推荐初学者使用一些成熟的、有良好文档的、容易上手的库,这样的库不必是Qt,或许某些(不为我们所熟悉的)专为游戏开发设计的库是最适合这个项目的。如果有同学对此有心得,欢迎联系我们。
\begin{problem}
我必须在Project3中实现一个GUI吗?
\end{problem}
是的。但如果很喜欢终端窗口的话,也可以用ncurses之类的库。如果不使用相关的库的话,可能需要自己重新造轮子来完成Project3的规定动作。
当然,也可以选择不完成某些在已有的程序架构下难以完成的规定动作,但这可能会影响项目的分数。
\begin{problem}\label{pro:new_idea}
我不喜欢这个游戏,我有一个新的想法。
\end{problem}
请带上新项目的文档来联系我们,我们很欢迎新的想法。
不过考虑到这是一门程序设计课的课程项目,我们可能会对新项目的扩展性有比较高的要求,因此可能难免会提出一些(或许看起来和这个项目并不搭的)要求。总体来说新的项目是被允许的,但是如果新的项目不能很好地体现这门课程的宗旨,或许项目的最高分数会打一些轻微的折扣。
\begin{problem}
我不喜欢某些规定动作,我可以改变/简化/删去它们吗?
\end{problem}
参见\cref{pro:new_idea}。请带上你的新想法的文档来联系我们。
如果经过我们评估,认为新的想法的难度适中,可以体现本课程的宗旨,那么是可以的;如果新的想法显然弱化了项目的难度或者和项目的根本宗旨不合,可能会轻微地影响项目的得分。
\begin{problem}
我没有美术天赋,我是不是需要自己硬着头皮画地图/单位/动画/…?
\end{problem}
完全不需要。
只要能够达意,不论是自制的美术素材,还是经授权使用的其他人的美术素材,或者只是简单的文本和字符,都是可以的。
\end{document}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment