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

📄 mainpit.java

📁 一个J2ME SLG游戏范例
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	{
		g.drawImage(back_buffer,0,0,g.LEFT|g.TOP);
	}

	//主菜单
	public void mainMenu()
	{
		gb.setColor(0,0,0);
		gb.fillRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
		for(int i = 0; i < 5; i++)
		{
			drawMainMenu(gb, mainMenuText[i], (SCREEN_WIDTH - 72) / 2, ((SCREEN_HEIGHT - 22 * 5)/6 + 22)*i + (SCREEN_HEIGHT - 22 * 5)/6, 72, 22);//, 2, 6);
		}
		DealCursor();
	}


	//绘制菜单(内容,菜单坐标,宽高,字体位置)
	public void drawMainMenu(Graphics g, String s,int x,int y, int w, int h)//,int tx,int ty)
	{
		DrawFrame(g,x,y,w,h,4,frameColor,0);
		g.setColor(255,255,255);
		g.drawString(s,x+16,y+3,g.TOP|g.LEFT);
	}

	public void DealCursorMove()
	{
		if(hasPressed&&!moveaction)
		{
			switch(kCode)
			{
				case 2:
					if(cursorSY > 2)//静止背景时光标移动
					{
						cursorSY--;
						cursorMY--;
					}
					else if(cursorSY > 0&&cursorMY > 2)//背景随光标移动
					{
						cursorMY--;
						y--;
						RollScreen(gs,2);
					}
					else if(cursorMY > 0)//边界光标移动情况
					{
						cursorMY--;
						cursorSY--;
					}
				break;
				case 8:
					if(cursorSY < SCREEN_MAX_HEIGHT - 2)
					{
					cursorSY++;
					cursorMY++;
					}
					else if(cursorMY < MAP_MAX_HEIGHT - 2&&cursorSY < SCREEN_MAX_HEIGHT)
					{
						cursorMY++;
						y++;
							RollScreen(gs,8);
					}
					else if(cursorMY < MAP_MAX_HEIGHT)
					{
						cursorSY++;
						cursorMY++;
					}
				break;
				case 4:
					if(cursorSX > 2)
					{
						cursorSX--;
						cursorMX--;
					}
					else if(cursorMX > 2&&cursorSX > 0)
					{
						x--;
						cursorMX--;
						RollScreen(gs,4);
					}
					else if(cursorMX > 0)
					{
						cursorSX--;
						cursorMX--;
					}
				break;
				case 6:
				if(cursorSX < SCREEN_MAX_WIDTH - 2)
				{
					cursorSX++;
						cursorMX++;
				}
				else if(cursorMX < MAP_MAX_WIDTH - 2&&cursorSX < SCREEN_MAX_WIDTH)
				{
					x++;
						cursorMX++;
						RollScreen(gs,6);
				}
				else if(cursorMX < MAP_MAX_WIDTH)
				{
					cursorSX++;
						cursorMX++;
				}
			break;
			}
			tally = 0;
		}
	}

	public void DealPersonMove()
	{
		if(moveaction)
		{
			hasPressed = true;
			boolean endmove = true;
			if(endmove&&targetSY + y + 1 <= MAP_MAX_HEIGHT)
			{
				if(move[targetSY+y][targetSX+x] ==
				move[targetSY+y+1][targetSX+x] + mappos[map[targetSY+y+1][targetSX+x]][currentactkind])//下走
				{
					currentactstate = 2;
					currentactmovey++;
					if(currentactmovey % TILE_HEIGHT == 0)
					{
						targetSY++;
					}
					endmove = false;
				}
			}
			if(endmove&&targetSY+y-1 >= 0)
			{
				if(move[targetSY+y][targetSX+x] ==
				move[targetSY+y-1][targetSX+x] + mappos[map[targetSY+y-1][targetSX+x]][currentactkind])//上走
				{
					currentactstate = 3;
					currentactmovey--;
					if(currentactmovey % TILE_HEIGHT == 0)
					{
						targetSY--;
					}
					endmove = false;
				}
			}
			if(endmove&&targetSX+x+1 <= MAP_MAX_WIDTH)
			{
				if(move[targetSY+y][targetSX+x] ==
				move[targetSY+y][targetSX+x+1] + mappos[map[targetSY+y][targetSX+x+1]][currentactkind])//右走
				{
					currentactstate = 5;
					currentactmovex++;
					if(currentactmovex % TILE_WIDTH == 0)
					{
						targetSX++;
					}
					endmove = false;
				}
			}
			if(endmove&&targetSX+x-1 >= 0)
			{
				if(move[targetSY+y][targetSX+x] ==
				move[targetSY+y][targetSX+x-1] + mappos[map[targetSY+y][targetSX+x-1]][currentactkind])//左走
				{
					currentactstate = 4;
					currentactmovex--;
					if(currentactmovex % TILE_WIDTH == 0)
					{
						targetSX--;
					}
					endmove=false;
				}
			}

			if(endmove)
			{
				targetstate = 2;
				moveaction = false;
				hasPressed = false;
				CurrentScene = 2;
				CurrentMenu = 1;
				MenuFocus = 0;

				MenuInfo[1] = 1;//没有攻击目标
				byte s = 1;
				//移动完成后的可攻击判断
				for(int j = -currentactatkmax; j <= currentactatkmax; j++)
				{
					for(int i = targetSX - (currentactatkmax - Math.abs(j)); i <= targetSX + (currentactatkmax - Math.abs(j)); i++)
					{
						for(int m = 0; m < actnum; m++)
						{
							if(m == currentact)
							{
								continue;
							}
							if(infoact[idact[m]][1] - x == i&&infoact[idact[m]][2] - y == j + targetSY)
							{
								MenuInfo[1] = 2;//有攻击目标
								currentatk = 1;
								atktarget[s] = (byte)m;
								s++;
								break;
							}
						}
					}
				}
			}
		}
	}

	public void playGame()
	{
		switch(CurrentScene)
		{
			case 0://章节显示,并载入相关信息
			break;
			case 1://游戏大地图状态
				//光标移动判断
				DealCursorMove();
				//游戏中屏幕坐标与地图坐标相关
				currentactSX = currentactMX - x;
				currentactSY = currentactMY - y;
				//人物移动
				DealPersonMove();
				DrawBuffer(gb);//绘制静态缓存
				DrawPerson(gb);//绘制人物
				DealCursor();//绘制光标
				DealMapRevise();//地形修正
				//DealPersonInfo();
			break;
			case 2://菜单1(待机,攻击)
				DrawBuffer(gb);//绘制静态缓存
				DrawPerson(gb);//绘制人物
				DrawMenu(gb,CurrentMenu);
				DealCursor();
			break;
			case 3://攻击选定
				DrawBuffer(gb);//绘制静态缓存
				if(targetstate == 2)//攻击对象选定
				{
					DrawRange(gb, targetSX, targetSY, currentactatkmin, currentactatkmax, 0x00ff0000);
					DrawPerson(gb);//绘制人物
					DealCursor();
				}
				else if(targetstate == 3)//攻击过程
				{
					atkcg(gb);
					targetstate = 0;
					currentactstate = 0;
					CurrentScene = 1;
				}
			break;
		}
	}

	public void run()
	{
		while(true)
		{
			tally++;
			cursortally++;
			switch(STATE)
			{
				case 0://logo
				break;
				case 1://开始菜单
					mainMenu();
				break;
				case 2://游戏
					playGame();
				break;
			}

			//System.out.println("cursorMX="+cursorMX+"   cursorSX="+cursorSX+"    cursorMY="+cursorMY+"    cursorSY="+cursorSY);
			//System.out.println("currentactSX="+currentactSX+"   currentactSY="+currentactSY+"    currentactMY="+currentactMY+"    currentactMY="+currentactMY);
			repaint();
			System.gc();
			try
			{
				Thread.sleep(hangfire);
			}
			catch(Exception e)
			{}
		}
	}
	//绘制文字容器框(位置x,y,大小w,h,边框层数n,颜色c,框架类型k)
	public void DrawFrame(Graphics g, int x, int y, int w, int h, int n, int c[][],int k)
	{
		for(int i = 0; i < n;i++)
		{
			g.setColor(c[k][i]);
			g.fillRect(x + i, y+i, w - 2 * i, h - 2 * i);
		}
	}
	//绘制范围(g,目标位置,范围下限,范围上限颜色)
	public void DrawRange(Graphics g, int x, int y, int rmin, int rmax, int c)
	{
		gb.setColor(c);
		for(int i = 0; i <= rmax; i++)
		{
			//右下
			gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y + (rmax - i)) * TILE_SIZE + TILE_SIZE,
						(x + i) * TILE_SIZE + TILE_SIZE, (y + (rmax - i)) * TILE_SIZE);

			gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y + (rmax - i)) * TILE_SIZE + TILE_SIZE,
						(x + i) * TILE_SIZE, (y + (rmax - i)) * TILE_SIZE + TILE_SIZE);

			//右上
			gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y - (rmax - i)) * TILE_SIZE,
						(x + i) * TILE_SIZE, (y - (rmax - i)) * TILE_SIZE);

			gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y - (rmax - i)) * TILE_SIZE,
						(x + i) * TILE_SIZE + TILE_SIZE, (y - (rmax - i)) * TILE_SIZE + TILE_SIZE);

			//左下
			gb.drawLine((x - i) * TILE_SIZE, (y + (rmax - i)) * TILE_SIZE + TILE_SIZE,
						(x - i) * TILE_SIZE, (y + (rmax - i)) * TILE_SIZE);

			gb.drawLine((x - i) * TILE_SIZE, (y + (rmax - i)) * TILE_SIZE + TILE_SIZE,
						(x - i) * TILE_SIZE + TILE_SIZE, (y + (rmax - i)) * TILE_SIZE + TILE_SIZE);

			//左上
			gb.drawLine((x - i) * TILE_SIZE, (y - (rmax - i)) * TILE_SIZE,
						(x - i) * TILE_SIZE + TILE_SIZE, (y - (rmax - i)) * TILE_SIZE);

			gb.drawLine((x - i) * TILE_SIZE, (y - (rmax - i)) * TILE_SIZE,
						(x - i) * TILE_SIZE, (y - (rmax - i)) * TILE_SIZE + TILE_SIZE);

			if(i <= rmin)//绘制下限
			{
				//右下
				gb.drawLine((x - i) * TILE_SIZE, (y - (rmin - i)) * TILE_SIZE,
							(x - i) * TILE_SIZE + TILE_SIZE, (y - (rmin - i)) * TILE_SIZE);

				gb.drawLine((x - i) * TILE_SIZE, (y - (rmin - i)) * TILE_SIZE,
							(x - i) * TILE_SIZE, (y - (rmin - i)) * TILE_SIZE + TILE_SIZE);

				//右上
				gb.drawLine((x - i) * TILE_SIZE, (y + (rmin - i)) * TILE_SIZE + TILE_SIZE,
							(x - i) * TILE_SIZE, (y + (rmin - i)) * TILE_SIZE);

				gb.drawLine((x - i) * TILE_SIZE, (y + (rmin - i)) * TILE_SIZE + TILE_SIZE,
							(x - i) * TILE_SIZE + TILE_SIZE, (y + (rmin - i)) * TILE_SIZE + TILE_SIZE);

				//左下
				gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y - (rmin - i)) * TILE_SIZE,
							(x + i) * TILE_SIZE, (y - (rmin - i)) * TILE_SIZE);

				gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y - (rmin - i)) * TILE_SIZE,
							(x + i) * TILE_SIZE + TILE_SIZE, (y - (rmin - i)) * TILE_SIZE + TILE_SIZE);

				//左上
				gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y + (rmin - i)) * TILE_SIZE + TILE_SIZE,
							(x + i) * TILE_SIZE + TILE_SIZE, (y + (rmin - i)) * TILE_SIZE);

				gb.drawLine((x + i) * TILE_SIZE + TILE_SIZE, (y + (rmin - i)) * TILE_SIZE + TILE_SIZE,
							(x + i) * TILE_SIZE, (y + (rmin - i)) * TILE_SIZE + TILE_SIZE);
			}

		}
	}
	//绘制攻击血槽
	public void DrawLifeShow(Graphics g, int blue, int red)
	{
		int m;
		int d;
		int n;
		//System.out.println(" blue =  " + blue + "   red = "+red);
		if(infoact[idact[red]][2] - y < 4)
		{
			d = 80;
		}
		else
		{
			d = 0;
		}
		//攻击方
		//血量显示
		m = 16 - 3;
		n = d + 16;
		//框
		DrawFrame(g,m,n,54,30,4,frameColor,4);

		//槽

		g.setColor(232,144,0);
		g.drawRect(16 + m + 2, 1 + 8 + n + 4 + 3, 25, 6);

		g.setColor(112,48,0);
		g.fillRect(16 + m + 3, 2 + 8 + n + 4 + 3, 23, 4);

		//血
		g.setColor(248, 248, 0);
		g.fillRect(16 + m + 4, 3 + 8 + n + 4 + 3, 18, 2);

		//人物名称显示
		m = 24-3;
		n = d + 8;

		DrawFrame(g,m,n,38,22,4,frameColor,4);

		//反击方
		m = 64+3;
		n = d + 16;
		DrawFrame(g,m,n,54,30,4,frameColor,3);

		//人物名称显示
		m = 72+3;
		n = d + 8;
		DrawFrame(g,m,n,38,22,4,frameColor,3);
	}

	public void DrawMenu(Graphics g, int k)//绘制菜单,k:菜单类型
	{
		int s = MenuInfo[k];
		int m = SCREEN_WIDTH - 3 * TILE_SIZE;
		if(cursorSX >=4)
		{
			m = TILE_SIZE;
		}
		else
		{
			m = SCREEN_WIDTH - 3 *TILE_SIZE;;
		}
		DrawFrame(g, m,	TILE_SIZE, 37, TILE_SIZE * s + 5,4,frameColor,1);
		g.setColor(255,255,255);

		for(int i = 0; i < s; i++)
		{
			g.drawString(MenuContent[k][s - i - 1], m + TILE_SIZE+3, 2+TILE_SIZE + TILE_SIZE * i, g.TOP|g.HCENTER);
		}
	}
	//人物基本信息
	public void DealPersonInfo()
	{
		if(cursorSX > SCREEN_MAX_WIDTH / 2)
		{
			DrawPersonInfo(gb, 5, 5);
		}
		else
		{
			DrawPersonInfo(gb, SCREEN_WIDTH - 53, 5);
		}
	}
	public void DrawPersonInfo(Graphics g,int x,int y)
	{
		DrawFrame(gb,x,y,48,32,3,frameColor,5);
	}
	//地图修正信息处理
	public void DealMapRevise()
	{
		if(cursorSX > SCREEN_MAX_WIDTH / 2)
		{
			DrawMapRevise(gb, 5, SCREEN_HEIGHT - 41, map[cursorMY][cursorMX]);
		}
		else
		{
			DrawMapRevise(gb, SCREEN_WIDTH - 41, SCREEN_HEIGHT - 41, map[cursorMY][cursorMX]);
		}
	}
	public void DrawMapRevise(Graphics g,int x,int y, int mk)
	{
		DrawFrame(gb,x,y,36,36,2,frameColor,2);
		g.setColor(88,88,192);
		g.fillRect(x+2,y+2,32,16);
		g.setColor(255,255,255);
		g.drawString(mapname[mk],x+2+11,y+2,g.TOP|g.LEFT);
		g.setColor(0,0,0);
		g.drawString("DEF:" + maprevise[1][mk],x+2,y+2+16,g.TOP|g.LEFT);
		g.drawString("AVO:" + maprevise[0][mk],x+2,y+2+24,g.TOP|g.LEFT);
	}

	public void DrawBuffer(Graphics g)//将静态缓存绘制到背景缓存中
	{
		g.drawImage(static_buffer,0,0,g.LEFT|g.TOP);
	}

	//攻击动画
	public void atkcg(Graphics g)
	{
		int c1 = 0;
		int c2 = 0;
		int picnum;
		for(int i = 0; i < 16;i++)
		{
			tally++;
			cursortally++;
			DrawBuffer(g);//绘制静态缓存
			c1 = 0;
			c2 = 0;
			if(i/2 == 1||i/2 == 2)
			{
				c1 = 1;
			}
			if(i/2 == 5||i/2 == 6)

⌨️ 快捷键说明

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