代码分享:用Java开发的《星际争霸》游戏

开发 后端
《星际争霸》这个游戏对于网友们来说并不陌生,但是如果要是用Java来编写出《星际争霸》不知道大家听说过没?下面的就是一位很彪悍的人物用Java写的《星际争霸》游戏,而且效果相当逼真。

代码说明:

《星际争霸》这个游戏对于网友们来说并不陌生,但是如果要是用Java来编写出《星际争霸》不知道大家听说过没?下面的就是一位很彪悍的人物用Java写的《星际争霸》游戏,而且效果相当逼真。

源代码附件大家自己下载吧,可以研究研究。导入工程后,src/test目录下打开TestGameCore.java可直接运行游戏。


Java代码(由于代码比较多,只贴出一部分):

Control.java

  1. package core;  
  2.  
  3. import java.awt.Color;  
  4. import java.awt.Component;  
  5. import java.awt.Graphics;  
  6. import java.awt.event.InputEvent;  
  7. import java.awt.event.KeyEvent;  
  8. import java.awt.event.KeyListener;  
  9. import java.awt.event.MouseAdapter;  
  10. import java.awt.event.MouseEvent;  
  11. import java.awt.event.MouseMotionAdapter;  
  12.  
  13. import javax.swing.KeyStroke;  
  14. /**  
  15.  * 用户交互控制  
  16.  * @author Administrator  
  17.  */ 
  18. public class Control {  
  19.       
  20.     private int x, y, dx, dy, width, height;  
  21.  
  22.     private boolean dragged, moveing;  
  23.  
  24.     private Component component;  
  25.  
  26.     private ControlDragListener dragLister = new ControlDragListener();  
  27.  
  28.     private ControlMoveListener moveLister = new ControlMoveListener();  
  29.       
  30.     private ControlKeyListener keyLister = new ControlKeyListener();  
  31.  
  32.     private DragListener dragListener;  
  33.       
  34.     private MoveListener moveListener;  
  35.       
  36.     private LeftPressListener leftPressListener;  
  37.       
  38.     private RightPressListener rightPressListener;  
  39.       
  40.     private KeyPressListener keyPressListener;  
  41.       
  42.       
  43.     public static final int LEFT_MOUSE = 1;  
  44.       
  45.     public static final int RIGHT_MOUSE = 3;  
  46.         
  47.     public Control(Component mouseComponent,Component keyComponent) {  
  48.           
  49.         this.component = mouseComponent;  
  50.         component.addMouseListener(dragLister);  
  51.         component.addMouseMotionListener(moveLister);  
  52.         keyComponent.addKeyListener(keyLister);  
  53.     }  
  54.  
  55.       
  56.     public void drag(Graphics g) {  
  57.  
  58.         if (dragged && moveing) {  
  59.             g.setColor(Color.red);  
  60.             width = Math.abs(dx - x);  
  61.             height = Math.abs(dy - y);  
  62.             g.drawRect(Math.min(x, dx), Math.min(y, dy), width, height);  
  63.         }  
  64.     }  
  65.     /**  
  66.      * 新增鼠标拖放回调  
  67.      * @param dragCallBack  
  68.      */ 
  69.     public Control addDragListener(DragListener dragCallBack){  
  70.         this.dragListener = dragCallBack;  
  71.         return this;  
  72.     }  
  73.     /**  
  74.      * 新增鼠标移动回调  
  75.      * @param moveListener  
  76.      * @return  
  77.      */ 
  78.     public Control addMoveListener(MoveListener moveListener){  
  79.         this.moveListener = moveListener;  
  80.         return this;  
  81.     }  
  82.       
  83.     public Control addLeftPressListener(LeftPressListener selectCallBack){  
  84.         this.leftPressListener = selectCallBack;  
  85.         return this;  
  86.     }  
  87.       
  88.     public Control addRightPressListener(RightPressListener selectCallBack){  
  89.         this.rightPressListener = selectCallBack;  
  90.         return this;  
  91.     }  
  92.       
  93.     public Control addKeyPressListener(KeyPressListener keyPressListener){  
  94.         this.keyPressListener = keyPressListener;  
  95.         return this;  
  96.     }  
  97.       
  98.        
  99.     /**  
  100.      * 内部类,处理鼠标点击  
  101.      */ 
  102.     private class ControlDragListener extends MouseAdapter {  
  103.  
  104.         public void mousePressed(MouseEvent e) {  
  105.               
  106.             //如果是左键  
  107.             if(e.getButton()==LEFT_MOUSE){  
  108.                 x = e.getX();  
  109.                 y = e.getY();  
  110.                 dragged = true;  
  111.                   
  112.                 if(leftPressListener!=null){  
  113.                     leftPressListener.press(x, y);  
  114.                 }  
  115.             //如果是右键   
  116.             } else if(e.getButton()==RIGHT_MOUSE){  
  117.                   
  118.                 if(rightPressListener!=null){  
  119. //                  System.out.println(e.getX()+","+e.getY());  
  120.                     rightPressListener.press(e.getX(), e.getY());  
  121.                 }  
  122.             }  
  123.         }  
  124.           
  125.  
  126.         public void mouseReleased(MouseEvent e) {  
  127.               
  128.             //如果需要有回调  
  129.             if(dragListener!=null&&dragged&&moveing){  
  130.                  int tx = Math.min(x, dx);  
  131.                  int ty = Math.min(y, dy);  
  132.                  int tdx = Math.max(x, dx);  
  133.                  int tdy = Math.max(y, dy);  
  134.                 dragListener.drag(tx, ty, tdx, tdy);  
  135.             }  
  136.             x = 0;  
  137.             y = 0;  
  138.             dx = 0;  
  139.             dy = 0;  
  140.             dragged = false;  
  141.             moveing = false;  
  142.         }  
  143.     }  
  144.     /**  
  145.      * 内部类,处理鼠标移动  
  146.      */ 
  147.     private class ControlMoveListener extends MouseMotionAdapter {  
  148.  
  149.         public void mouseDragged(MouseEvent e) {  
  150.           
  151.             if (dragged) {  
  152.                 dx = Math.min(e.getX(), component.getWidth());  
  153.                 dy = Math.min(e.getY(), component.getHeight());  
  154.                 moveing = true;  
  155.             }  
  156.         }  
  157.           
  158.         public void mouseMoved(MouseEvent e) {  
  159.               
  160.             if(moveListener!=null){  
  161.                 moveListener.move(e.getX(), e.getY());  
  162.             }  
  163.                   
  164.         }  
  165.     }  
  166.       
  167.     private class ControlKeyListener implements KeyListener{  
  168.           
  169.         public void keyPressed(KeyEvent e) {  
  170.               
  171.               
  172.             if(e.getKeyCode()==KeyEvent.VK_ESCAPE){  
  173.                  System.exit(-1);  
  174.             }  
  175.               
  176.             if(keyPressListener!=null){  
  177.                 keyPressListener.press(e.getKeyCode());  
  178.             }  
  179.               
  180.         }  
  181.  
  182.         public void keyReleased(KeyEvent e) {  
  183.             //System.out.println(e.getKeyCode());  
  184.               
  185.         }  
  186.  
  187.         public void keyTyped(KeyEvent e) {  
  188.                 
  189.               KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK);  
  190.                
  191.  
  192.         }  
  193.     }  
  194.       
  195.     /**  
  196.      * 内部接口,鼠标拖动回调  
  197.      */   
  198.     public static interface DragListener{  
  199.           
  200.         public void drag(int x,int y,int dx,int dy);  
  201.     }  
  202.     /**  
  203.      * 内部接口,鼠标移动回调  
  204.      */ 
  205.     public static interface MoveListener{  
  206.           
  207.         public void move(int x,int y);  
  208.     }  
  209.     /**  
  210.      *   
  211.      *内部接口,左键回调  
  212.      */   
  213.     public static interface LeftPressListener{  
  214.           
  215.         public void press(int x,int y);  
  216.     }  
  217.     /**  
  218.      *  内部接口,右键回调  
  219.      */ 
  220.     public static interface RightPressListener{  
  221.           
  222.         public void press(int x,int y);  
  223.     }  
  224.       
  225.     /**  
  226.      *   
  227.      * @author jiangyp  
  228.      */ 
  229.     public static interface KeyPressListener{  
  230.           
  231.         public void press(int keyCode);  
  232.     }  
  233.       

GameCore.java

  1. package core;  
  2.  
  3. import java.awt.Color;  
  4. import java.awt.Container;  
  5. import java.awt.Font;  
  6. import java.awt.Graphics2D;  
  7. import java.awt.Point;  
  8. import java.awt.RenderingHints;  
  9. import java.awt.Toolkit;  
  10. import java.awt.image.BufferStrategy;  
  11.  
  12. import javax.swing.JComponent;  
  13. import javax.swing.JFrame;  
  14.  
  15. /**  
  16.  * Simple abstract class used for testing. Subclasses should implement the  
  17.  * draw() method.  
  18.  */ 
  19. public abstract class GameCore extends JFrame {  
  20.  
  21.     protected static final int FONT_SIZE = 10;  
  22.  
  23.     private boolean isRunning;  
  24.  
  25.     protected JFrame window;  
  26.  
  27.     public void stop() {  
  28.  
  29.     }  
  30.  
  31.     /**  
  32.      * Calls init() and gameLoop()  
  33.      */ 
  34.     public void run() {  
  35.         init();  
  36.         gameLoop();  
  37.     }  
  38.  
  39.     /**  
  40.      * Sets full screen mode and initiates and objects.  
  41.      */ 
  42.     public void init() {  
  43.  
  44.         setUndecorated(true);  
  45.         setTitle("JStarCraft");  
  46.         setIconImage(ResourceManager.loadImage("title.png"));  
  47.         setDefaultCloseOperation(EXIT_ON_CLOSE);  
  48.         setSize(800600);  
  49.         setVisible(true);  
  50.         setIgnoreRepaint(true);  
  51.         setResizable(false);  
  52.         setFont(new Font("Dialog", Font.PLAIN, FONT_SIZE));  
  53.         setBackground(Color.black);  
  54.         setForeground(Color.white);  
  55.         createBufferStrategy(2);  
  56.         isRunning = true;  
  57.         setCursor(Toolkit.getDefaultToolkit().createCustomCursor(  
  58.                 ResourceManager.loadImage("cur.png"), new Point(00), "cur"));  
  59.         window = getWindow();  
  60.         NullRepaintManager.install();  
  61.         window.setLayout(null);  
  62.         Container contentPane = getWindow().getContentPane();  
  63.         ((JComponent) contentPane).setOpaque(false);  
  64.  
  65.     }  
  66.  
  67.     /**  
  68.      * Runs through the game loop until stop() is called.  
  69.      */ 
  70.     public void gameLoop() {  
  71.  
  72.         BufferStrategy strategy = getBufferStrategy();  
  73.         long startTime = System.currentTimeMillis();  
  74.         long currTime = startTime;  
  75.         while (isRunning) {  
  76.  
  77.             long elapsedTime = System.currentTimeMillis() - currTime;  
  78.             currTime += elapsedTime;  
  79.  
  80.             // update  
  81.             update(elapsedTime);  
  82.  
  83.             // draw the screen  
  84.             Graphics2D g = (Graphics2D) strategy.getDrawGraphics();  
  85.             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  
  86.                     RenderingHints.VALUE_ANTIALIAS_ON);  
  87.             g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,  
  88.                     RenderingHints.VALUE_TEXT_ANTIALIAS_ON);          
  89.             // g.drawImage(ResourceManager.loadImage("background3.jpg"), 0, 33,  
  90.             // null);  
  91.             draw(g);  
  92.             g.dispose();  
  93.  
  94.             if (!strategy.contentsLost()) {  
  95.                 strategy.show();  
  96.             }  
  97.  
  98.             // take a nap  
  99.             try {  
  100.                 Thread.sleep(5);  
  101.             } catch (InterruptedException ex) {  
  102.             }  
  103.         }  
  104.     }  
  105.  
  106.     /**  
  107.      * Updates the state of the game/animation based on the amount of elapsed  
  108.      * time that has passed.  
  109.      */ 
  110.     public void update(long elapsedTime) {  
  111.         // do nothing  
  112.     }  
  113.  
  114.     /**  
  115.      * Draws to the screen. Subclasses must override this method.  
  116.      */ 
  117.     public abstract void draw(Graphics2D g);  
  118.  
  119.     public JFrame getWindow() {  
  120.         return this;  
  121.     }  

图片效果:


[[56257]] 

下载地址:http://down.51cto.com/data/321588

【编辑推荐】

  1. 代码分享:实现系统托盘效果
  2. 代码分享:模拟售票学习多线程
  3. 代码分享:心算24小游戏
  4. 代码分享:Swing外观抗锯齿字体设置
责任编辑:林师授 来源: 网络收集
相关推荐

2013-07-02 13:52:07

2010-07-19 13:15:49

星际争霸2

2010-01-14 17:17:32

云计算

2014-03-18 15:23:58

星际争霸ARM平台

2021-12-01 10:01:52

AI 游戏人工智能

2019-01-25 18:37:20

AI数据科技

2011-05-13 11:49:42

网络安全技术周刊

2009-08-18 09:47:44

百强游戏任天堂

2010-01-18 16:57:09

云计算星际争霸

2023-11-18 09:48:23

2011-04-19 18:17:36

2010-08-03 09:43:59

IT技术周刊

2022-06-02 15:19:31

架构智能强化学习

2019-08-12 08:43:53

GitHub代码开发者

2010-08-01 22:30:12

2020-08-21 18:48:09

人工智能AI自动驾驶

2020-01-16 15:57:36

AI 数据人工智能

2021-11-30 08:00:00

人工智能数据技术

2019-01-30 11:17:46

2009-07-24 08:17:37

巫妖王之怒亮相Chin魔兽世界
点赞
收藏

51CTO技术栈公众号