网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 964|回复: 0
打印 上一主题 下一主题

Java项目实战之天天酷跑 (八)

[复制链接]

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

跳转到指定楼层
楼主
发表于 2021-2-24 19:37:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
游戏主界面代码如下:
  1. package cn.sqc.runday.controller;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.Image;
  6. import java.awt.event.KeyEvent;
  7. import java.awt.event.KeyListener;
  8. import java.io.File;
  9. import java.io.IOException;
  10. import java.util.Arrays;

  11. import javax.imageio.ImageIO;
  12. import javax.swing.JPanel;

  13. import cn.sqc.runday.model.Barrs_1;
  14. import cn.sqc.runday.model.Barrs_2;
  15. import cn.sqc.runday.model.Barrs_3;
  16. import cn.sqc.runday.model.Barrs_4;
  17. import cn.sqc.runday.model.Barrs_5;
  18. import cn.sqc.runday.model.Person;
  19. import cn.sqc.runday.view.EndFrame;
  20. import cn.sqc.runday.view.GameFrame;

  21. /**
  22. * @author Huey
  23. *2020-11-27  下午12:28:44
  24. * 游戏主面板类,核心逻辑类
  25. *           1、背景图片滚动效果
  26. *           2、玩家动态效果
  27. *           3、五种障碍物的出现
  28. *           4、玩家和障碍物的碰撞逻辑
  29. *           5、暂停、继续逻辑
  30. *           6、结束逻辑
  31. */

  32. public class GamePanel extends JPanel implements KeyListener{
  33.         /**2、生成动态的背景图片***/
  34.         //2.1声明背景图片对象
  35.         Image background;
  36.         Image score;
  37.         Image pause;//暂停
  38.         Image  proceed;//继续.
  39.         
  40.         
  41.         /***3.实现玩家的动态效果和移动功能***/
  42.         //3.1创建玩家对象(类的实例化)
  43.         Person person;
  44.         Barrs_2 barrs_2;//宠物
  45.         Barrs_4 barrs_4;//鱼钩等障碍物
  46.         Barrs_5 barrs_5;//金币
  47.         /**4.实现螃蟹障碍物*/
  48.         //4.1
  49.         Barrs_1[]barrs1 = {};//存储螃蟹数组(没有元素,可以扩容)
  50.         Barrs_3[]barrs3 ={};//导弹
  51.         Barrs_4[]barrs4={};//鱼钩
  52.         Barrs_5[]barrs5 = {};//金币
  53.         
  54.         public GamePanel() {
  55.                 //3.2
  56.                 person = new Person();//调用Person类的构造方法,创建对象并赋值
  57.                 barrs_2 = new Barrs_2();
  58.                 //2.2读取图片文件
  59.                 try{
  60.                         background =ImageIO.read(new File("Image/cc.png"));//跑酷背景
  61.                         score =ImageIO.read(new File("Image/a12.png"));//得分背景
  62.                         pause = ImageIO.read(new File("Image/b2.png"));
  63.                         proceed = ImageIO.read(new File("Image/b1.png"));
  64.                 }catch(IOException e){
  65.                         e.printStackTrace();
  66.                 }
  67.         }
  68.         //2.5
  69.         int x=0;//背景图片初始位置
  70. @Override
  71. public void paint(Graphics g) {
  72.         super.paint(g);
  73.         //2.7
  74.         if(flag){
  75.                 x-=20;//图片滚动的速度
  76.         }
  77.                 //2.3绘制背景图片(动态切换很流畅)
  78.                 g.drawImage(background, x, 0, GameFrame.WIDTH, GameFrame.HEIGHT, null);
  79.                 g.drawImage(background, x+GameFrame.WIDTH, 0, GameFrame.WIDTH, GameFrame.HEIGHT,null);
  80.                 if(x<=-GameFrame.WIDTH){//实现两张图片之间的切换
  81.                         x = 0;
  82.                 }
  83.         
  84.         //3.3绘制 玩家
  85.         person.paintPerson(g);
  86.         //绘制螃蟹
  87.         for(int i =0;i<barrs1.length;i++){
  88.                 barrs1[i].paintBarrs(g);
  89.         }
  90.         //绘制宠物
  91.         barrs_2.paintBarrs(g);
  92.         //绘制导弹
  93.         for(int i =0;i<barrs3.length;i++){
  94.                 barrs3[i].paintBarrs(g);
  95.         }
  96.         //随机绘制鱼钩障碍物
  97.         for(int i =0;i<barrs4.length;i++){
  98.                 barrs4[i].paintBarrs(g);
  99.         }
  100.         //随机绘制金币
  101.         for(int i = 0;i<barrs5.length;i++){
  102.                 barrs5[i].paintBarrs(g);
  103.         }
  104.         
  105.         
  106. //位置越往下,图层越往上
  107.         //绘制玩家分数
  108.         g.drawImage(score, 120, 50,null);
  109.         g.setColor(Color.ORANGE);
  110.         g.setFont(new Font("宋体",Font.BOLD,30 ));
  111.         g.drawString("玩家得分:"+person.getScore()+"分", 133, 95);
  112.         
  113.         //绘制暂停、继续标识图片
  114.         if(flag){
  115.                                         g.drawImage(proceed, 200, 800, 90,90,null);
  116.         }else{
  117.                                 g.drawImage(pause, 200, 800, 90, 90, null);
  118.         }
  119.         
  120. }

  121. //生                成        障        碍        物        的        方        法
  122. int index =0;
  123. public void enteredAction(){//实现源源        不        断        生成障碍物的效果
  124.         index++;
  125.         //生成螃蟹障碍物
  126.         if(index%100==0){
  127.                 //生成一个螃蟹
  128.                 Barrs_1 b1 = new Barrs_1();
  129.                 Barrs_3 b3 = new Barrs_3();
  130.                 Barrs_4 b4 = new Barrs_4();
  131.                
  132.                 barrs1 =Arrays.copyOf(barrs1,barrs1.length+1);//数组扩容
  133.                 barrs1[barrs1.length-1]= b1;//放到数组最后一个元素的位置
  134.                 //System.out.println("测试"+barrs1.length);               
  135.                 barrs3 =Arrays.copyOf(barrs3,barrs3.length+1);
  136.                 barrs3[barrs3.length-1]= b3;
  137.                 barrs4 =Arrays.copyOf(barrs4,barrs4.length+1);
  138.                 barrs4[barrs4.length-1]= b4;
  139.         }
  140.         if(index%15==0){
  141.                 Barrs_5 b5 = new Barrs_5();
  142.                 barrs5 = Arrays.copyOf(barrs5, barrs5.length +1);
  143.                 barrs5[barrs5.length-1] = b5;
  144.         }
  145. }


  146. //移                动        方        法
  147. public void stepAction(){
  148.         //3..4
  149.                 person.step();//切换玩家的图片—>动起来
  150.                 person.drop();//不断下坠
  151.                 barrs_2.drop();
  152.                 //螃蟹障碍物移动
  153.         for(int i =0;i<barrs1.length;i++){
  154.                 barrs1[i].step();
  155.                 //判断当前障碍物是否 越界,并做越界处理
  156.                 if(barrs1[i].outofBounds()){
  157.                         //删除越界的螃蟹障碍物
  158.                         barrs1[i] = barrs1[barrs1.length - 1];//将螃蟹数组最后一个元素,赋给越界的螃蟹,覆盖了,相当于间接删除了。
  159.                         barrs1= Arrays.copyOf(barrs1, barrs1.length - 1);//数组缩容
  160.                 }
  161.         }
  162.         
  163.         barrs_2.step();
  164.         
  165.         for(int i =0;i<barrs3.length;i++){
  166.                         barrs3[i].step();
  167.                 //删除越界的导弹障碍物
  168.                 if(barrs3[i].outofBounds()){
  169.                         barrs3[i] = barrs3[barrs3.length - 1];
  170.                         barrs3 = Arrays.copyOf(barrs3, barrs3.length - 1);
  171.                 }
  172.         }
  173.         
  174.         for(int i =0;i<barrs4.length;i++){
  175.                 barrs4[i].step();
  176.                 //删除越界的鱼叉障碍物
  177.                 if(barrs4[i].outofBounds()){
  178.                 barrs4[i] = barrs4[barrs4.length - 1        ];
  179.                 barrs4 = Arrays.copyOf(barrs4, barrs4.length - 1);
  180.                 }
  181.         }
  182.         for(int i = 0;i<barrs5.length;i++){
  183.                 barrs5[i].step();
  184.                 if(barrs5[i].outofBounds()){
  185.                         //删除越界的金币
  186.                         barrs5[i] = barrs5[barrs5.length - 1];
  187.                         barrs5 = Arrays.copyOf(barrs5, barrs5.length - 1);
  188.                 }
  189.         }
  190. }

  191. //玩家和障碍物碰撞的处理方法
  192. public void pengAction(){
  193.         //判断玩家是否和螃蟹障碍物进行碰撞
  194.         for(int i = 0;i<barrs1.length;i++){//上下左右都写了,下是用不到的
  195.                 if(person.getX() + Person.WIDTH >= barrs1[i].getX() &&
  196.                 person.getX() <= barrs1[i].getX()         + Barrs_1.WIDTH  &&
  197.                 person .getY() +Person.getHeight() >= barrs1[i].getY() &&
  198.                 person.getY()        <= barrs1[i].getY () + Barrs_1.HEIGHT){
  199.                         //碰撞后的处理(遮挡类障碍物)
  200.                         if(person.getX() + Person.WIDTH <= barrs1[i].getX() + Barrs_1.WIDTH){//防止人在右边,碰撞后可以穿过障碍物
  201.                                 //左碰撞
  202.                                 person.setX(barrs1[i].getX()  - Barrs_1.WIDTH);
  203.                         }else{
  204.                                 //右碰撞
  205.                                 person.setX(barrs1[i].getX()+ Barrs_1.WIDTH        );
  206.                         }                                                
  207.                 }
  208.         }
  209.         //判断玩家是否和导弹障碍物进行碰撞
  210.         for(int i = 0;i<barrs3.length;i++){
  211.                 if(person.getX() + Person.WIDTH >= barrs3[i].getX() &&
  212.                 person.getX() <= barrs3[i].getX()         + Barrs_3.WIDTH  &&
  213.                 person .getY() +Person.getHeight() >= barrs3[i].getY() &&
  214.                 person.getY()        <= barrs3[i].getY () + Barrs_3.HEIGHT){
  215.                         if(person.getX() + Person.WIDTH <= barrs3[i].getX() + Barrs_3.WIDTH){//玩家的宽度(120px)是比障碍物小的
  216.                                 //左碰撞
  217.                                 person.setX(barrs3[i].getX()  - Barrs_3.WIDTH);
  218.                         }else{
  219.                                 //右碰撞
  220.                                 person.setX(barrs3[i].getX()+ Barrs_3.WIDTH        );
  221.                         }        
  222.                 }
  223.         }
  224.         //判断玩家是否和鱼叉障碍物进行碰撞
  225.         for(int i = 0;i<=barrs4.length -1;i++){//小心数组越界!
  226.                 if(person.getX() + Person.WIDTH >= barrs4[i].getX() &&
  227.                 person.getX() <= barrs4[i].getX() + Barrs_4.WIDTH &&
  228.                 person.getY() + Person.HEIGHT >= barrs4[i].getY() &&
  229.                 person.getY() <= barrs4[i].getY() + Barrs_4.HEIGHT        ){
  230.                         if(person.getX() + Person.WIDTH <= barrs4[i].getX() + Barrs_4.WIDTH        ){
  231.                                 //左碰撞
  232.                                 person.setX(barrs4[i].getX() - Barrs_4.WIDTH);
  233.                         }else{
  234.                                 //右碰撞
  235.                                 person.setX(barrs4[i].getX()+ Barrs_4.WIDTH        );
  236.                         }        
  237.                 }
  238.         }
  239.         //玩家和金币的碰撞
  240.         for(int i = 0;i<barrs5.length;i++){
  241.                 if(person.getX() + Person.WIDTH >= barrs5[i].getX() &&
  242.                 person.getX() <= barrs5[i].getX()         + Barrs_5.WIDTH  &&
  243.                 person .getY() +Person.getHeight() >= barrs5[i].getY() &&
  244.                 person.getY()        <= barrs5[i].getY () + Barrs_5.HEIGHT){//判断玩家与金币的碰撞
  245.                         if(person.getX() + Person.WIDTH <= barrs5[i].getX() + Barrs_5.WIDTH){
  246.                                 //删除当前金币
  247.                                 barrs5[i]        = barrs5[barrs5.length - 1];
  248.                                 barrs5 = Arrays.copyOf(barrs5, barrs5.length - 1);
  249.                                 
  250.                                 //玩家加分
  251.                                 int score = person.getScore();
  252.                                 person.setScore(score + 10);
  253.                    }
  254.                 }
  255.         }
  256.                
  257. }
  258. //结束逻辑
  259.         public  void gameOverAction(){
  260.                 if(person.outOfBounds()){
  261.                         //程序结束
  262.                         isGameOver = true;
  263.                         //传递数据(创建结束界面)
  264.                         new EndFrame(person);//面向对象思想
  265.                         //数据清空
  266.                         person = new Person();
  267.                         barrs1 = new Barrs_1[]{};
  268.                         barrs3 = new Barrs_3[]{};
  269.                 }
  270.                
  271.         }
  272.         public static boolean isGameOver = false;
  273.         boolean flag = true;
  274. //2.8        创        建        一        个        程        序        启        动        的         方        法
  275. public void action(){
  276.         new Thread(){//匿名内部类
  277.                 //重写run方法
  278.                 public void run() {
  279.                         while(!isGameOver){
  280.                                 //3.4
  281.                                 if(flag){
  282.                                                 enteredAction();//细节:只有先生成了障碍物后,下面才能调用移动障碍物的方法
  283.                                                 stepAction();
  284.                                                 pengAction();//玩家和障碍物碰撞
  285.                                                 gameOverAction();
  286.                                        
  287.                                 }
  288.                                 //重绘方法
  289.                                 repaint();
  290.                                 //线程休眠
  291.                                 try {
  292.                                         Thread.sleep(60);
  293.                                 } catch (Exception e) {
  294.                                         // TODO: handle exception
  295.                                         e.printStackTrace();
  296.                                 }
  297.                         }
  298.                         
  299.                 };
  300.         }.start();//创建一个线程并启动

  301.         }

  302. @Override
  303. public void keyTyped(KeyEvent e) {
  304.         // TODO Auto-generated method stub
  305.         
  306. }

  307. @Override
  308. public void keyPressed(KeyEvent e) {
  309.         //获取玩家当前位置坐标
  310.          int x = person.getX();
  311.          int y = person.getY();
  312.          int x1 = barrs_2.getX();
  313.          int y1 = barrs_2.getY();

  314.         //上
  315.                 if(e.getKeyCode() == KeyEvent.VK_UP        &&                y > 10        &&                y1 > 10){
  316.                         person.setY(y-25);
  317.                         barrs_2.setY(y-25);
  318.                 }
  319.                         //下
  320.                 if(e.getKeyCode()== KeyEvent.VK_DOWN        &&                y<=560                &&                y1<560){
  321.                         person.setY(y+30);
  322.                         barrs_2.setY(y-30);
  323.                 }
  324.                 //左
  325.                 if(e.getKeyCode()==KeyEvent.VK_LEFT                &&         x>=0        ){
  326.                         person.setX(x-30);
  327.                         barrs_2.setX(x1-30);
  328.                         
  329.                 }
  330.                 //右
  331.                 if(e.getKeyCode()==KeyEvent.VK_RIGHT){
  332.                         person.setX(x+22);
  333.                         barrs_2.setX(x1+22);
  334.                         if(x>=GameFrame.WIDTH-Person.WIDTH){//如果人物到了右边界
  335.                                 person.setX(GameFrame.WIDTH-Person.WIDTH);
  336.                         }
  337.                         if(x1>=GameFrame.WIDTH-barrs_2.WIDTH){//如果宠物到了右边界
  338.                                 barrs_2.setX(GameFrame.WIDTH - barrs_2.WIDTH);
  339.                         }
  340.                 }
  341.                 //暂停 继续功能
  342.                 if(e.getKeyCode() == KeyEvent.VK_SPACE){
  343.                                 flag = !flag;
  344.                 }
  345.                
  346.         }

  347. @Override
  348. public void keyReleased(KeyEvent e) {
  349.         // TODO Auto-generated method stub
  350. }
  351. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-4-20 14:52 , Processed in 0.059935 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表