纯Java开发的游戏引擎V0.4–DEMO2 — 物理引擎

本网站用的阿里云ECS,推荐大家用。自己搞个学习研究也不错

<

div id=”content”>项目命名: JPhysicalEngine
项目目的: 自己爱好/毕业设计
项目人员: http://blog.csdn.net/kakashi8841
运行机器: Intel P8600 2.4GHz、2G内存、Intel GMA X4500 HD
开发环境: Linux Ubuntu 10.10
开发语言: Java
开发工具: Eclipse

项目描述: 使用Java开发的2D游戏物理引擎,可以使得以后开发类似愤怒的小鸟、雷电等物理、碰撞、动作类游戏可以更快速、更方便。

项目进度:

    【已实现】
        版本  完成日期       实现功能
        V0.1 [2011-04-07]  大致框架
        V0.2 [2011-04-11]  基本动画
        V0.3 [2011-04-15]  恒力和AABB碰撞检测
        V0.4 [2011-04-22]  框架优化、简单粒子系统

    【待实现】
        版本  计划完成日期    实现功能
        V0.5 [2011-05-05]  更精确的OBB碰撞检测
        V0.6 [2011-05-10]  变力
        V0.7 [2011-05-12]  更完善的粒子系统
        V0.8 [2011-05-17]  弹力、引力
        V0.9 [2011-05-20]  框架优化、简单的输入输出操作

目前引用自制引擎做的DEMO2:

代码只需200+行:

<

div>

<

ol>

  •   org.ubird.demo.Demo2.java   
  • package org.ubird.demo;   
  •   
  •   
  • import java.awt.Image;   
  • import java.awt.event.KeyEvent;   
  • import java.awt.event.KeyListener;   
  • import java.io.IOException;   
  •   
  • import javax.imageio.ImageIO;   
  •   
  •   
  • import org.ubird.app.SimpleGame;   
  • import org.ubird.scene.ImageNode;   
  • import org.ubird.scene.Node;   
  • import org.ubird.scene.particle.ParticleNode;   
  • import org.ubird.scene.particle.ParticleSystem;   
  •   
  • /**  
  •   测试类2  
  •   @author junhong.c  
  •   @version 1.0  
  •   @date 2011-4-23  
  •  /  
  • public class Demo2 extends SimpleGame{   
  •   
  •     private Node player;   
  •        
  •     private ParticleNode bomb = ParticleSystem.getParticles(500,15,15,10);   
  •        
  •     private Node[] bullets = new ImageNode[40];   
  •     private int currentBullet = 0;   
  •        
  •     private long delay;     //子弹延时   
  •     private boolean fire;   
  •     private boolean fire2;   
  •     private boolean fire3;   
  •     private boolean down;   
  •     private boolean up;   
  •     private boolean right;   
  •     private boolean left;   
  •        
  •     public Demo2() {   
  •         super(“Java2D游戏引擎 V0.4.0 — By John.Cha”);   
  •     }   
  •   
  •     public static void main(String[] args) throws IOException {   
  •         SimpleGame game = new Demo2();   
  •         game.setFPS(60);   
  •         game.setStageBackground(“resources/bg.png”);   
  •         game.setStageSize(1000,600);   
  •         game.start();   
  •     }   
  •   
  •   
  •     @Override  
  •     public void initWorld() {   
  •         initScene();   
  •         initNode();   
  •         initEvent();   
  •     }   
  •        
  •     /**  
  •       事件  
  •      /  
  •     private void initEvent() {   
  •         addKeyListener(new MyKeyListener());   
  •     }   
  •   
  •     /**  
  •       定义自己的事件监听  
  •       @author junhong.c  
  •       @version 1.0  
  •       @date 2011-4-22  
  •      /  
  •     private class MyKeyListener implements KeyListener{   
  •   
  •         @Override  
  •         public void keyTyped(KeyEvent e) {}   
  •   
  •         @Override  
  •         public void keyReleased(KeyEvent e) {   
  •             switch(e.getKeyCode()){   
  •                 case KeyEvent.VK_UP :   
  •                     up=false;   
  •                     break;   
  •                 case KeyEvent.VK_DOWN:   
  •                     down=false;   
  •                     break;   
  •                 case KeyEvent.VK_RIGHT:   
  •                     right=false;   
  •                     break;   
  •                 case KeyEvent.VK_LEFT:   
  •                     left=false;   
  •                     break;   
  •                 case KeyEvent.VK_A:   
  •                     fire=false;   
  •                     break;   
  •                 case KeyEvent.VK_S:   
  •                     fire2=false;   
  •                     break;   
  •                 case KeyEvent.VK_D:   
  •                     fire3=false;   
  •                     break;   
  •             }   
  •         }   
  •   
  •         @Override  
  •         public void keyPressed(KeyEvent e) {   
  •             if(fire && e.getKeyCode()==KeyEvent.VK_A) return;   
  •             if(fire2 && e.getKeyCode()==KeyEvent.VK_S) return;   
  •             if(fire3 && e.getKeyCode()==KeyEvent.VK_D) return;   
  •             if(up && e.getKeyCode()==KeyEvent.VK_UP) return;   
  •             if(down && e.getKeyCode()==KeyEvent.VK_DOWN) return;   
  •             if(left && e.getKeyCode()==KeyEvent.VK_LEFT) return;   
  •             if(right && e.getKeyCode()==KeyEvent.VK_RIGHT) return;   
  •                
  •             switch(e.getKeyCode()){   
  •                 case KeyEvent.VK_UP :   
  •                     up=true;   
  •                     break;   
  •                 case KeyEvent.VK_DOWN:   
  •                     down=true;   
  •                     break;   
  •                 case KeyEvent.VK_RIGHT:   
  •                     right=true;   
  •                     break;   
  •                 case KeyEvent.VK_LEFT:   
  •                     left=true;   
  •                     break;   
  •                 case KeyEvent.VK_B:   
  •                     bomb.start(player.getLocation().getIntX()-player.getWidth()/23,player.getLocation().getIntY()-player.getHeight());   
  •                     break;   
  •                 case KeyEvent.VK_A:   
  •                     fire=true;   
  •                     break;   
  •                 case KeyEvent.VK_S:   
  •                     fire2=true;   
  •                     break;   
  •                 case KeyEvent.VK_D:   
  •                     fire3=true;   
  •                     break;   
  •             }   
  •                
  •             getProcessThread().start();   
  •         }   
  •     }   
  •        
  •        
  •   
  •     /**  
  •       场景   
  •      /  
  •     private void initScene() {   
  •         add(bomb);   
  •     }   
  •        
  •     /**  
  •       处理按键的线程  
  •       @return  
  •      /  
  •     public Thread getProcessThread(){   
  •         return new Thread(){   
  •             public void run(){   
  •                 try {   
  •                     while(up||down||left||right||fire||fire2||fire3){   
  •                         Thread.sleep(1000/60);   
  •                         float v = 0.2f;   
  •                         if(up)   
  •                             player.getVelocity().setY(-v);   
  •                         else if(down)   
  •                             player.getVelocity().setY(v);   
  •                            
  •                         if(left)   
  •                             player.getVelocity().setX(-v);   
  •                         else if(right)   
  •                             player.getVelocity().setX(v);   
  •                            
  •                         if(!(up||down))   
  •                             player.getVelocity().setY(0);   
  •                            
  •                         if(!(left||right))   
  •                             player.getVelocity().setX(0);   
  •                            
  •                         if( fire ){   
  •                             if(delay <= System.currentTimeMillis()){   
  •                                 for(int i=0; i<2; i++){   
  •                                     bullets[currentBullet].getVelocity().setY(-v2f);   
  •                                     bullets[currentBullet].getVelocity().setX(0);   
  •                                     int fix = i == 0 ? –15 : 15;   
  •                                        
  •                                     float x = player.getLocation().getX()+(player.getWidth() – bullets[currentBullet].getWidth())0.5f;   
  •                                     bullets[currentBullet].setLocation(fix+x, player.getLocation().getY()-bullets[currentBullet].getHeight());   
  •                                     currentBullet = ++currentBullet%bullets.length;   
  •                                 }   
  •                                 delay = System.currentTimeMillis()+80;   
  •                             }   
  •                         }   
  •                            
  •                         if(fire2){   
  •                             if(delay <= System.currentTimeMillis()){   
  •                                 for(int i=0; i<3; i++){   
  •                                     bullets[currentBullet].getVelocity().setY(-v2f);   
  •                                     int fix = i == 0 ? –15 : i==2 ? 15 : 0;   
  •                                     float vx = i==0 ? -v/4 : i==1 ? 0 : v/4;   
  •                                     bullets[currentBullet].getVelocity().setX(vx);   
  •                                     float x = player.getLocation().getX()+(player.getWidth() – bullets[currentBullet].getWidth())0.5f;   
  •                                     bullets[currentBullet].setLocation(fix+x, player.getLocation().getY()-bullets[currentBullet].getHeight());   
  •                                        
  •                                     currentBullet = ++currentBullet%bullets.length;   
  •                                 }   
  •                                 delay = System.currentTimeMillis()+100;   
  •                             }   
  •                         }   
  •                            
  •                         if(fire3){   
  •                             for(int i=0; i<bullets.length; i++){   
  •                                 bullets[currentBullet].getVelocity().setY(-v2f);   
  •                                 int fix = i == 0 ? –15 : i==2 ? 15 : 0;   
  •                                    
  •                                 float vx = (float) (vMath.cos(6.28i/bullets.length));   
  •                                 float vy = (float) (vMath.sin(6.28i/bullets.length));   
  •                                    
  •                                 bullets[currentBullet].getVelocity().setX(vx);   
  •                                 bullets[currentBullet].getVelocity().setY(vy);   
  •                                 bullets[currentBullet].setLocation(fix+player.getLocation().getX()-player.getWidth()/2+2,player.getLocation().getY()-player.getHeight());   
  •                                 bullets[currentBullet].setDelay(currentBullet);   
  •                                 currentBullet = ++currentBullet%bullets.length;   
  •                             }   
  •                             fire3=false;   
  •                         }   
  •                     }   
  •                 } catch (InterruptedException e) {   
  •                     e.printStackTrace();   
  •                 }   
  •             }   
  •         };   
  •     }   
  •   
  •     /**  
  •         
  •      /  
  •     private void initNode() {   
  •            
  •         /**  
  •           初始化子弹  
  •          /  
  •         try {   
  •             Image image = ImageIO.read(getClass().getClassLoader().getResource(“resources/bullet.png”));   
  •                
  •             for(int i=0; i<bullets.length; i++){   
  •                 bullets[i] = new ImageNode(image,i%635,0,35,35);   
  •                 bullets[i].setSize(30,30);   
  •                 bullets[i].setLocation(-500,-500);   
  •                 add(bullets[i]);   
  •             }   
  •                
  •             player = new ImageNode(image,70,35,35,35);  //平抛–图像结点   
  •             player.setSize(35,35);   
  •             player.setLocation((getStageWidth()-player.getWidth())/2,getStageHeight()-player.getHeight());   
  •             player.setMass(10);   
  •             add(player);   
  •         } catch (IOException e1) {   
  •             e1.printStackTrace();   
  •         }   
  •     }   
  •   
  •   
  •     @Override  
  •     public void updateWorld(long time) {   
  •         player.update(time);   
  •            
  •         bomb.update(time);   
  •            
  •         for(int i=0; i<bullets.length; i++){   
  •             if(bullets[i]!=null){   
  •                 bullets[i].update(time);   
  •  ¼/div>

    未经允许不得转载:演道网 » 纯Java开发的游戏引擎V0.4–DEMO2 — 物理引擎

  • 赞 (0)
    分享到:更多 ()

    评论 0

    评论前必须登录!

    登陆 注册