⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycanvas.java

📁 坦克游戏
💻 JAVA
字号:
import javax.microedition.lcdui.*;

public class Mycanvas extends Canvas implements Runnable
{
	Main midlet;
	Image bufImage;
	Image logoImage[];
	int logocnt;
	Player mytank;
	int state;
	int menuSelected;
	Map map;
	Bullet mybullet;
	Explode explode;
	
	
	public Mycanvas(Main midlet)
	{
		
		this.midlet = midlet;
		mytank = new Player();
		explode = new Explode();
		map = new Map();		
		map.createMap();
		logoImage = new Image[2];
		bufImage = Image.createImage(176,208);
		map.mapX = -(map.MAP_WIDTH - 176)>>1; // map初始坐标
		map.mapY = -(map.MAP_HEIGHT - 208);
		mybullet= new Bullet();
		try
		{
			logoImage[0] = Image.createImage("/logos0.png");
			logoImage[1] = Image.createImage("/logos1.png");
		}
		catch(Exception e){}
		new Thread(this).start();
	}
	
	public void run()
	{
		int sleeptime = 0;
		while(true)
		{			
			if(state == 0) sleeptime = 1000;
			else sleeptime = 80;
			bufPaint(bufImage.getGraphics());
			repaint();
			try
			{
				Thread.sleep(80);
			}
			catch(Exception e){}
			logocnt++;
			if(logocnt == 2) state = 1;	
			//if(mytank.isFire)
			//explode.frame++;
			if(!mybullet.bullet_collides()) mybullet.bulletMove();
			if(mytank.running)
			{				
				try
				{
					if(!collides())
					{	
						if(mytank.direction == 0 && (mytank.playerY < (208-13)>>1 && (map.mapY < 0)))			
						{
							map.mapY += mytank.speed;
						}
						else if(mytank.direction == 2 && (mytank.playerY > (208-13)>>1 && (map.mapY > -(map.MAP_HEIGHT - 208))))
						{
							map.mapY -= mytank.speed;
						}
						else if(mytank.direction == 1 && (mytank.playerX > (176-13)>>1 && (map.mapX > -(map.MAP_WIDTH - 176))))
						{
							map.mapX -= mytank.speed;
						}
						else if(mytank.direction == 3 && (mytank.playerX < (176-13)>>1 && (map.mapX < 0) ))
						{
							map.mapX += mytank.speed;
						}			
						else 
						{
							mytank.move();
						}
					}	
				}
				catch(Exception e){}			
			}						
		}	
	}
	
	public void bufPaint(Graphics g)
	{
		g.fillRect(0,0,bufImage.getWidth(),bufImage.getHeight());
		switch(state)
		{
			case 0:
				g.setColor(0xFFFFFF);
				g.drawImage(logoImage[logocnt],0,0,0);	
		    break;
			case 1:
				if(menuSelected == 0)g.setColor(0x00FF00);else g.setColor(0xFF0000);
				g.translate(70, 80);
				g.drawString("开始游戏", 0, 0, 0);
				if(menuSelected == 1)g.setColor(0x00FF00);else g.setColor(0xFF0000);
				g.translate(0, 20);
				g.drawString("帮助", 0, 0, 0);
				if(menuSelected == 2)g.setColor(0x00FF00);else g.setColor(0xFF0000);
				g.translate(0, 20);
				g.drawString("退出游戏", 0, 0, 0);
			break;
			case 2:
				g.drawImage(map.mapImage,map.mapX, map.mapY,0);	
				mybullet.paintBullet(g);
				explode.paintExplode(g);
				mytank.playerPaint(g);				
			break;
		}		
	}
	
	public void paint(Graphics g)
	{
		g.fillRect(0, 0, getWidth(), getHeight());
		g.drawImage(bufImage,(getWidth()-176) >> 1,(getHeight()-208) >> 1,0);
	}
	
	public boolean collides()throws ArrayIndexOutOfBoundsException //与地图碰撞检测
	{
		if(mytank.direction == 0) // up
		{
			int x1 = (mytank.playerX - map.mapX) / 16;
			int x2 = (mytank.playerX + 13 - map.mapX) / 16;	
			int y = (mytank.playerY - mytank.speed - map.mapY) / 16;
			for(int i = x1;i <= x2;i++)
			{
				if(map.mapdata[y][i] != 4 && map.mapdata[y][i] != 0) return true;
			}
		}
		else if(mytank.direction == 2)// down
		{
			int x1 = (mytank.playerX - map.mapX) / 16;
			int x2 = (mytank.playerX + 13 - map.mapX) / 16;	
			int y = (mytank.playerY + 13 + mytank.speed - map.mapY) / 16;
			for(int i = x1;i <= x2;i++)
			{
				if(map.mapdata[y][i] != 4 && map.mapdata[y][i] != 0 ) return true;
			}
		}
		else if(mytank.direction == 1)// right
		{
			int x = (mytank.playerX + 13 + mytank.speed - map.mapX) / 16;
			int y1 = (mytank.playerY - map.mapY) / 16;	
			int y2 = (mytank.playerY + 13 - map.mapY) / 16;
			for(int i = y1;i <= y2;i++)
			{
				if(map.mapdata[i][x] != 4 && map.mapdata[i][x] != 0) return true;
			}
		}
		else if(mytank.direction == 3)// left
		{
			int x = (mytank.playerX - mytank.speed - map.mapX) / 16;
			int y1 = (mytank.playerY  - map.mapY) / 16;	
			int y2 = (mytank.playerY + 13 - map.mapY) / 16;
			for(int i = y1;i <= y2;i++)
			{
				if(map.mapdata[i][x] != 4 && map.mapdata[i][x] != 0) return true;
			}
		}
		
		return false;
	}
	
	public void keyPressed(int keyCode)
	{
		int gkc = getGameAction(keyCode);
		switch(state)
		{
			case 1:
				switch(gkc)
				{
					case UP:
						menuSelected--;if(menuSelected < 0) menuSelected = 2;
				    break;
					case DOWN:
						menuSelected++;if(menuSelected > 2) menuSelected = 0;
					break;
					case FIRE:
						switch(menuSelected)
						{
							case 0:
								state = 2;
							break;
							case 1:
							break;
							case 2:
								midlet.notifyDestroyed();
								midlet.destroyApp(true);
							break;
						}
                    break;							
				}
			break;	
			case 2:
				switch(gkc)
				{
					case LEFT:
						mytank.running = true;
						mytank.direction = 3;
					break; 
					case RIGHT:
						mytank.running = true;
						mytank.direction = 1;
					break; 
					case UP:
						mytank.running = true;
						mytank.direction = 0;
					break; 
					case DOWN:
						mytank.running = true;
						mytank.direction = 2;
					break;
					case FIRE:						
						int x = mytank.playerX;
						int y = mytank.playerY;
						int dir = mytank.direction;
						mybullet.creatBullet(x,y,dir);
						mytank.isFire = true;
					break;
				}
			break;	
		}	
	}
	
	public void keyReleased(int keyCode)
	{
		mytank.running = false;
		//mytank.isFire = false;
	}
}

⌨️ 快捷键说明

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