基于《仙剑奇侠传柔情版》Java的简单实现(二)
2018-12-02 by Kris
需要上次的GameFrame.class中窗口框架承载:https://www.cnblogs.com/louis6575/p/10051873.html
package firstDemo; import java.applet.Applet; import java.applet.AudioClip; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.JPanel; /** * 本类文件表示游戏案例的自定义画板类,也就是游戏的界面 * @author Louis * */ //2 游戏的静态界面 //2.1 编写自定义画板类,添加绘画方法 //JAVA中,遵循单继承(类)、多实现(接口) @SuppressWarnings("serial") public class GamePanel extends JPanel implements Runnable,KeyListener{ //声明图片路径变量名称 //2.2.1.定义图片素材的相关内容 Image startImage,mengjImage,resumeImage,findxyImage,mengjToljcImage; Image[] startButtonImages,resumeButtonImages,lxytImages,lightImages; Image[] ToScDoorImages,ToLjcDoorImages,mengjDoorImages,scMapImages; Image[] splgifImages,welcomeImages; Image ljcImage,lxyImage;//用来表示李逍遥当前图片(移动时,需要更新) Image dialogImage; Image[] lxyUpImages,lxyDownImages,lxyLeftImages,lxyRightImages; BufferedImage splImage; Image[] awsImages,henImages,ropeImages,azhuImages,chickImages,lchickImages,wcsImages; private int start_DIST = 120,resume_DIST = 109,limUP = 240,limDOWN = 566,limRIGHT = 250,limLEFT = 10; private int LXYX,LXYY,LXYDIR; boolean ISLJC,ISSC; int ToScDoorX,ToLjcDoorX,mengjDoorX,scMapX,startX,startButtonX,welcomeX,mengjX,lightX,resumeX,resumeButtonX,findxyX; int ToScDoorY,ToLjcDoorY,mengjDoorY,scMapY,startY,startButtonY,welcomeY,mengjY,lightY,resumeY,resumeButtonY,findxyY; int ToScDoorIndex,ToLjcDoorIndex,mengjDoorIndex,scMapIndex,startButtonIndex,resumeButtonIndex,lxytIndex,lightIndex,welcomeIndex; boolean isStartShow,isstartButtonShow,isResumeShow,isResumeButtonShow,isLxyShow,isLjcShow,isScMapShow; boolean isSave,isWelcome,isMengjShow,isLxytShow,isSBNH; int lxyDir; int ljcX,lxyX,lxytX,awsX,henX,ropeX,azhuX,chickX,lchickX,wcsX,dialogX,ChatX,splX; int ljcY,lxyY,lxytY,awsY,henY,ropeY,azhuY,chickY,lchickY,wcsY,dialogY,ChatY,splY; int awsIndex,henIndex,ropeIndex,azhuIndex,chickIndex,lchickIndex,wcsIndex,lxyIndex,splgifImagesIndex; //表示阿旺婶当前下标 String[] ChatMessages1,ChatMessages2,ChatMessages3; int ChatIndex1,ChatIndex2,ChatIndex3; boolean isChatShow1,isChatShow2,isChatShow3,isSpeedShift;//用来表示聊天内容是否该出现的当前状态值 BufferedImage ljcRedMap;//李家村红色地图 BufferedImage scRedMap;//市场红色地图 private int ClothCode = 0; private int UpEdge = 0; private int LeftEdge = 0; private int MoveSpeed; //构造方法,一般用来做初始化操作 public GamePanel(){ //获取路径并初始化绘画位置 ToScDoorImages = new Image[6];ToLjcDoorImages = new Image[6];mengjDoorImages = new Image[6];welcomeImages = new Image[3]; scMapImages = new Image[3];lxytImages = new Image[2];lightImages = new Image[2]; startButtonImages = new Image[3];resumeButtonImages = new Image[4];splgifImages = new Image[13]; splgifImages = new Image[13]; awsImages = new Image[17];henImages = new Image[6];ropeImages = new Image[4];azhuImages = new Image[6]; chickImages = new Image[2];lchickImages = new Image[2];wcsImages = new Image[14]; lxyUpImages = new Image[8];lxyDownImages = new Image[8];lxyLeftImages = new Image[8];lxyRightImages = new Image[8]; //初始化数组内容 isstartButtonShow = true; isResumeButtonShow = true; isStartShow = true; isSBNH = true; isMengjShow = false; isLxytShow = true; isResumeShow = false; isWelcome = true; isLxyShow = false; isChatShow1 = false;isChatShow2 = false;isChatShow3 = false; isSpeedShift = false; isScMapShow = false; isLjcShow = false; //李家村背景音乐 File file = new File("仙剑奇侠传游戏素材/素材/music/0.mid"); URL url = null; try { URI uri = file.toURI(); url = uri.toURL(); } catch (MalformedURLException ex) { } AudioClip clip = Applet.newAudioClip(url); clip.loop(); //也就是将阿旺婶的第i张图片内容读取保存到阿旺婶的数组第i下标位置上 try { //两种路径:绝对路径(以盘符或根目录(/)开始的路径)、相对路径(在java代码中,) startImage = ImageIO.read(new File("仙剑奇侠传游戏素材/开始游戏/start0.png")); mengjImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/梦境/梦境.png")); mengjToljcImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/梦境过渡李家村/0.png")); resumeImage = ImageIO.read(new File("仙剑奇侠传游戏素材/返回游戏/resume.png")); ljcImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村/0.png")); dialogImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/对话框/1.png")); //splImage = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/杀破狼静/0.png")); } catch (IOException e) { e.printStackTrace(); } for(int i = 0;i< welcomeImages.length;i++){ try { welcomeImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/欢迎界面/"+i+".png")); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } for(int i = 0;i < lxytImages.length;i++){ try { lxytImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥躺下/"+i+".png")); lightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/梦境/"+i+".png")); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } for(int i = 0;i < startButtonImages.length;i++){ try { startButtonImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/开始游戏/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < resumeButtonImages.length;i++){ try { resumeButtonImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/返回游戏/"+i+".png")); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } for(int i = 0;i < scMapImages.length;i++){ try { scMapImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村市场/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < awsImages.length;i++){ try { awsImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/阿旺婶/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < henImages.length;i++){ try { henImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/母鸡/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < ropeImages.length;i++){ try { ropeImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/跳绳/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < azhuImages.length;i++){ try { azhuImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/阿朱喂鸡/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < chickImages.length;i++){ try { chickImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/小鸡/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < lchickImages.length;i++){ try { lchickImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/小小鸡/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < wcsImages.length;i++){ try { wcsImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/旺财嫂/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < lxyDownImages.length;i++){ try{ //0:李逍遥初始装扮 1:绿色 if(ClothCode == 0){ lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥上/"+i+".png")); lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥下/"+i+".png")); lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥左/"+i+".png")); lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥右/"+i+".png")); }else if(ClothCode == 1){ lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥上/"+i+".png")); lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥下/"+i+".png")); lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥左/"+i+".png")); lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥右/"+i+".png")); } } catch (IOException e) { e.printStackTrace(); } } for(int i = 0;i < ToScDoorImages.length;i++){ try { ToScDoorImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/华丽传送阵/"+i+".png")); ToLjcDoorImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/华丽传送阵/"+i+".png")); mengjDoorImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/华丽传送阵/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } for (int i = 0;i < splgifImages.length;i++){ try { splgifImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/杀破狼/"+i+".png")); } catch (IOException e) { e.printStackTrace(); } } //初始化坐标 startX = 0;startY = 0; resumeX = -8;resumeY = -40; startButtonX = 250;startButtonY = 125; resumeButtonX = 348;resumeButtonY = 240; welcomeX = 115;welcomeY = 145; lxytX = 450;lxytY = 450; lightX = 400;lightY = 40; findxyX = 0;findxyY = 0; splX = 40;splY = 400; ljcX = -200;ljcY = -200; lxyX = 175;lxyY = 720; awsX = 612;awsY=520; henX = 740;henY = 320;ropeX = 900;ropeY = 680;azhuX = 770;azhuY = 350; chickX=820;chickY = 350;lchickX=805;lchickY = 340;wcsX = 800;wcsY = 600; scMapX = -200 - scMapX;ToScDoorX = 1600;ToLjcDoorX = 15;mengjDoorX = 750; scMapY = -200 - scMapY;ToScDoorY = 990;ToLjcDoorY = 620;mengjDoorY = 500; lxyIndex = 0; lxyImage = lxyDownImages[lxyIndex]; ChatMessages1 = new String[] { "李逍遥:阿旺婶,最近村子里有发生了什么有趣的事情吗?","阿旺嫂:是逍遥啊,也没什么,就是从别处来了个富贵人家的公子哥", "李逍遥:这样的啊,那公子长什么样","阿旺嫂:就是衣服上都好似镶了金,还随身带着精美的武器", "李逍遥:武器? 是这样的武器 剑吗?","阿旺嫂:我也不是很清楚啊,你可以去问问旺财嫂!"}; ChatMessages2 = new String[] { "阿朱:逍遥,你来的正好,我正要去找你呢","李逍遥:阿朱姐姐,找我什么事啊","阿朱:村里来了个人,他其实是蜀山的长老", "李逍遥:蜀山是什么地方啊,很厉害吗","阿朱:你从小就在村子里,自然不知道,蜀山可是一个很大的门派呢","李逍遥:门派,是不是可以教人功法,然后可以让人行侠仗义啊", "阿朱:嗯,他是来收徒的,你可以去码头看看","李逍遥:嗯,我这就去!"}; ChatMessages3 = new String[] { "李逍遥:旺财嫂子,听说村里来了个外人","旺财嫂:对啊,那人长得真的俊啊!","李逍遥:听说他还带着很精美的武器啊","旺财嫂:对,好像是猎户用的弓,还会放光呢!","李逍遥:那他到底是来干什么的啊","阿旺嫂:这个你到时可以问问阿朱妹子,他们聊了好久","李逍遥:好吧,谢谢嫂子"}; //2.2.2.初始化图片素材的相关内容 try{ ljcRedMap = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村/RedMap.png")); }catch (IOException e) { e.printStackTrace(); } try { scRedMap = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李家村市场/RedMap.png")); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } //绘画方法 public void paint(Graphics g){ //绘画 super.paint(g); //清空原有画面,重新画dialogImage for(int i = 0;i < lxyDownImages.length;i++){ try{ //0:李逍遥初始装扮 1:绿色 if(ClothCode == 0){ lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥上/"+i+".png")); lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥下/"+i+".png")); lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥左/"+i+".png")); lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥初始装扮/李逍遥右/"+i+".png")); }else if(ClothCode == 1){ lxyUpImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥上/"+i+".png")); lxyDownImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥下/"+i+".png")); lxyLeftImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥左/"+i+".png")); lxyRightImages[i] = ImageIO.read(new File("仙剑奇侠传游戏素材/素材/李逍遥绿色套装/李逍遥右/"+i+".png")); } } catch (IOException e) { e.printStackTrace(); } } try { findxyImage = ImageIO.read(new File("仙剑奇侠传游戏素材/定位.png")); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } if(isLjcShow){ ljcX = (this.getWidth() - lxyImage.getWidth(null))/2-lxyX; ljcY = (this.getHeight() - lxyImage.getHeight(null))/2-lxyY; if(ljcY >= UpEdge){ ljcY = UpEdge; } if(ljcY <= this.getHeight()-ljcImage.getHeight(null)){ ljcY = this.getHeight()-ljcImage.getHeight(null); } if(ljcX >= LeftEdge){ ljcX = LeftEdge; }if(ljcX <= this.getWidth()-ljcImage.getWidth(null)){ ljcX = this.getWidth()-ljcImage.getWidth(null); } g.drawImage(ljcImage,ljcX,ljcY,this);//g 可以理解成一只画笔 坐标原点是窗口或画板左上角 //g.drawImage(lxyRightImage,lxyX,lxyY,this); //第一次的静态图 g.drawImage(awsImages[awsIndex],awsX + ljcX,awsY + ljcY,this); g.drawImage(henImages[henIndex], henX + ljcX,henY + ljcY,this); g.drawImage(ropeImages[ropeIndex],ropeX + ljcX,ropeY + ljcY,this); g.drawImage(azhuImages[azhuIndex],azhuX + ljcX,azhuY + ljcY,this); g.drawImage(chickImages[chickIndex],chickX + ljcX,chickY + ljcY,this); g.drawImage(lchickImages[lchickIndex],lchickX + ljcX,lchickY + ljcY,this); g.drawImage(wcsImages[wcsIndex],wcsX + ljcX,wcsY + ljcY,this); g.drawImage(ToScDoorImages[ToScDoorIndex],ToScDoorX + ljcX,ToScDoorY + ljcY,this); dialogX = (this.getWidth() - dialogImage.getWidth(null))/2; dialogY = this.getHeight() - dialogImage.getHeight(null); g.drawImage(lxyImage,lxyX + ljcX,lxyY + ljcY,this); //主角最后画 if(isSBNH){ //十八年后 g.drawImage(mengjToljcImage,0,0,this); } if(isChatShow1){ g.drawImage(dialogImage,dialogX,dialogY,this); g.setColor(Color.WHITE); g.setFont(new Font("楷体",Font.BOLD,30)); g.drawString(ChatMessages1[ChatIndex1], dialogX + 80, dialogY + 200); //g.drawImage(lxyUpImage[lxyIndex],lxyX,lxyY,this); //2.2.绘画静态界面(1个场景+7个配角+1个主角) //2.2.将素材文件夹导入工程 //2.2.3.绘画图片素材的相关内容 } else if(isChatShow2){ g.drawImage(dialogImage,dialogX,dialogY,this); g.setColor(Color.WHITE); g.setFont(new Font("楷体",Font.BOLD,30)); g.drawString(ChatMessages2[ChatIndex2], dialogX + 80, dialogY + 200); } else if(isChatShow3){ g.drawImage(dialogImage,dialogX,dialogY,this); g.setColor(Color.WHITE); g.setFont(new Font("楷体",Font.BOLD,30)); g.drawString(ChatMessages3[ChatIndex3], dialogX + 80, dialogY + 200); } } //System.out.println(LXYDIR+","+LXYX+","+LXYY+isSave); //传送门 if(isMengjShow && Math.abs(lxyX + lxyImage.getWidth(null)/2 - (mengjDoorX + mengjDoorImages[0].getWidth(null)/2)) < 70 && Math.abs(lxyY + lxyImage.getHeight(null) - (mengjDoorY + mengjDoorImages[0].getHeight(null)/2)) < 70){ //梦境传送至李家村 isMengjShow = !isMengjShow; lxyX = 200;lxyY = 690; ClothCode = 0; //3.2.3.休息停顿操作 try { Thread.sleep(80); } catch (InterruptedException e) { e.printStackTrace(); } }else if(isLjcShow == true && Math.abs(lxyX + lxyImage.getWidth(null)/2 - (ToScDoorX + ToScDoorImages[0].getWidth(null)/2)) < 70 && Math.abs(lxyY + lxyImage.getHeight(null) - (ToScDoorY + ToScDoorImages[0].getHeight(null)/2)) < 70){ //李家村传送至市场 isLjcShow = !isLjcShow; isScMapShow = !isScMapShow; lxyX = 200;lxyY = 645; //3.2.3.休息停顿操作 try { Thread.sleep(80); } catch (InterruptedException e) { e.printStackTrace(); } }else if(isScMapShow == true && Math.abs(lxyX +lxyImage.getWidth(null)/2 - (ToLjcDoorX + ToLjcDoorImages[0].getWidth(null)/2)) < 70 && Math.abs(lxyY + lxyImage.getHeight(null) - (ToLjcDoorY + ToLjcDoorImages[0].getHeight(null)/2)) < 70){ //市场传送至李家村 isLjcShow = !isLjcShow; isScMapShow = !isScMapShow; lxyX = 1580;lxyY = 990; //3.2.3.休息停顿操作 try { Thread.sleep(80); } catch (InterruptedException e) { e.printStackTrace(); } } //System.out.println(lxyX+","+lxyY); //找坐标 //市场边界限制 if(isScMapShow){ scMapX = (this.getWidth() - lxyImage.getWidth(null))/2-lxyX; scMapY = (this.getHeight() - lxyImage.getHeight(null))/2-lxyY; if(scMapY >= UpEdge){ scMapY = UpEdge; } if(scMapY <= this.getHeight()-scMapImages[0].getHeight(null)){ scMapY = this.getHeight()-scMapImages[0].getHeight(null); } if(scMapX >= LeftEdge){ scMapX = LeftEdge; }if(scMapX <= this.getWidth()-scMapImages[0].getWidth(null)){ scMapX = this.getWidth()-scMapImages[0].getWidth(null); } //System.out.println(isResumeShow+","+isLjcShow+","+isScMapShow); g.drawImage(scMapImages[scMapIndex],scMapX,scMapY,this); g.drawImage(ToLjcDoorImages[ToLjcDoorIndex],ToLjcDoorX + scMapX,ToLjcDoorY + scMapY,this); g.drawImage(splgifImages[splgifImagesIndex],splX +200+ scMapX,splY + 20+scMapY,this); g.drawImage(lxyImage,lxyX + scMapX,lxyY + scMapY,this); //主角最后画 } if(isMengjShow){ g.drawImage(mengjImage,0,0,this); g.drawImage(lxytImages[lxytIndex],lxytX,lxytY,this); g.drawImage(lightImages[lightIndex],lightX,lightY,this); g.drawImage(mengjDoorImages[mengjDoorIndex],mengjDoorX,mengjDoorY,this); g.drawImage(lxyImage,lxyX,lxyY,this); } if(isWelcome){ welcomeY = this.getHeight() - welcomeImages[welcomeIndex].getHeight(null); welcomeX = (this.getWidth() - welcomeImages[welcomeIndex].getWidth(null))/2; g.drawImage(welcomeImages[welcomeIndex],welcomeX,welcomeY,this); } if(isStartShow){ g.drawImage(startImage,startX,startY,this); if(isstartButtonShow){ g.drawImage(startButtonImages[startButtonIndex],startButtonX,startButtonY,this); } } if(isResumeShow){ //super.paint(g); g.drawImage(resumeImage,resumeX,resumeY,this); if(isResumeButtonShow){ g.drawImage(resumeButtonImages[resumeButtonIndex],resumeButtonX,resumeButtonY,this); } } //g.drawImage(splImage,splX + ljcX,splY + ljcY,this); //g.drawImage(findxyImage, findxyX, findxyY,this); //System.out.println(findxyX+","+findxyY); //找坐标 } //@Overridee public void run() { // 3.2.实现配角运动 while(true){ //3.2.1.修改图片数组下标 awsIndex++;henIndex++;ropeIndex++;azhuIndex++;chickIndex++;lchickIndex++;wcsIndex++; scMapIndex++;ToScDoorIndex++;ToLjcDoorIndex++;lxytIndex++;lightIndex++; splgifImagesIndex++;mengjDoorIndex++; if(splgifImagesIndex > splgifImages.length - 1){ splgifImagesIndex = 0; } if(lxytIndex > lxytImages.length - 1){ lxytIndex = 0; } if(lightIndex > lightImages.length - 1){ lightIndex = 0; } if(ToLjcDoorIndex > ToLjcDoorImages.length-1){ ToLjcDoorIndex = 0; } if(mengjDoorIndex > mengjDoorImages.length - 1){ mengjDoorIndex = 0; } if(ToScDoorIndex > ToScDoorImages.length-1){ ToScDoorIndex = 0; } if(scMapIndex > scMapImages.length-1){ scMapIndex = 0; } if(awsIndex > awsImages.length-1){ awsIndex = 0;//补充:判断处理下标边界问题 } if(henIndex > henImages.length-1){ henIndex = 0;//补充:判断处理下标边界问题 } if(ropeIndex > ropeImages.length-1){ ropeIndex = 0;//补充:判断处理下标边界问题 } if(azhuIndex > azhuImages.length-1){ azhuIndex = 0;//补充:判断处理下标边界问题 } if(chickIndex > chickImages.length-1){ chickIndex = 0;//补充:判断处理下标边界问题 } if(lchickIndex > lchickImages.length-1){ lchickIndex = 0;//补充:判断处理下标边界问题 } if(wcsIndex > wcsImages.length-1){ wcsIndex = 0;//补充:判断处理下标边界问题 } //3.2.3.休息停顿操作 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } //3.2.2.刷新界面操作 repaint(); //重新调用执行paint(); } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { //System.out.println("您按下了按键"); //对话框切换 if(isChatShow1){ //聊天内容切换+聊天内容消失 int KeyCode = e.getKeyCode(); if(KeyCode == KeyEvent.VK_SPACE){ ChatIndex1++; if(ChatIndex1 > ChatMessages1.length - 1){ ChatIndex1 = 0; isChatShow1 = !isChatShow1; } repaint(); } } else if(isChatShow2){ //聊天内容切换+聊天内容消失 int KeyCode = e.getKeyCode(); if(KeyCode == KeyEvent.VK_SPACE){ ChatIndex2++; if(ChatIndex2> ChatMessages2.length - 1){ ChatIndex2 = 0; isChatShow2 = !isChatShow2; } repaint(); } } else if(isChatShow3){ //聊天内容切换+聊天内容消失 int KeyCode = e.getKeyCode(); if(KeyCode == KeyEvent.VK_SPACE){ ChatIndex3++; if(ChatIndex3> ChatMessages3.length - 1){ ChatIndex3 = 0; isChatShow3 = !isChatShow3; } repaint(); } } else{ // //4.2.实现主角运动 也即是需要根据用户按下按键的情况,进行对应的操作(移动或不动) //4.2.1.获得用户按下的按键情况 int KeyCode = e.getKeyCode(); //加速主角移动速度 if(KeyCode == KeyEvent.VK_SHIFT){ isSpeedShift = !isSpeedShift; MoveSpeed *= 3; if(MoveSpeed >= 15){ MoveSpeed = 15; } }else if(!isSpeedShift){ MoveSpeed = 5; }repaint(); //返回游戏界面显示,下面是所有用到F4的功能的实现 if((isLxyShow && KeyCode == KeyEvent.VK_F4) || (!isStartShow && resumeButtonIndex == 0 && KeyCode == KeyEvent.VK_ENTER)){ isResumeShow = !isResumeShow; }else if(isResumeShow && resumeButtonIndex == 1 && KeyCode == KeyEvent.VK_ENTER){ LXYX = lxyX;LXYY = lxyY;ISLJC = isLjcShow;ISSC = isScMapShow;LXYDIR = lxyDir; isResumeShow = !isResumeShow; System.out.println(LXYDIR+","+LXYX+","+LXYY+" "+ISLJC+" "+ISSC); }else if(isResumeShow && resumeButtonIndex == 2 && KeyCode == KeyEvent.VK_ENTER){ lxyX = LXYX;lxyY = LXYY;lxyDir = LXYDIR;isLjcShow = ISLJC;isScMapShow = ISSC; isResumeShow = !isResumeShow;isSave = true; }else if(isResumeShow && resumeButtonIndex == 3 && KeyCode == KeyEvent.VK_ENTER){ System.exit(0); }repaint(); //开始游戏,按钮切换场景,下面时所有用到ENTER的功能实现 if(!isLxyShow && startButtonIndex == 0 && KeyCode == KeyEvent.VK_ENTER){ //未进入游戏主角不可移动,//进入新游戏 isStartShow = !isStartShow; isLjcShow = !isLjcShow; //startButtonIndex == 0时,显示李家村地图 isLxyShow = !isLxyShow; isWelcome = !isWelcome; isMengjShow = !isMengjShow; lxyX = lxytX ;lxyY = lxytY - 100; ClothCode = 1; }else if(isSave && isStartShow && startButtonIndex == 1 && KeyCode == KeyEvent.VK_ENTER){ lxyX = LXYX;lxyY = LXYY;lxyDir = LXYDIR;isLjcShow = ISLJC;isScMapShow = ISSC;isResumeShow = !isResumeShow; }repaint(); //控制方向,下面是所有用到方向键的功能的实现 if(KeyCode == KeyEvent.VK_UP){ isWelcome = false; findxyY -= MoveSpeed; if(isResumeShow){ //Up按钮切换返回游戏界面选项 isResumeButtonShow = true; resumeButtonIndex--; resumeButtonY -= resume_DIST; if(resumeButtonIndex < 0){ resumeButtonY = limDOWN; resumeButtonIndex = 3; } }repaint(); //李逍遥需要向上移动一次 //a.图片的位置发生改变 //当画出返回游戏窗口时,禁止主角移动 if(isLxyShow && !isResumeShow){ //返回游戏界面主角不可移动 lxyY -= MoveSpeed; //位置改变,行走 lxyIndex++; System.out.println(isMengjShow); if(lxyIndex >= lxyUpImages.length){ lxyIndex = 0; } lxyImage = lxyUpImages[lxyIndex]; lxyDir = KeyEvent.VK_UP; } //补充 :判断李逍遥的障碍物功能 if(!isMengjShow){ //梦境之中没有红色障碍地图 int isRedX = lxyX + lxyImage.getWidth(null)/2; int isRedY = lxyY + lxyImage.getHeight(null); //上边界 if(isLjcShow){ if(lxyY <= 0){ lxyY = 0; } if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){ lxyY += MoveSpeed; } }else if(isScMapShow){ if(lxyY <= 0){ lxyY = 0; } if(scRedMap.getRGB(isRedX, isRedY) == -65536){ lxyY += MoveSpeed; } }repaint(); //进入绘画方法 } //System.out.println(lxyX+","+lxyY); //找坐标 //System.out.println(scRedMap.getRGB(isRedX, isRedY));//找红图值 }else if(KeyCode == KeyEvent.VK_DOWN){ //存档界面,DOWN按钮选择 isWelcome = false; findxyY += MoveSpeed; if(isResumeShow){ //DOWN按钮切换返回游戏界面选项 resumeButtonIndex++; isResumeButtonShow = true; resumeButtonY += resume_DIST; if(resumeButtonIndex > resumeButtonImages.length - 1){ resumeButtonIndex = 0; resumeButtonY = limUP; }repaint(); } if(isLxyShow && !isResumeShow){ lxyY += MoveSpeed; lxyIndex++; if(lxyIndex >= lxyDownImages.length){ lxyIndex = 0; }repaint(); lxyImage = lxyDownImages[lxyIndex]; lxyDir = KeyEvent.VK_DOWN; }repaint(); if(!isMengjShow){ int isRedX = lxyX + lxyImage.getWidth(null)/2; int isRedY = lxyY + lxyImage.getHeight(null); if(isLjcShow){ //李家村红色障碍判断 if(lxyY >= ljcImage.getHeight(null) - lxyImage.getHeight(null)){ lxyY = ljcImage.getHeight(null) - lxyImage.getHeight(null); } if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){ lxyY -= MoveSpeed; } }repaint(); if(isScMapShow){ //市场红色障碍判断 if(lxyY >= scMapImages[0].getHeight(null) - lxyImage.getHeight(null)){ lxyY = scMapImages[0].getHeight(null) - lxyImage.getHeight(null); } if(scRedMap.getRGB(isRedX, isRedY) == -65536){ lxyY -= MoveSpeed; } }repaint(); } }else if(KeyCode == KeyEvent.VK_LEFT){ isWelcome = false; findxyX -= MoveSpeed; //LEFT按钮切换开始游戏界面选项 if(isStartShow){ startButtonX -= start_DIST; startButtonIndex++; if(startButtonIndex > startButtonImages.length-1){ startButtonIndex = 0; startButtonX = limRIGHT; } }repaint(); if(isLxyShow && !isResumeShow){ lxyX -= MoveSpeed; lxyIndex++; if(lxyIndex >= lxyLeftImages.length){ lxyIndex = 0; } lxyImage = lxyLeftImages[lxyIndex]; lxyDir = KeyEvent.VK_LEFT; }repaint(); if(!isMengjShow){ int isRedX = lxyX; int isRedY = lxyY + lxyImage.getHeight(null); if(isLjcShow){ if(lxyX <= LeftEdge){ lxyX = LeftEdge; } if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){ lxyX += MoveSpeed; } } if(isScMapShow){ if(lxyX <= LeftEdge){ lxyX = LeftEdge; } if(scRedMap.getRGB(isRedX, isRedY) == -65536){ lxyX += MoveSpeed; } } repaint(); } }else if(KeyCode == KeyEvent.VK_RIGHT){ isWelcome = false; findxyX += MoveSpeed; if(isStartShow){ //RIGHT按钮切换开始游戏界面选项 startButtonX += start_DIST; startButtonIndex--; if(startButtonIndex < 0){ startButtonIndex = 2; startButtonX = limLEFT; } } if(isLxyShow && !isResumeShow){ lxyX += MoveSpeed; lxyIndex++; if(lxyIndex >= lxyRightImages.length){ lxyIndex = 0; } lxyImage = lxyRightImages[lxyIndex]; lxyDir = KeyEvent.VK_RIGHT; } if(!isMengjShow){ int isRedX = lxyX + lxyImage.getWidth(null); int isRedY = lxyY + lxyImage.getHeight(null); if(isLjcShow){ if(lxyX >= ljcImage.getWidth(null) - lxyImage.getWidth(null)){ lxyX = ljcImage.getWidth(null) - lxyImage.getWidth(null); } if(ljcRedMap.getRGB(isRedX, isRedY) == -521461){ lxyX -= MoveSpeed; } } if(isScMapShow){ if(lxyX >= scMapImages[0].getWidth(null) - lxyImage.getWidth(null)){ lxyX = scMapImages[0].getWidth(null) - lxyImage.getWidth(null); } if(scRedMap.getRGB(isRedX, isRedY) == -65536){ lxyX -= MoveSpeed; } } repaint(); } } else if(KeyCode == KeyEvent.VK_SPACE){ isWelcome = false; isSBNH = false; if(isLjcShow){ int x11 = lxyX + lxyImage.getWidth(null)/2; int y11 = lxyY + lxyImage.getHeight(null)/2; int x12 = awsX + awsImages[awsIndex].getWidth(null)/2; int y12 = awsY + awsImages[awsIndex].getHeight(null)/2; if(lxyDir == KeyEvent.VK_LEFT && x11 > x12-50 && x11 < x12+50 && y11 > y12-50 && y11 < y12+50){ //实现空格按键控制聊天背景和内容的出现 isChatShow1 = !isChatShow1; repaint(); } int x21 = lxyX+lxyImage.getWidth(null)/2; int y21 = lxyY + lxyImage.getHeight(null)/2; int x22 = azhuX + azhuImages[azhuIndex].getWidth(null)/2; int y22 = azhuY + azhuImages[azhuIndex].getHeight(null)/2; if(lxyDir == KeyEvent.VK_LEFT && x21 > x22-50 && x21 < x22+50 && y21 > y22-50 && y21 < y22+50){ //实现空格按键控制聊天背景和内容的出现 isChatShow2 = !isChatShow2; repaint(); } int x31 = lxyX+lxyImage.getWidth(null)/2; int y31 = lxyY + lxyImage.getHeight(null)/2; int x32 = wcsX + wcsImages[wcsIndex].getWidth(null)/2; int y32 = wcsY + wcsImages[wcsIndex].getHeight(null)/2; if(lxyDir == KeyEvent.VK_UP && x31 > x32-50 && x31 < x32+50 && y31 > y32-50 && y31 < y32+50){ //实现空格按键控制聊天背景和内容的出现 isChatShow3 = !isChatShow3; repaint(); } } } else if(KeyCode == KeyEvent.VK_1){ ClothCode = 0; }else if(KeyCode == KeyEvent.VK_2){ ClothCode = 1; } } } @Override public void keyReleased(KeyEvent e) { } }
原素材:
背景:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_start0.png
新的开始:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_0.png
旧的回忆:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_1.png
开发团队:https://www.cnblogs.com/images/cnblogs_com/louis6575/1354506/t_2.png