字体:  

J2ME原创飞机游戏 主程序源代码及法文注释

skysea 发表于: 2008-7-18 19:30 来源: 游学欧洲网

转载请注明出自游学欧洲网数码科技板块

纯属学习之用,切勿在真机上运行,否则后果自负

作者为本人

游戏简介:
一头是我的飞机,一头是敌人的,我按一下开火,就放出一颗子弹,碰到敌人,就得一分。活动区域为半场。敌人自动移动,自动发弹。每次只能发一次弹。这个就是游戏的核心了,感觉比较重要的是顺序,一颗子弹发出了,就要禁止发弹了,直到子弹碰到对方边界或者碰到对方才能重新发弹。感觉八位机就是这种模式。
比如大金刚呀,上面有个大猩猩扔东西,就如这飞机发弹一样

效果图


1.jpg

CODE:

/*
* MIDPCanvas.java
*
* Created on 18 janvier 2008, 09:53
*/

package tst;

import java.util.Random;
import javax.microedition.lcdui.*;

/**
*
* @author  SKYSEA
* @version 0.8
*/
public class MIDPCanvas extends Canvas implements CommandListener, Runnable {
   
    private Command commandStart;//command start
    private Command commandPause;//command pause
    private Command commandExit;//command exit
    private Image img;//image de joueur
    private Image img1;//image de enemie
    private Image img2;//image de bomb
    //private int[][] player=new int[2][2];
    //private int[][] enemy=new int[2][2];
    //private int[][] bomb=new int[3][2];
    private int mainWidth;//largeur de lécran
    private int mainHeight;//hauteur de lécran
    private int playerX,playerY;//position de joueur
    private int enemyX,enemyY;//position de enemie
    private int bombX,bombY;//position de bomb de joueur
    private int bombEnemyX,bombEnemyY;
    private int pas=5;// pas de mouvement
    private Thread t;//thread
    private boolean isRun=true;//run
    private final int GAME_MENU=0;//etat de menu du jeu
    private String[][] menuMain=null;//menu main
    private final int GAME_CONFIG=1;//configuration du jeu
    private String[][] menuCONFIG=null;//menu de configuration
    private final int GAME_INIT=2;//etat de initialisation de jeu
    private final int GAME_PAUSE=3;//etat de pause de jeu
    private final int GAME_OVER=4;//etat de fin de jeu
    private final int GAME_SUSPEND=9;//jeu suspendu
    private int gameState;//etat de jeu
    private int direction;//direction de mouvement
    private int level,score;//niveau et score
    private Random random=new Random();//random ,import java.util.Random;
   
   
   
   

   
    private boolean fire=false;
    private boolean reFire=true;
   
    private boolean enemyFire=false;
    private boolean enemyRefire=true;
    private int repeatTime;
    private boolean canRepeat;
    private int repeatDirection;
    private int enemyFireSpeed=5;
    /**
     * constructor
     */
    public MIDPCanvas() {
        mainWidth=getWidth();
        mainHeight=getHeight();
        playerX=mainWidth/2;
        playerY=mainHeight-25;
        enemyX=mainWidth/2;
        enemyY=25;
        t=new Thread(this);
        score=0;
        
        try {
            // Set up this canvas to listen to command events
            setCommandListener(this);
            // Add the Exit command
            commandExit=new Command("Exit", Command.EXIT, 1);
            addCommand(commandExit);
        } catch(Exception e) {
            e.printStackTrace();
        }
      
           try {
                 img      = Image.createImage("/res/avion.png");
                 img1      = Image.createImage("/res/aa.png");
                 img2      = Image.createImage("/res/puce.png");
            } catch (Exception e) {System.out.println("Failure");}
        t.start();
    }
   
    public void run(){
        
        while(isRun){
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            System.out.println("UP"+UP+"Down"+DOWN+"Left"+LEFT+"Right"+RIGHT);
            move();
             isTouchedByPlayer();
             isTouchedByEnemy();
             isTouched();
            playerFireMove();
            enemyFireMove();
        
            enemyMove();
            repaint();
            
            
        }
    }
    /**
     * paint
     */
    public void paint(Graphics g) {
       g.setColor(0,255,255);
       g.fillRect(0,0,getWidth(),getHeight());
       g.setColor(0,0,0);
       g.drawLine(0,mainHeight/2,mainWidth,mainHeight/2);
       g.drawImage(img,playerX,playerY,Graphics.VCENTER|Graphics.HCENTER);
        g.drawImage(img1,enemyX,enemyY,Graphics.VCENTER|Graphics.HCENTER);
        g.setColor(0,0,0);
        g.drawString("Score: "+score,0,mainHeight-15,Graphics.TOP|Graphics.LEFT);
        if(fire){
            paintFire(g);
        }
        if(enemyFire){
            paintEnemyFire(g);
        }
    }
    public void isTouchedByPlayer(){
        if (fire)
        if ((bombX<enemyX+45)&&(bombX>enemyX-45)&&(bombY<enemyY+23)&&(bombY>enemyY-23)){
            fire=false;
            reFire=true;
            score++;
        }
    }
    public void isTouchedByEnemy(){
        if (enemyFire)
        if ((bombEnemyX<playerX+45)&&(bombEnemyX>playerX-45)&&(bombEnemyY<playerY+23)&&(bombEnemyY>playerY-23)){
            enemyFire=false;
            enemyRefire=true;
            score--;
        }
    }
    public void isTouched(){
        if(fire&&enemyFire){
            if((bombEnemyX<bombX+13)&&(bombEnemyX>bombX-13)&&(bombEnemyY<bombY+13)&&(bombEnemyY>bombY-13)){
               fire=false;
            reFire=true;
            enemyFire=false;
            enemyRefire=true;
            }
        }
    }
    public void paintFire(Graphics g){
        g.drawImage(img2,bombX,bombY,Graphics.VCENTER|Graphics.HCENTER);
    }
    public void playerFire(int x,int y ){
        bombX=x;
        bombY=y-20;
    }
    public void playerFireMove(){
        if(fire){
            bombY-=enemyFireSpeed;
        }
        if(bombY<0){
            fire=false;
            reFire=true;
        }
    }
    public void paintEnemyFire(Graphics g){
        g.drawImage(img2,bombEnemyX,bombEnemyY,Graphics.VCENTER|Graphics.HCENTER);
    }
    public void enemyFire(int x,int y){
        bombEnemyX=x;
        bombEnemyY=y+20;
        
    }
    public void enemyFireMove(){
        if(enemyFire){
            bombEnemyY+=enemyFireSpeed;
        }
        if(bombEnemyY>mainHeight){
            enemyFire=false;//le bomb ne peut pas bouger
            enemyRefire=true;//enemy peut refire
        }
    }
    public void enemyMove(){
        if(!canRepeat){
            repeatTime=Math.abs(random.nextInt())%20;
            repeatDirection=Math.abs(random.nextInt())%5;
            canRepeat=true;
            
        }
        if(canRepeat){
           if (repeatTime>0){
            switch(repeatDirection){
                case 0:
                    if(enemyY>(0+23))
                    enemyY-=pas;
                break;
                case 1:
                    if(enemyY<(mainHeight/2-23))
                    enemyY+=pas;
                break;
               
                case 2:
                    if(enemyX>(0+45))
                    enemyX-=pas;
                break;
               
                case 3:
                    if(enemyX<(mainWidth-45))
                    enemyX+=pas;
                break;
                case 4:
                    //si elle peut refire, elle refire
                    if(enemyRefire){
                    enemyFire=true;//bomb peut bouger
                    enemyFire(enemyX,enemyY);//bouger par la tete de enemy
                    enemyRefire=false;//elle ne peut pas refire
                    }
            }
            repeatTime--;
           }
           if (repeatTime==0)canRepeat=false;
               
        }
    }
    /**
     * Called when a key is pressed.
     */
    public void move(){
   
        switch(direction){
            case 0:
                if(playerY>(mainHeight/2+23))
                playerY-=pas;
            break;
            case 1:
                if(playerY<mainHeight-23)
                playerY+=pas;
            break;
            case 2:
                if(playerX>0+45)
                playerX-=pas;
            break;
            case 3:
                if(playerX <mainWidth-45)
                playerX+=pas;
            break;
            }
      
            
        }

    protected  void keyPressed(int keyCode) {
   
        int action =getGameAction(keyCode);
        switch(action){
             case UP: direction=0;
            break;
            case DOWN:direction=1;
            break;
            case LEFT:direction=2;
            break;
            case RIGHT: direction=3;
            break;
            case FIRE:
                if(reFire){
                    fire=true;
                playerFire(playerX,playerY );
                reFire=false;
                }
            break;
        }
        
                        
    }
   
    /**
     * Called when a key is released.
     */
    protected  void keyReleased(int keyCode) {
        
    }
   
    /**
     * Called when a key is repeated (held down).
     */
    protected  void keyRepeated(int keyCode) {
   
    }
   
    /*
     * Called when action should be handled
     */
    public void commandAction(Command command, Displayable displayable) {
    if (command==commandExit){
         isRun=false;
            Midlet.quitApp();
      
    }
    }
   
}
[ 本帖最后由 skysea 于 2008-7-20 15:54 编辑 ]

最新回复

tiger at 2008-7-18 20:50:05
站长很强大!