20170817 - 今日技能封装 - Q

重点 整体流程体会。
①子类构造调用静态块加载的东西
②敌机与蜜蜂用一个父类共同讨论

1 敌人进场
2 飞行物走一步
3 子弹入场
4 英雄机随鼠标移动
5 删除越界的飞行物

2 如何理解定时发生?

3 如何引入定时类?

4 如何让程序定时发生?

5 静态方法中可以调用类内方法吗?

思路梳理
飞行物走步用定时方法,每隔10ms运行一次,
因此定义各类的走步方法,先抽象到父类中,再在子类中重写。
子类写完后,只要在定时方法中调用即可。

这个先后顺序还是比较关键的,

一开始加载是没有敌人的,所以初始化赋值为空,后面开始运行了,就往数组里面装东西,
再(在主流程中)调用repaint()

自然化编程,无需考虑太多,直接按照对象需求编程,

6 如何进行定时控制?

7 0.1%2=?
1%2=?
2%2=?

8 任何数取余2的结果是?
0或1.

//思维薄弱点

image = images[index++/10%images.length];
/*

index++;
int a = index/10;
int b = a%2;
image = images[b];
*/

② 对变量的作用域及来龙去脉一定要非常清晰。
定义在类体内,定义在函数内,定义在其上函数。

public void run(){
enterAction();
//10点35分调用重画,自动调用paint方法,将数组中数据重新画出。
stepAction();//飞行物走一步 
hero.shoot();
repaint();
};
定义在了定时run里面,结果每次都重新加载,导致y坐标一直都是377;

bullets = hero.shoot();
public void stepAction(){
hero.step();
//遍历数组
for(int i = 0;i < flyings.length;i++){
flyings[i].step();
}
for(int i = 0;i < bullets.length;i++){
bullets[i].step();
}
for(int i = 0;i < bullets.length;i++){
bullets[i].step();
}

}
定义在了stepAction外,根本没传进去,y坐标还是获取y的private Bullet[] bullets = {}; 中的坐标,即无;

public void enterAction(){
//敌人进场--敌机加小蜜蜂
flyIndex++;
if(flyIndex%40 == 0){
FlyingObject obj = nextOne();
bullets = hero.shoot();
flyings = Arrays.copyOf(flyings,flyings.length+1);
flyings[flyings.length-1] = obj;

}
}

public void enterAction(){
flyIndex++;
if(flyIndex%40 == 0){
FlyingObject obj = nextOne();
flyings = Arrays.copyOf(flyings,flyings.length+1);
flyings[flyings.length-1] = obj;

}
}
最终定义了在其(stepAction)上的函数enterAction()内,成功赋值.
public void run(){
enterAction();
stepAction();//飞行物走一步 
repaint();

③ public void shootAction(){
shootIndex++;
if(shootIndex%30==0){//每300毫秒走一次
Bullet[] bs = hero.shoot();
bullets = Arrays.copyOf(bullets, bullets.length+bs.length);
//扩容
System.arraycopy(bs, 0, bullets, bullets.length-bs.length, bs.length);
//数组的追加

子弹是怎么动起来的?

④ public boolean outOfBounds(){
if(y >= ShootGame.HEIGHT){
return true;
}else{
return false;
}
}

public boolean outOfBounds(){
return this.y <= ShootGame.HEIGHT;
}

3 swing事件触发分为什么?
侦听器,事件,处理,

4 一个抽象类可否不重写?
可以,只要这个抽象类内无抽象方法.(Adapter)

创建敌人写在了主类上,因为敌人就是在窗口上随机产生的

子弹是英雄机发射的(英雄机的行为),所以写在英雄机里

先写行为,页面再调

目标是,在框内显示所有对象并让他们动起来

分为敌机进场,子弹开始动,英雄机随鼠标移动,删除越界敌机

--------------------
过程思维漏洞记录
①abstract方法后,类需要立刻抽象化

public abstract class FlyObject

思路必须极其清晰,清晰到什么程度?

最少要知道前面三步,后面两步是要做什么

如飞机大战项目

整体框架是——在主类窗口类中将各个对象画上去

细节框架则分别是各个对象的创建,以及大小对象间的调用(非父子类,而是主次的调用关系,如英雄机中的发射子弹方法调用子弹对象,主类中的窗口类调用各对象)

具体到实践:

在确定是调用timer来定时循环执行代码块实现飞机大战的效果后,不确定将repaint放在哪, 结合定时循环思考(脑中必须有一个清晰的流程,哦前一步是这个,那我这一步就应该这样) 后明白repaint必须不断反复加载,并且是在重复代码块的前方,实现整体的动态加载效果,再来分别将敌机,小蜜蜂,英雄机,子弹步进的效果实现

拓展:

一些可以作为指导思想的面向对象编程原则

如何判断方法写在哪个类中?

如果是对象自身的行为,则写在对象内。(英雄机发射子弹,于是发射子弹方法便写在英雄机内——但并不是直接便将包括画子弹的函数也写在内部,该原则亦需要根据实际情况做调整,上课过程中老师强调过很多次的一句话,在类内部写行为,在主类中调方法,这里需要结合大框架思考来确定方法的编写——由于是在主类(继承了JPanel)中将对象画出来,因此不是直接在函数中将子弹画出来,而是返回一个子弹类型的值交由主类去画)

时间: 2024-08-02 23:10:26

20170817 - 今日技能封装 - Q的相关文章

20170731 - 今日技能封装 - Q

1 服务器简单的理解是什么? 2 服务器一般使用什么系统?为什么? 3 Windows系统中的ABCD目录相当于Linux系统下的什么? 4 Linux系统有盘符? 5 Linux系统下插入U盘,U盘目录在? 6 Linux主目录在? 7 Java一般用于什么开发? 8 Linux操作系统下如何查看当前目录路径? 9 Linux下如何查看当前目录内文件? 10 Liunx下如何跳出当前目录到上一层级? 11 Linux下如何直接跳转到主目录? 12 linux可以在任意位置跳转到绝对路径吗?如何

20170812 - 今日技能封装 - Q

1 静态方法加载几次? 2 类内方法需要加static吗?类外方法呢? 3 class aa{ } BOO xx(){ } bb.x() cc.row++上方代码分别是什么含义? 4 判断返回值类型应看哪里? 5 定义成员变量的方式有几种?可以直接在成员变量下,方法外定义吗? 6 final关键字需要掌握什么?final可以修饰什么? 对应情况的含义分别是? 7 static修饰关键词需要掌握什么? 不同情况下的含义分别是什么? static修饰的成员变量存储在哪? 可否定义一个不赋值的静态成员

20170811 - 今日技能封装 - Q

1 什么是单一继承?继承是否具有传递性? 4 子类重写父类方法后,可通过super.父类方法访问父类方法,请举应用例子 5 重写的方法可以访问子类的对象吗? 8 重写与重载的区别有哪些? 8 分析如上代码,输出结果为? class Super {public void f() {System.out.println ("super.f()");}} class Sub extends Super {public void f() {System.out.println ("s

20170804 - 今日技能封装 - Q

public class addition9 { public static void main(String[] args) { //for循环10次//循环变量是次数//变体是10的乘等long ten = 10;long result = 0;int num = 0;long value = 0;for(int times = 1;times <= 10;times++){//每次乘等于10,每次ten的值都比上一轮大一个级别value = ten - 1;System.out.print

20170819 - 今日技能封装 - Q

1 继承无抽象方法的抽象类,不重写方法会报错吗?不会. 2 实现接口时需注意什么?方法前必须加public,由于接口内默认为抽象方法,一般前缀为public(一般会加) abstract,子类访问权限默认要大于父类,所以必须加上public 3 可以强转的条件是什么?被强转对象实际上是强转成的类型.如果是转换成接口类实例,则对象对应的类必须也实现了该接口(相当于小转大,对象所属的类实现了接口,新建的对象向上造型接口类引用. 4 类内部调用自身的常量或静态变量是否需要添加类名?不需要,类内部已自动

20170810 - 今日技能封装 - Q

需列入每日问题--题目思路回溯. 1 猜数字游戏思路是? 2 构造器,构建器是什么? 3 this只可以用在哪里? 4 new出来的是什么? 5 数组属于基本类型还是引用类型? 6 基本类型数组是什么类型数据? 7 如何创建引用类型数组? 8 引用类型数组内元素默认值为多少? 9 给引用类型数组元素赋值应如何编写? 10 cells[0] = new cell(2,5);cells[0]是什么类型数据,在哪?装了什么? 11 问cells[0].row为多少? cells[0] = cells[

20170817 - 今日技能封装 - A

重点 整体流程体会.①子类构造调用静态块加载的东西②敌机与蜜蜂用一个父类共同讨论③ 1 敌人进场2 飞行物走一步3 子弹入场4 英雄机随鼠标移动5 删除越界的飞行物 2 如何理解定时发生?自动发生 3 如何引入定时类?import java.util.Timer;import java.util.TimerTask; Timer timer = new Timer(); int interval = 10; timer.schedule(new TimerTask(){ public void

20170803 - 今日技能封装 - Q

1 如何生成0-0.99999的随机小数?使用其生成0-1000的随机数需注意什么? 2 while的语法是? 3 如何跳出while循环? 4 循环三要素有哪些? 5 循环的关键在于?三要素的关键在于?循环10次,每次变量a加1,结果与循环变量是什么? 5.5 累加1-100的是? 6 循环结构有?区别是?如何选择? 7 Java中else..if分支结构,可以省略else吗? 8 Java中定义了类型后后续还可以改变吗? 9 下例输出的是浮点数还是整型? double num = Math.

20170802 - 今日技能封装 - Q

1 算术运算符有哪些? 2 取余的运算符是?取余也叫? 3 小数可以取余吗? 4 小除大取余余数为? 5 取余余数为零即什么? 6 char可以取余吗? 7 int a = 5,b = 5; a++; ++b; println(a); println(b); 结果分别是? 8 int a = 5,b = 5; int c = a++; int d = ++b; println(a); println(b); println(c); println(d); 8.5 a++,++b在被使用时发生了什