java intersects,java游戏总结

知识点

1.图片塞标签里

privateJPanel panel =newJPanel();ImageIcon image =newImageIcon("src/images/Startimage.png");JLabel lab =newJLabel(image);lab.setBounds(0, 0, 1500, 1000);panel.add(lab);

2.画笔画

g.drawImage(image,0,0,1500,1000,null);

1.把图片添加到标签里(把标签的大小设为和图片大小相同),把标签放在分层面板的最底层;

2.把窗口面板设为内容面板并设为透明、流动布局

3.之后把组件和面板添加到窗口面板

JFrame frm =newJFrame("背景图片测试");ImageIcon bg =newImageIcon("src/image/lol.jpg");//把图片添加到标签里JLabel label =newJLabel(bg);//把标签的大小设为和图片大小相同label.setSize(bg.getIconWidth(), bg.getIconHeight());//把标签放在分层面板的最底层frm.getLayeredPane().add(label,newInteger(Integer.MIN_VALUE));//把窗口面板设为内容面板JPanel pan = (JPanel) frm.getContentPane();//把窗口面板设为透明pan.setOpaque(false);//把窗口面板设为流动布局pan.setLayout(newFlowLayout());//把窗口的大小设为和图片大小相同frm.setSize(bg.getIconWidth(), bg.getIconHeight());//设置窗口相对于指定组件的位置。如果组件当前未显示或设置为null,则将此窗口置于屏幕中央frm.setLocationRelativeTo(null);frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setVisible(true);

显示一个对话框,显示消息'alert':

JOptionPane.showMessageDialog(null,"alert","alert", JOptionPane.ERROR_MESSAGE);JOptionPane.showMessageDialog(null,"关于游戏:略","关于游戏",JOptionPane.INFORMATION_MESSAGE);

显示选项是/否和消息'选择一个的信息面板:

JOptionPane.showConfirmDialog(null,"chooseone","choose one", JOptionPane.YES_NO_OPTION);JOptionPane.showConfirmDialog(null,"是否退出游戏?","标题",JOptionPane.YES_NO_OPTION);

publicTimertimer=newTimer();publicTimerTask timerTask =newTimerTask() {@Overridepublicvoid run() {}};timer.schedule(timerTask,0,250);

实例化一个Timer 再实例化一个 TimerTask 作为 timer.schedule 方法的参数;其中 delay参数表示 延迟多少毫秒后开始,period 参数表示 间隔多少毫秒后执行依次

Object [] e = c.toArray();for(inti=0;i< e.length;i++){    Object o = e[i];···}

for(inti=0;i< c.size();i++){    Object o = c.get(i);···}

Iterator it = c.iterator();while(it.hasNext()){    Object o =it.next();···}

//定义内部类,实现接口classMyActListerimplementsActionListener{    }//在主函数中bt.addActionListener(newMyActlister);

bt.addActionListener(newActionListener(){//重写接口方法···});

(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

newThread() {@Overridepublicvoidrun() {System.out.println("我的线程执行了2");}}.start();

把技能和小兵对应的矩形对象加入容器中,嵌套循环进行碰撞检测

//技能与小兵检测publicvoidbump(){for(inti =0; i < BatmansNum; i++) {for(intj =0; j < qNum; j++) {if(btr.get(i).intersects(qr.get(j))) {batmans.get(i).reset();point++;if(qr.get(j).getWidth() ==20) {qs.get(j).reset();}}}}}//ez与小兵检测publicvoidbump2(Rectangle rectangle){for(inti =0; i < BatmansNum; i++) {if(rectangle.intersects(btr.get(i))) {isOpen =false;frm.dispose();newEndJPanel();}}}

绝对路径:以盘符为基准

相对路径:以文件当前所在文件夹为基准

..表示当前文件夹的上一文件夹

主函数先创建框架对象,后创建面板对象,将面板对象添加到框架中,运行后图片不显示,窗口放大后显示图片,可能是因为setvisible函数的位置放在了添加面板前。然后换一种方法在框架类中创建面板类对象,在框架类构造函数中添加面板,框架类构造函数中setvisible函数的位置放在添加面板前,运行后图片却会显示。

解决:应该取决于执行画图的代码块和setvisible函数执行的先后顺序,若画图在前,图片直接显示。画图在后,需要刷新一次才会显示。 setVisible(true);方法的意思是说数据模型已经构造好了,允许JVM可以根据数据模型执行paint方法开始画图并显示到屏幕上了,并不是显示图形,而是可以运行开始画图了

用两个集合容器存储小兵和技能对应数量的矩形对象,把矩形相交检测写一个方法,把方法放在小兵类的线程中,但是不知道怎么准确获取容器中想要的那个矩形对象,再获取其位置。又把两个容器添加矩形对象写成两个方法加进小兵类线程,然后加进矩形相交检测方法,再分别清除两容器的对象,后线程休眠,重画,循环这个过程,但执行后不知道为什么出现空指针异常。

解决:把矩形相交检测写进线程

人物边界检测中需要加输出语句线程才能实现功能

因为数据没有同步,更改的数据并没及时传递给另一个进程,所以出现2个进程都停止的现象。因为jvm的运行机制关系,打印语句会触发进程重新去内存读取最新数据,所以线程又变正常了。

解决:要相互传递数据需要加同步。可以为边界检测的方法加上synchronized,就不需要输出语句。

游戏得到一定分数会跳出胜利面板,在胜利面板点击重新游戏,会跳到开始面板,点击开始游戏,会快速跳过游戏面板,跳出胜利面板

解决:在产生新面板前将分数变量初始化为0。

用dispose()方法关闭窗体会释放该窗体的占用的部分资源,不过不是全部的,只是屏幕资源。

游戏人物没碰到敌人也会死

最后发现是容器在存入敌人对象时,对象的图片没有加进去,对象在移动但是图片没有显示出来

解决:用软件把图片改成所需的尺寸再重新加入图片包中

思路是先算出x和y的位移差,因为x和y位移差的不同,人物还要在同一时间走完x和y的位移差,所以设置一个时间,用这个时间算出对应的x速度和y速度,在用这两个量去让人物移动,但是实践后实现不了。

解决:学长的思路是算出鼠标和人物的距离,设置一个速度,用三角关系算出x速度和y速度,再改变成正确的速度方向去实现移动,最后到达的位置和理想位置存在一个误差,位置到了误差范围内改变布尔值让线程中的代码块暂停执行。

有时候人物到达鼠标点击位置后直接重新出现在窗口左上角

//判断距离取绝对值是否小于10,小于10说明到达重点isRun为false经测试应该不能比10更精确if(this.getDistance()<10) {this.isRun =false; setX(mouseX);setY(mouseY);}

解决:数据类型不匹配,把这两个值强制转换为int类型就好了。原理不清楚

//判断距离取绝对值是否小于10,小于10说明到达重点isRun为false经测试应该不能比10更精确if(this.getDistance() <10) {this.isRun =false; setX((int)mouseX);setY((int)mouseY);}

写游戏中有的要用的知识点不是很熟练,有的还要结合着书才能写出来代码,有的长时间没有用过已经快忘了

解决:以后要定期的复习书,巩固学过的知识

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值