Java 游戏开发:关于Java面向对象的知识(一)
软件的生命周期(了解即可)
由于我们是大专生 这里的生命周期是之前软件工程的笔记,你们了解就可以了
什么是软件的生命周期
一个软件从被开发到被正式弃用的过程,就是一个软件的生命周期(说白了 就是一个游戏的开服到停服)他还有一个术语叫做"系统开发生命周期"。
周期的模型
从需求提出的那一刻开始,软件产品就进入了软件生命周期,模型大致分为 瀑布模型(阶梯模型) 结构模型
图上的结构向瀑布一样的模型叫做瀑布模型(自己做的可能有点简陋…)
结构模型类似这样
面向对象开发:OO的生命周期的阶段
现在我们有一个业务需要完成——一个虚幻引擎打造的游戏,要完成这个任务,我们需要经历以下的阶段:
面向对象的分析OOA
分析:对开发程序的每个阶段进行的详细的分析,要是实现的功能的分析,要实现的系统的分类
也就是需求的分析
面向对象的设计OOD
一种OOA到OOP的过渡:
面向对象的编程OOP
就是编程咯~
方法(函数)
简单地方法
方法与函数的区别
函数:可以实现一定功能的代码块
方法:存放在类里面可以实现一定功能的单独的代码块
在Java、C++、C#为例子的语言中 函数必须在方法里面,所以在Java中所提到的函数都可以是方法
在Python、lua 、VB这些语言中,函数可以在类外面定义,所以函数是函数 方法是方法
ps:有些时候 方法叫做类方法
既然方法可以实现一个功能 ,我们可以将其理解成一个工具,如何定义一个特定功能的方法,是一个简单的事情:
public class Test{
// 定义了一个叫做Test的类
public static void SayHello(){
// 这里定义了一个方法,下面的代码是方法的代码块
System.out.println("我在说话");
}
public static void main(String[] args){
SayHello(); // 使用方法
}
}
其中语法就是:
[权限修饰符] [静态修饰符] 返回值 方法名称(参数类型 参数名称){
代码块;
}
至于什么是权限修饰符 什么是静态修饰符 我们之后可以细讲 现在你可以省略他们(但是入口方法的不要省略)
public class Test{
void SayHello(){
// 这样的写法也可以
}
}
Q&A Time
Q:但是我们这样就无法在入口使用方法了,怎么解决呢?
A:main 是被 static 修饰的方法 所以他是静态的方法 静态的方法中不可以使用非静态的类成员(类成员就是方法与属性的统筹)
Q:如何解决?
A:给Speak()方法进行static的修饰即可:
Q:那么非静态的方法一般是怎样被调用的呢?
非静态的方法可以调用非静态的方法…
参数
有些时候我们需要给方法传入一个参数,用来控制代码的逻辑,比如我在写Galgame的时候(就是简单的对话游戏:像是草猫 之类的),我写了一个方法,这个方法实现了显示某个人物的语言信息,类似于这样:
public class GameMain{
static void Speak(){
String name = "旁白";
String speakInfo = "欢迎光顾本游戏,我是负责吐槽的旁白君";
Image touXiang = PANGBAI; // 旁白的头像图片
.... // 窗口设置的信息省略
}
}
图中,所圈出的信息可能随着游戏的进展发生不同的人物的不同的对白,这些是我们可以人为控制的,所以我们可以使用参数来对这些需要变动的量 进行调整
其中人物的名称我们可以知道是String 类型的 对话的信息也是String类型的 人物的头像我们姑且他是Image自定义的类型的,这三个变量是需要改动的,所以我们要传入三个参数
public class GameWindow{
...
public static void Speak(String name,String speakInfo ,Image touXiang){
.... // 窗口设置的信息省略
}
public static void main(String[] args){
Speak("旁白","这个是可以自定义的",PANGBAI);
}
}
这样我们就可以简单的实现旁白的自定义对话了
思考
既然如此,我们可不可以使用二维数组将我们对话的剧本信息呢?
就像是这样
{
{“商人”,“那跟在你旁边的人是谁?”},
{“玩家”,“那是我的应急食物”},
{“派蒙”,“我才不是呢”}
}
的数组,然后使用下标,遍历这个数组 然后每次遍历之后得到的元素作为参数传入Speak方法中 , 不就实现了连贯的对话?
应急食物的梗来自游戏原神,emm…
说着有趣了起来,打开编辑器,让我们来尝试着写写,但是我们暂时没有学习窗口,我们就试试简单地 console(控制台) 的打印:
public class game {
static void speak(String name,String info){
System.out.println(name+":");
System.out.println(" "+ info);
}
public static void main(String[] args) {
String[][] speakArray = {
{"商人","那跟在你旁边的人是谁?"},
{"玩家","那是我的应急食物"},
{"派蒙","我才不是应急食物呢"}
};
// 一个简答的迷你小剧本
for (String[] littleArray:speakArray){
speak(littleArray[0],littleArray[1]);
}
}
}
运行结果就是这样:
说一下关于方法的作用域
我在方法外部创建了一个值 A ,然后我将 A 这个值作为了参数传入了方法B 中 ,方法B 对传入的参数进行了修改,但是即使如此,A的值还是不会发生任何的改变。
额,说的比抽象类还抽象…那么我们先来一段代码,你看看这个代码做个评价?
public class game {
static void changeValue(int a){
// 3 、 啊 c 被作为 参数 将 值 给了 a 变量
a = 234567; // 4 、 a 的值发生了改变
}
public static void main(String[] args) {
int c = 2; // 1 、 我定义了一个c,他的值是2
changeValue(c); // 2 、 让c变量去changeValue在磨练下自己
System.out.print(c); // 5、 打印 c
}
}
你猜猜返回值是多少
如果答案是2 的话,恭喜你,你是有悟性的
至于为什么是2,看看第三步,c其实没有真正的进入changeValue方法的内存空间中,只是将c的值给了a,让 a 作为 c 进行工作,你以为 c 在方法里面拼命工作?其实他只是招了个临时小工,自己在一边风凉着呢~
我们再来看看这样的代码:
public class game {
static int c = 23; // 1、 定义一个全局的成员变量
static void changeValue(){
//
c = 234567; // 3 、 c 被无情的修改了
}
public static void main(String[] args) {
changeValue(); // 2 、 使用changeValue
System.out.print(c); // 4、 打印 c
}
}
首先你一定会对第一步的全局变量进行疑问?
我们先来介绍一下这个半途杀出的嘉宾,全局变量,在介绍全局变量之前我们先来复习一下作用域,果然你还记得,大括号之间 是一个作用域,
我们有两个方法 A方法 与 B方法 A方法里面定义了Value 这个Value变量一般的 B方法是使用不了的 因为 Value 是A方法作用域的,我们来看看全局变量 他是game类作用域里面的,A方法与B方法正好也是game类作用域的,正好同级,那么就可以AB互用
emm… 看不懂?通俗一点:农民A有块地属于本人,上面中了土豆,农民B有块地,上面中了番茄,B农民不能去拿A农民的土豆,拿了就是犯罪(交易的话不算诶),A农民不能拿B的番茄,拿了也是犯罪 ,刚好就在AB双方的农场中间有个公共的厕所,那么AB双方都可以使用这个厕所,因为他是对外的,所以在写代码的时候 厕所就是全局变量
讲到这里你可以猜猜 c变量的值了对吧…
因为c变量是厕所 全局变量,所以main与changeValue都可以使用这个变量,changeValue可以使用当然可以修改,他将c修改成了234567那么在打印c的时候,c的值就是:
好了差不多今天的笔记就到这里了,这里留下道题,你可以试着做做:
public class game {
static int c = 23;
static void changeValue(int a){
c = 12345;
a = 234567;
}
public static void main(String[] args) {
changeValue(c);
System.out.println(c);
System.out.println(a);
}
}
/*
1 、上述代码会打印什么?
A、12345
234567
B、12345
12345
C、234567
234567
D、12345
报错
E、234567
12345
*/
差不多先预习到这里,明天我们在学习进一步的知识
mk:LiuBoyuan
下节课的链接