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: 迷宫(斜角地图实例)</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 < maze.length; j++) { <br> for(int i = 0; i < 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 >= 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 < maze.length; j++) { <br> for(int i = 0; i < 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 && <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 < 0 || j < 0 || j >= maze[0].length || <br> i >=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 + -
显示快捷键?