maze25d.htm

来自「电脑图学(Computer Graphics)是资料结构、演算法与数学的应用」· HTM 代码 · 共 115 行

HTM
115
字号
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>







  
  
  
  
  
  
  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">







  
  
  
  
  
  
  
  <link rel="stylesheet" href="css/print.css" type="text/css">







  
  
  
  
  
  
  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">







  
  
  
  
  
  
  
  <title>迷宫(斜角地图实例)</title>
</head>


<body>







<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>







<h1><a href="ComputerGraphics.htm">Computer Graphics:&nbsp;迷宫(斜角地图实例)</a></h1>







这个程式就不多作解释了,所有的观念前面都讲过了,绘图时使用回圈走访阵列,所以深度问题也自然获得解决,<a href="map45Rotate.html">连结</a> 看看效果。 <br>







<ul>
  <li> Map45Rotate.java </li>
</ul>

<pre>package onlyfun.caterpillar.graphics.animation;<br><br>import java.awt.*; <br>import java.awt.event.KeyEvent;<br>import java.awt.event.KeyListener; <br>import javax.swing.JApplet;<br> <br>public class Map45Rotate extends JApplet <br>                            implements KeyListener {  <br>    private Image offScreen, lawnImage;  <br>    private Image block, floor, character2;<br>    <br>     // 1: Wall 2: Penguin <br>    private int[][] <br>    maze = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, <br>            {0,0,0,0,0,1,0,0,1,0,0,1,1,0,0,1}, <br>            {1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,1}, <br>            {1,0,0,0,0,1,0,1,1,0,1,0,1,0,0,1}, <br>            {1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1}, <br>            {1,1,0,1,0,1,1,0,1,1,0,0,1,0,1,1}, <br>            {1,1,0,0,0,0,1,0,0,1,0,0,0,0,1,1}, <br>            {1,1,0,0,1,0,1,1,1,1,0,1,0,0,1,1}, <br>            {1,1,1,1,1,0,0,0,1,1,0,0,0,0,1,1}, <br>            {1,0,0,0,0,0,0,0,1,0,0,1,1,0,1,1}, <br>            {1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,1}, <br>            {1,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1}, <br>            {1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1}, <br>            {1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1}, <br>            {1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, <br>            {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}}; <br> <br>    private SpriteAndMaze spriteAndMaze; <br>    <br>    private int halfWidth, halfHeight; <br>    private int startX, startY;<br>    private int characterImageX;<br> <br>    private Graphics offScreenGraphics;<br>    <br>    public void init() { <br>        addKeyListener(this);<br>        <br>        setBackground(Color.white);   <br> <br>        //取得影像 <br>        MediaTracker mediaTracker = new MediaTracker(this); <br>        floor = getImage(getDocumentBase(),"floor.gif");  <br>        block = getImage(getDocumentBase(),"block3.gif"); <br>        character2 = <br>               getImage(getDocumentBase(),"character2.gif"); <br>        mediaTracker.addImage(floor,0);<br>        mediaTracker.addImage(block,0);<br>        mediaTracker.addImage(character2,0);<br>      <br>        try { <br>            showStatus("影像载入中(Loading Images)..."); <br>            mediaTracker.waitForAll(); <br>        } <br>        catch(InterruptedException e){<br>            e.printStackTrace();<br>        }<br> <br>        int appletWidth  = getSize().width;    <br>        int appletHeight = getSize().height;  <br>        <br>        //建立次画面 <br>        lawnImage = createImage(appletWidth, appletHeight);<br>        Graphics lawnGraphics = lawnImage.getGraphics();<br>        <br>        offScreen = createImage(appletWidth, appletHeight); <br>        offScreenGraphics = offScreen.getGraphics(); <br>      <br>        halfWidth = floor.getWidth(this) / 2; <br>        halfHeight = floor.getHeight(this) / 2; <br>        <br>        startX = appletWidth / 2;<br>        startY = appletHeight / 8;<br>      <br>        // 绘制地板 <br>        for(int j = 0; j &lt; maze.length; j++) { <br>            for(int i = 0; i &lt; maze[0].length; i++) { <br>                int x = startX - i*halfWidth + j*halfWidth; <br>                int y = startY + i*halfHeight + j*halfHeight; <br>                lawnGraphics.drawImage(floor, x, y,this); <br>            } <br>        }<br>        <br>        spriteAndMaze = new SpriteAndMaze(0, 1, maze);<br>        <br>        Thread thread = new Thread(new Runnable() {<br>           public void run() {<br>               while(true) {<br>                   repaint(); <br>                   // 人物走动动画 <br>                   characterImageX += 50; <br>                   if(characterImageX &gt;= 300) <br>                       characterImageX = 0;<br>                   try {<br>                       Thread.sleep(250);<br>                   }<br>                   catch(InterruptedException e) {<br>                       e.printStackTrace();<br>                   }<br>               }<br>           }<br>        });<br>        thread.start();<br>    } <br> <br>    public void update(Graphics g) {<br>        paint(g);<br>    }<br>    <br>    public void paint(Graphics g) {<br>        offScreenGraphics.drawImage(lawnImage, 0, 0, this);<br>        <br>        // 绘制墙与人物<br>        for(int j = 0; j &lt; maze.length; j++) { <br>            for(int i = 0; i &lt; maze[0].length; i++) { <br>                int x = startX - i*halfWidth + j*halfWidth; <br>                int y = startY - 10 + i*halfHeight + <br>                          j*halfHeight;<br>                <br>                if(maze[i][j] == 1) {<br>                    offScreenGraphics.drawImage(block, x, <br>                                               y,this);<br>                }<br>                <br>                if(spriteAndMaze.getLocationX() == j &amp;&amp;  <br>                   spriteAndMaze.getLocationY() == i) {<br>                    offScreenGraphics.drawImage(character2, <br>                            x, y, x + 25, y + 25, <br>                            characterImageX, 0, <br>                            characterImageX + 50, 50, this);<br>                }<br>            } <br>        }<br>        //将次画面贴到主画面中 <br>        g.drawImage(offScreen,0,0,this); <br>    } <br>    <br>    //=====实作KeyListener介面 =====<br>    <br>    public void keyTyped(KeyEvent e)  { } <br> <br>    public void keyPressed(KeyEvent e) { <br>        int key = e.getKeyCode(); <br>        <br>        switch(key) {<br>            case KeyEvent.VK_RIGHT: <br>                spriteAndMaze.moveUp();<br>                break;<br>            case KeyEvent.VK_LEFT:<br>                spriteAndMaze.moveDown();<br>                break;<br>            case KeyEvent.VK_UP:<br>                spriteAndMaze.moveLeft();<br>                break;<br>            case KeyEvent.VK_DOWN:<br>                spriteAndMaze.moveRight();<br>                break;<br>        }<br>        <br>        repaint();<br>    } <br> <br>    public void keyReleased(KeyEvent e) {} <br>}<br> <br>class SpriteAndMaze { <br>    private int i, j; <br>    private int maze[][];  <br>    <br>    public SpriteAndMaze() {}<br>    <br>    public SpriteAndMaze(int x, int y) { <br>        this.i = y; <br>        this.j = x; <br>    }<br>    <br>    public SpriteAndMaze(int x, int y, int[][] maze) {<br>        this(x, y); <br>        this.maze = maze;      <br>    } <br> <br>    public void moveUp() { <br>        if(isMovable(i-1, j)) { <br>            i--; <br>        } <br>    } <br> <br>    public void moveDown() { <br>        if(isMovable(i+1, j)) { <br>            i++; <br>        } <br>    } <br> <br>    public void moveRight() { <br>        if(isMovable(i, j+1)) { <br>            j++; <br>        }<br>    } <br> <br>    public void moveLeft() { <br>        if(isMovable(i, j-1)) { <br>            j--; <br>        } <br>    } <br> <br>    private boolean isMovable(int i, int j) {<br>        if(i &lt; 0 || j &lt; 0 || j &gt;= maze[0].length || <br>           i &gt;=maze.length)<br>            return false;<br>        <br>        if(maze[i][j] == 0)<br>            return true;<br>        else<br>            return false;<br>    }<br>    <br>    public int getLocationX() {<br>        return j;<br>    }<br>    public int getLocationY() {<br>        return i;<br>    }<br>    public void setLocationX(int locationX) {<br>        this.j = locationX;<br>    }<br>    public void setLocationY(int locationY) {<br>        this.i= locationY;<br>    }<br>    public int[][] getMaze() {<br>        return maze;<br>    }<br>    public void setMaze(int[][] maze) {<br>        this.maze = maze; <br>    }<br>}<br></pre>
<br>







</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?