www.pudn.com > 红心大战 游戏源码.rar > CardCanvas.java


package com.skybright.pig; 
 
import java.io.PrintStream; 
 
import java.util.Vector; 
 
import javax.microedition.lcdui.*; 
 
 
public class CardCanvas extends Canvas implements CommandListener 
{ 
    private Command restartCommand; 
    private Command newCommand; 
    private Command helpCommand; 
    private Command aboutCommand; 
    private Command exitCommand; 
    private Duel duel; 
    private Image cardback; 
    private Image logo; 
 
    public CardCanvas(Duel d) 
    { 
        restartCommand = new Command("\u53d1\u724c", Command.SCREEN, 1); //4 
 
        newCommand = new Command("\u91cd\u65b0\u5f00\u5c40", Command.SCREEN, 1); //5 
        helpCommand = new Command("\u73A9\u6CD5\u5E2E\u52A9", Command.HELP, 1); //5 
        aboutCommand = new Command("\u5173\u4E8E", Command.HELP, 1); //5 
        exitCommand = new Command("\u9000\u51fa", Command.EXIT, 1); 
 
        addCommand(restartCommand); 
        addCommand(newCommand); 
        addCommand(helpCommand); 
        addCommand(aboutCommand); 
        addCommand(exitCommand); 
 
        setCommandListener(this); 
        duel = d; 
    } 
 
    public void show() 
    { 
        PigMiDlet.display.setCurrent(this); 
    } 
 
    public void paint(Graphics g) 
    { 
        g.setColor(Config.BACKGROUND[0], Config.BACKGROUND[1], 
                   Config.BACKGROUND[2]); 
        g.fillRect(0, 0, getWidth(), getHeight()); 
 
        if (duel == null) 
        { 
            return; 
        } 
 
        //load logo picture 
        if (duel.getStatus() == Config.STATUS_LOGO) 
        { 
            drawStart(g); 
 
            return; 
        } 
 
        //destory logo and load pig picture 
        if (duel.getStatus() == Config.STATUS_NEW) 
        { 
            //destrory logo resource 
            destoryLogo(); 
 
 
            //load pig picture 
            drawPig(g); 
 
            return; 
        } 
 
        if (duel.getStatus() != Config.STATUS_RUN) 
        { 
            return; 
        }else 
        { 
            drawP1(g, duel); 
            drawP2(g, duel); 
            drawP3(g, duel); 
            drawP4(g, duel); 
            drawCardsRound(g); 
 
            return; 
        } 
    } 
 
    /** 
     * 重新开一局,把原来的成绩清空 
     */ 
    public void duelNewStart() 
    { 
        duel.restart(); 
        repaint(); 
    } 
 
    /** 
     * 仅仅是重新发牌,换牌 
     */ 
    public void duelStart() 
    { 
        duel.start(); 
        repaint(); 
    } 
 
    protected void keyPressed(int keyCode) 
    { 
        if (duel == null) 
        { 
            return; 
        } 
 
        if (duel.whoseTurn() != 0) 
        { 
            return; 
        } 
 
        switch (getGameAction(keyCode)) 
        { 
        case 3: // '\003' 
        case 4: // '\004' 
        case 7: // '\007' 
        default: 
            break; 
 
        case 1: // '\001' 
        case 2: // '\002' 
 
            if (duel.getSelectIndex() == 0) 
            { 
                return; 
            } 
 
            if (duel.getSelectIndex() < 0) 
            { 
                duel.setSelectIndex(0); 
            }else 
            { 
                duel.setSelectIndex(duel.getSelectIndex() - 1); 
            } 
 
            repaint(); 
 
            break; 
 
        case 5: // '\005' 
        case 6: // '\006' 
 
            if (duel.getSelectIndex() == (duel.getPlayer1().left() - 1)) 
            { 
                return; 
            } 
 
            if (duel.getSelectIndex() < 0) 
            { 
                duel.setSelectIndex(0); 
            }else 
            { 
                duel.setSelectIndex(duel.getSelectIndex() + 1); 
            } 
 
            repaint(); 
 
            break; 
 
        case 8: // '\b' 
            duel.deal(); 
 
            break; 
        } 
    } 
 
    /** 
     * down user 
     * @param g 
     * @param d 
     */ 
    private void drawP1(Graphics g, Duel d) 
    { 
        int x = Config.P1_CARD[0]; 
        int y = Config.P1_CARD[1]; 
 
        try 
        { 
            Card[] cs = d.getPlayer1().getCards(); 
            int n = 0; 
 
            for (int i = 0; i < cs.length; i++) 
            { 
                if (cs[i] != null) 
                { 
                    int y2 = y; 
 
                    if (n == d.getSelectIndex()) 
                    { 
                        y2 -= 8; 
                    } 
 
                    g.drawImage(cs[i].getImage(), x, y2, 20); 
                    x += 10; 
                    n++; 
                } 
            } 
        }catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
 
        try 
        { 
            //white 
            g.setColor(Config.FONT_COLOR); 
            //add pic 
            //    g.drawString(d.getPlayer1().getName(), Config.P1_NAME[0],Config.P1_NAME[1], 20); 
            //show score 
            g.drawString(String.valueOf(String.valueOf( 
                                                (new StringBuffer("")).append( 
                                                        d.getPlayer1() 
                                                         .getName()) 
                                                                      .append(":") 
                                                                      .append(duel.getScore( 
                                                                                      d.getPlayer1() 
                                                                                       .getName())))), 
                         Config.P1_NAME[0], Config.P1_NAME[1], 20); 
 
            // g.drawImage(d.getPlayer1().getHeader(), Config.P1_NAME[0],                         Config.P1_NAME[1], 20); 
        }catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     * left user 
     * @param g 
     * @param d 
     */ 
    private void drawP2(Graphics g, Duel d) 
    { 
        /*  int x = Config.P2_CARD[0]; 
          int y = Config.P2_CARD[1]; 
 
          try 
          { 
              Card[] cs = d.getPlayer2().getCards(); 
 
              for (int i = 0; i < cs.length; i++) 
              { 
                  if (cs[i] != null) 
                  { 
                      g.drawImage(getCardBack(), x, y, 20); 
                      y += 3; 
                  } 
              } 
          }catch (Exception e) 
          { 
              e.printStackTrace(); 
          } 
         */ 
        try 
        { 
          //white 
            g.setColor(Config.FONT_COLOR); 
 
            //add pic 
            g.drawString(String.valueOf(String.valueOf( 
                                                (new StringBuffer("")).append( 
                                                        d.getPlayer2() 
                                                         .getName()) 
                                                                      .append(":") 
                                                                      .append(duel.getScore( 
                                                                                      d.getPlayer2() 
                                                                                       .getName())))), 
                         Config.P2_NAME[0], Config.P2_NAME[1], 20); 
 
            //     g.drawString(d.getPlayer2().getName(), Config.P2_NAME[0],                         Config.P2_NAME[1], 20); 
            // g.drawImage(d.getPlayer2().getHeader(), Config.P2_NAME[0],                         Config.P2_NAME[1], 20); 
        }catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     * up user 
     * @param g 
     * @param d 
     */ 
    private void drawP3(Graphics g, Duel d) 
    { 
        /*  int x = Config.P3_CARD[0]; 
          int y = Config.P3_CARD[1]; 
 
          try 
          { 
              Card[] cs = d.getPlayer3().getCards(); 
 
              for (int i = 0; i < cs.length; i++) 
              { 
                  if (cs[i] != null) 
                  { 
                      g.drawImage(getCardBack(), x, y, 20); 
                      x += 5; 
                  } 
              } 
          }catch (Exception e) 
          { 
              e.printStackTrace(); 
          } 
        */ 
        try 
        { 
          g.setColor(Config.FONT_COLOR); 
 
            //add pic 
            g.drawString(String.valueOf(String.valueOf( 
                                                (new StringBuffer("")).append( 
                                                        d.getPlayer3() 
                                                         .getName()) 
                                                                      .append(":") 
                                                                      .append(duel.getScore( 
                                                                                      d.getPlayer3() 
                                                                                       .getName())))), 
                         Config.P3_NAME[0], Config.P3_NAME[1], 20); 
 
            //     g.drawString(d.getPlayer3().getName(), Config.P3_NAME[0],                         Config.P3_NAME[1], 20); 
            //   g.drawImage(d.getPlayer3().getHeader(), Config.P3_NAME[0],                         Config.P3_NAME[1], 20); 
        }catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     * left user 
     * @param g 
     * @param d 
     */ 
    private void drawP4(Graphics g, Duel d) 
    { 
        /*  int x = Config.P4_CARD[0]; 
          int y = Config.P4_CARD[1]; 
 
          try 
          { 
              Card[] cs = d.getPlayer4().getCards(); 
 
              for (int i = 0; i < cs.length; i++) 
              { 
                  if (cs[i] != null) 
                  { 
                      g.drawImage(getCardBack(), x, y, 20); 
                      y += 3; 
                  } 
              } 
          }catch (Exception e) 
          { 
              e.printStackTrace(); 
          } 
        */ 
        try 
        { 
            g.setColor(Config.FONT_COLOR); 
            //add pic 
            g.drawString(String.valueOf(String.valueOf( 
                                                (new StringBuffer("")).append( 
                                                        d.getPlayer4() 
                                                         .getName()) 
                                                                      .append(":") 
                                                                      .append(duel.getScore( 
                                                                                      d.getPlayer4() 
                                                                                       .getName())))), 
                         Config.P4_NAME[0], Config.P4_NAME[1], 20); 
 
            //    g.drawString(d.getPlayer4().getName(), Config.P4_NAME[0],                         Config.P4_NAME[1], 20); 
            // g.drawImage(d.getPlayer4().getHeader(), Config.P4_NAME[0],                         Config.P4_NAME[1], 20); 
        }catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 
 
    private void drawCardsRound(Graphics g) 
    { 
        Vector cards = duel.getCardsCound(); 
 
        for (int i = 0; i < cards.size(); i++) 
        { 
            CardRound cr = (CardRound) cards.elementAt(i); 
            int p = cr.getRoundIndex(); 
            Card c = cr.getCard(); 
 
            switch (p) 
            { 
            case 0: // '\0' 
                g.drawImage(c.getImage(), Config.SHOW1[0], Config.SHOW1[1], 20); 
 
                break; 
 
            case 1: // '\001' 
                g.drawImage(c.getImage(), Config.SHOW2[0], Config.SHOW2[1], 20); 
 
                break; 
 
            case 2: // '\002' 
                g.drawImage(c.getImage(), Config.SHOW3[0], Config.SHOW3[1], 20); 
 
                break; 
 
            case 3: // '\003' 
                g.drawImage(c.getImage(), Config.SHOW4[0], Config.SHOW4[1], 20); 
 
                break; 
            } 
        } 
    } 
 
    private Image getLogo() 
    { 
        if (logo != null) 
        { 
            return logo; 
        } 
 
        try 
        { 
            logo = Image.createImage("/logo.png"); 
        }catch (Exception e) 
        { 
            logo = null; 
        } 
 
        return logo; 
    } 
 
    private Image getCardBack() 
    { 
        if (cardback != null) 
        { 
            return cardback; 
        } 
 
        try 
        { 
            cardback = Image.createImage("/cards/0.png"); 
        }catch (Exception e) 
        { 
            cardback = null; 
        } 
 
        return cardback; 
    } 
 
    /** 
     * show company log 
     * @param g 
     */ 
    private void drawStart(Graphics g) 
    { 
        //show company logo 
          g.setColor(Config.BACKGROUND[0], Config.BACKGROUND[1],Config.BACKGROUND[2]); 
        //    g.setColor(0xffffff); 
        g.fillRect(0, 0, getWidth(), getHeight()); 
    //    g.setColor(0xffffff); 
 
 
        // g.setFont(Font.getFont(0, 1, 8)); 
        //  g.drawString("\u6B22\u8FCE\u8FDB\u5165\u7EA2\u5FC3\u5927\u6218\uFF01",                      10, 40, 20); 
        //  g.drawString("\u8BF7\u5728\u9009\u9879\u83DC\u5355\u4E2D\u5F00\u59CB\u6E38\u620F\u3002",                 10, 60, 20); 
        //load logo pic 
        getLogo(); 
        g.drawImage(logo, getWidth() / 2, getHeight() / 2, 3); 
    } 
 
    private void drawPig(Graphics g) 
    { 
        //      g.setColor(Config.BACKGROUND[0], Config.BACKGROUND[1], Config.BACKGROUND[2]); 
        g.setColor(0, 0, 0); 
 
        g.fillRect(0, 0, getWidth(), getHeight()); 
        //red 
        g.setColor(0xFF0000); 
 
 
        //change draw start display 
        g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, 
                               Font.SIZE_LARGE)); 
        g.drawString("\u7ea2\u5fc3\u5927\u6218", 40, 40, g.LEFT | g.TOP); 
 
        //  g.drawString("\u8BF7\u5728\u9009\u9879\u83DC\u5355\u4E2D\u5F00\u59CB\u6E38\u620F\u3002",                10, 60, 20); 
        //| 
        // g.setFont(Font.getFont(0, 1, 8)); 
        //   g.drawString("\u6B22\u8FCE\u8FDB\u5165\u7EA2\u5FC3\u5927\u6218\uFF01",10, 40, 20); 
        //  g.drawString("\u8BF7\u5728\u9009\u9879\u83DC\u5355\u4E2D\u5F00\u59CB\u6E38\u620F\u3002",                10, 60, 20); 
    } 
 
    /** 
     * logo is showed only once,so it must be destoryed to release memory 
     * @param g 
     */ 
    private void destoryLogo() 
    { 
        logo = null; 
        System.gc(); 
 
        //   g.setColor(Config.BACKGROUND[0], Config.BACKGROUND[1],Config.BACKGROUND[2]); 
        //  g.fillRect(0, 0, getWidth(), getHeight()); 
    } 
 
    public void commandAction(Command c, Displayable p) 
    { 
        if (c == restartCommand) 
        { 
            //对牌不满意,仅仅是重新发牌 
            duelStart(); 
        }else if (c == newCommand) 
        { 
            //重新开一局,需要把原来的成绩清空 
            duelNewStart(); 
        }else if (c == helpCommand) 
        { 
            Help.showHelp(PigMiDlet.display); 
        }else if (c == aboutCommand) 
        { 
            About.showAbout(PigMiDlet.display); 
        }else if (c == exitCommand) 
        { 
            duel.quit(); 
 
            // PigMiDlet.display.setCurrent(null); 
        }else 
        { 
            System.out.println("Unknown command issued ".concat(String.valueOf( 
                                                                        String.valueOf(c)))); 
        } 
    } 
}