《仙剑奇侠传柔情版》Java的简单实现(二)
基于《仙剑奇侠传柔情版》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
《仙剑奇侠传柔情版》Java的简单实现(二)的更多相关文章
- 基于《仙剑奇侠传柔情版》利用Java的简单实现(一)
基于<仙剑奇侠传柔情版>利用Java的简单实现(一) 2018-12-01 23:55:36 by Louis 一,新建一个类GameFrame.class,具体代码如下: pack ...
- Java秒杀简单设计二:数据库表和Dao层设计
Java秒杀简单设计二:数据库表Dao层设计 上一篇中搭建springboot项目环境和设计数据库表 https://www.cnblogs.com/taiguyiba/p/9791431.html ...
- Java实现简单版SVM
Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...
- java学习-zxing生成二维码矩阵的简单例子
这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <gr ...
- Java Web高性能开发(二)
今日要闻: 性价比是个骗局: 对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜. 感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感--你们一千块买 ...
- 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- 20155322 2016-2017-2 《Java程序设计》实验二《Java面向对象程序设计》
20155322 2016-2017-2 <Java程序设计>实验二<Java面向对象程序设计> 实验目的与内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承 ...
- java RPC系列之二 HTTPINVOKER
java RPC系列之二 HTTPINVOKER 一.java RPC简单的汇总 java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) .Caucho的Hessian 和 Bu ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
随机推荐
- 吴裕雄--天生自然KITTEN编程:飞船大战
- 杂谈php之什么是cgi,fastcgi,fpm,cli,mod
杂谈PHP极少关注的问题 本话题来自于我使用PHP进行网页爬虫的一次经历.对于一个web开发者来说,PHP解释器本身却知之甚小,实在是惭愧呐! 首先这个话题要从几个提问开始. PHP是什么? 外文名: ...
- HTML5 file API加canvas实现图片前端JS压缩并上传
一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...
- Java Enum 枚举的简单使用
一.什么是枚举 值类型的一种特殊形式,它从 System.Enum 继承,并为基础基元类型的值提供备用名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个内置的有符号(或无符号)整数类型(如 ...
- Docker的自动构建镜像
Dockerfile自动构建docker镜像类似ansible剧本,大小几kb手动做镜像:大小几百M+ dockerfile 支持自定义容器的初始命令 dockerfile主要组成部分: 基础镜像信息 ...
- Leetcode 412.FizzBuzz
题目描述 写一个程序,输出从 1 到 n 数字的字符串表示. 1. 如果 n 是3的倍数,输出"Fizz": 2. 如果 n 是5的倍数,输出"Buzz": 3 ...
- Proto3:风格
本文介绍.proto文件的编码风格.遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读. 注意,protocol buffer风格随时间变化一直在进步,所以可能你 ...
- gitlab配置邮箱
邮件测试Notify.test_email('xx@qq.com', 'Message Subject', 'Message Body').deliver_now 参考 https://www.cen ...
- 遗弃.Forsaken.2015.BluRay.720p.x264.DTS-beAst
◎译 名 遗弃/落日孤影(台)/赎罪◎片 名 Forsaken◎年 代 2015◎产 地 加拿大/法国/美国◎类 别 剧情/西部◎语 言 英语◎上映日期 2015-09-16(多伦多电影节)/2016 ...
- android使用giflib加载gif
转载请标明出处:https:////www.cnblogs.com/tangZH/p/12356915.html 背景不多说,反正ndk加载gif比java上加载gif好很多很多,主要体现在内存占用与 ...