【www.gdgbn.com--js教程】

这是一个吃豆游戏的Java实现,具体代码较多请下载文件。

下载地址:http://download.111cn.net/source/396925





package org.loon.test;

import java.awt.Color;
import java.awt.Event;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.MediaTracker;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;

/** *//**
 * 
 * 


 * Title: LoonFramework
 * 


 * 


 * Description:
 * 


 * 


 * Copyright: Copyright (c) 2008
 * 


 * 


 * Company: LoonFramework
 * 


 * 


 * License: http://www.apache.org/licenses/LICENSE-2.0
 * 


 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
class Timer implements Runnable ...{
    Pacgame ap;

    int duration;

    private Thread myThread;

    private boolean loopf = true;

    private long tickCount;

    public Timer(Pacgame ap, int duration) ...{
        this.ap = ap;
        this.duration = duration;
    }

    public Timer(Pacgame ap) ...{
        this(ap, 16);
    }

    public void on() ...{
        myThread = new Thread(this);
        myThread.start();
    }

    public void off() ...{
        loopf = false;
    }

    public void run() ...{
        loopf = true;
        tickCount = System.currentTimeMillis();
        while (loopf) ...{
            try ...{
                Thread.sleep(duration);
            } catch (Exception e) ...{
                e.printStackTrace();
            }
            ap.notifyFrame();
        }
    }

    public int frames() ...{
        long nowTick = System.currentTimeMillis();
        int frame = (int) (nowTick - tickCount) / duration;
        if (frame <= 0) ...{
            frame = 1;
            tickCount = nowTick;
        } else if (frame > 5) ...{
            frame = 5;
            tickCount = nowTick;
        } else ...{
            tickCount += frame * duration;
        }
        return frame;
    }
}

public class Pacgame extends Panel implements Runnable ...{
    /** *//**
     * 
     */
    private static final long serialVersionUID = 1L;

    private static int WIDTH = 256;

    private static int HEIGHT = 224;

    Thread thread;

    //构造一个双缓冲的、可变的image
    VolatileImage offImage;

    Image bg, bg0;

    CGloader loader;

    MazeManager mzmanager;

    MapManager emanager;

    SpriteManager spmanager, chipmanager;

    MonsterSprite redmon, ao, pink, monster;

    PacSprite pac;

    AttractManager atMng;

    Timer timer;

    int key = 0;

    int score;

    int number1;

    boolean loadOK = false;

    boolean isAttr = false;

    public void init() ...{
        ClassLoader cl = getClass().getClassLoader();
        Toolkit tk = Toolkit.getDefaultToolkit();
        bg0 = tk.createImage(cl.getResource("main.png"));
        bg = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB_PRE);
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(bg0, 0);
        try ...{
            mt.waitForID(0);
        } catch (Exception e) ...{
            e.printStackTrace();
        }
        loader = new CGloader("pacchr.png", this);
        loader.setAlpha(0, 8);

        mzmanager = new MazeManager();

        emanager = new MapManager();

        spmanager = new SpriteManager(4);
        chipmanager = new SpriteManager(5);

        pac = new PacSprite(10, 20, loader);
        redmon = new RedMonster(10, 10, mzmanager, loader);
        redmon.setTarget(pac);
        spmanager.add(redmon);
        ao = new BlueMonster(9, 13, mzmanager, loader);
        ao.setTarget(pac);
        spmanager.add(ao);
        pink = new PinkMonster(10, 13, mzmanager, loader);
        pink.setTarget(pac);
        spmanager.add(pink);
        monster = new Monster(11, 13, mzmanager, loader);
        monster.setTarget(pac);
        spmanager.add(monster);
        for (int i = 0; i < 5; i++) ...{
            chipmanager.add(new ChipSprite(i * 16, 0, loader, i * 16, 130, 16,
                    16));
        }

        atMng = new AttractManager(loader);
        timer = new Timer(this, 16);

        setBackground(Color.black);
        setSize(WIDTH, HEIGHT);

        offImage = createVolatileImage(WIDTH, HEIGHT);

    }

    public void paint(Graphics g) ...{
        if (!loadOK)
            return;
        do ...{
            int returnCode = offImage.validate(getGraphicsConfiguration());
            if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE)...{
                offImage = createVolatileImage(WIDTH, HEIGHT);
            }
            Graphics volG = offImage.getGraphics();
            volG.drawImage(bg, 0, 0, this);
            spmanager.draw(volG, this);
            pac.draw(volG, this);
            chipmanager.draw(volG, this);
            if (isAttr)
                atMng.draw(volG, this);
            volG.dispose();
            g.drawImage(offImage, 0, 0, this);
        } while (offImage.contentsLost());
    }

    public void update(Graphics g) ...{
        paint(g);
    }

    public void start() ...{
        System.gc();
        if (thread == null) ...{
            thread = new Thread(this);
            thread.start();
        }
    }

    @SuppressWarnings("deprecation")
    public void stop() ...{
        if (thread != null) ...{
            thread.stop();
            thread = null;
        }
    }

    public void run() ...{

        while (true) ...{
            // MAIN LOOP
            score = 0;
            number1 = 3;
            int stage = 1;
            esaInit();
            loadOK = true;
            while (number1 > 0) ...{
                while (gameMain(stage) == 2) ...{
                    if (stage == 2)
                        gameTheater();
                    stage++;
                    number1++;// 1:DEAD 2:CLEAR
                    esaInit();
                }
            }
            // GAME OVER
            isAttr = true;
            spmanager.setShow(false);
            pac.setShow(false);
            atMng.player = true;
            atMng.ready = false;
            atMng.gameover = true;
            repaint();

            timer.on();
            key = 0;
            while (true) ...{
                if (key > 0)
                    break;
                waitFrame();
            }
            timer.off();
            atMng.player = false;
            atMng.gameover = false;
        }

    }

    public void esaInit() ...{
        Graphics g = bg.getGraphics();
        g.drawImage(bg0, 0, 0, null);
        g.dispose();
        emanager.init(bg);
    }

    public int gameMain(int stage) ...{
        atMng.init(bg, score, number1);
        spmanager.init();
        pac.init();
        // 游戏状态 1:DEAD 2:CLEAR
        int gamestat = 0;
        int renzoku = 0;
        boolean ispower = false;
        boolean iseyesnd = false;
        Sprite chip;

        isAttr = true;
        int wait;
        if ((score == 0) && (number1 == 3)) ...{
            wait = 2000;
        } else ...{
            wait = 1000;
        }

        spmanager.setShow(false);
        pac.setShow(false);
        atMng.player = true;
        atMng.ready = true;
        repaint();
        sleep(wait);

        atMng.setBattle(--number1);
        spmanager.setShow(true);
        pac.setShow(true);
        atMng.player = false;
        atMng.ready = true;
        repaint();
        sleep(wait);
        isAttr = false;

        int time = 0;
        timer.on();
        int frame = 1;
        while (gamestat == 0) ...{
            for (int l = 0; l < frame; l++) ...{
                int score0 = score;
                if (time == 60 * 55) ...{
                    spmanager.setNawabari(false);
                } else if (time == 60 * 50) ...{
                    spmanager.setNawabari(true);
                } else if (time == 60 * 30) ...{
                    spmanager.setNawabari(false);
               &nbs

本文来源:http://www.gdgbn.com/wangyezhizuo/13544/