游戏:仙剑奇侠传游戏开发代码(谢苏)
仙剑奇侠传1是1995年由大宇资讯开发的经典角色扮演游戏,讲述了李逍遥与赵灵儿和林月如的仙侠奇幻爱情故事和一段拯救苍生的冒险之旅。下面用java开发仙剑奇侠传
仙剑奇侠传游戏窗口框架:
package cn.tedu.xjqxz;import javax.swing.*
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/***游戏案例的窗口类*窗口大小:1024*768**/
public class GameFrame{public static void main(String[] args){/**1.创建窗口类的实例化对象*2.让窗口对象显示出来*3.设置窗口对象的相关属性*/final int width = 1024;final int height = 768;JFrame jFrame = new JFrame();jFrame.setSize(width,height);jFrame.setLocationRelativeTo(null);jFrame.setResizable(false);jFrame.setDefaultCloseOperation
(JFrame.DO_NOTHING_ON_CLOSE);jFrame.addWindowListener(new WindowAdapter(){//当窗口正要关闭的时候,会自动调用该方法@Overridepublic void windowClosing(WindowEvent e){super.windowClosing(e);//弹出确认对话框int ch = JOptionPane.showConfirmDialog(null,"确认退出游戏吗?","提示",JOptionPane.YES_NO_OPTION);if(ch == JOptionPane.YES_OPTION){System.exit(0);}}});jFrame.setTitle("仙剑奇侠传 - Version 1.0");GamePanel gamePanel = new GamePanel();iFrame.addKeyListener(gamePanel);jFrame.add(gamePanel);jFrame.setVisible(true);}}
游戏项目的画板类,即界面文件:
package cn.tedu.xjqxz;import javax.iamgeio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.image.BufferedImage;
import java.io.File;
import java.io.IOException;/*** 游戏项目的画板类,即界面文件**/
public class GamePanel extends JPanel implements
Runnable,KeyListener{Thread t;int role_dir = 0 ;int role_i = 0;int role_x = 152;int role_y = 704;int roleW = 60;int roleH = 108;int hen_i = 0;int chick_i =0;int littleChick_i = 0;int mall_i = 0;//用于调节李家村市场场景变化速度int changeSpeed = 0;int[] count = new int[4];//当前背景,1表示李家村,2表示李家村市场int mapID = 1;//聊天对象int chatWith = 0;Font chatFont = new Font("黑体",Font.BOLD,25);//当前是否有对话窗口boolean hasChat = false;//背景图片绘制坐标private static int ljcX = -400;private static int ljcY = -190'private static int mallX = -200;private static int mallY = -200;private static Image ljc;private static Image[] ljcMall = new Image[3];private static Image chat;private static Image[][] role = new Image[4][8];private static Image[][] aws = new Image[17];private static Image[][] azu = new Image[6];private static Image[][] hen = new Image[6];private static Image[][] wcs = new Image[14];private static Image[][] children = new Image[4];private static Image[] click = new Image[2];private static Image[] littleChick = new Image[2];private static Buf;feredImage[] dataMap = new BufferedImage[] dataMap = new BufferedImage[2];//存储npc对象private static Npc[] npc = new Npc[4];private static String[] awsWords = {"只要功夫深,铁衣磨成粉。","你是要帮我洗衣服吗? ",""走你"};private static String[] azuWords = {"How's it going?","What's wrong with you?"};private static String[] wcsWords = {"Hi","I'm washing clothes."};private static String[] childrenWords = {"Are you ok?","let's play!"};/*** 加载素材图片* /static{try{dataMap[0] = ImageIO.read(new File("img/liJiaCun/RedMap.png"));dataMap[1] = ImageIO.read(new File("iam/LijiaCunShiChang/RedMap.png"));ljc = ImageIO.read(new File("img/liJiaCun/0.png"));for(int = 0;i<3;i++){ljcMall[i] = ImageIO.read(new File("img/LijiaCunShiChang/" + i +".png"));}//读取李逍遥图片for(int i = 0;i < 4;i++){String pathname = " ";switch(i){case 0 :pathname = "img/LiXiaoYao_Down/";break;case 1 :pathname = "img/LiXiaoYao_Left/";case 2:Pathname = "img/LiXiaoYao_Right/";case 3:Pathname = "img/LiXiaoYao_Up/";}for(int j = 0;j < 8;j++){role[i][j] = ImagelO.read(new File(pathname + j + ".png"));}}for(int i = 0;i < 6;i++){String pathname = "img/AZhu/" + i + ".png";azu[i] = ImageIO.read(new File(pathname));}for(int i = 0;i < 6;i++){String pathname = "img/Muji/"+ i + ".png";hen[i] = ImageIO.read(new File(pathname));} for(int i = 0;i < 14;i++){String pathname = "img/WangcaiSao/" + i + ".png";wcs[i] = ImageIO.read(new File(pathname));}for(int i = 0;i < 4;i++){String pathname = "img/XiaoHai/" + i + ".png";children[i] = ImageIO.read(new File(pathname));}for(int i = 0;i < 2;i++){String pathname = "img/XiaoJi/" + i + ".png";chick[i] = ImagelO.read(new File(pathname));}for(int i = 0;i < 2;i++){String pathname = "img/XiaoXiaoJi/" + ".png";littleChick[i] = ImagelIO.read(new File(pathname));}chat = ImagelIO.read(new File("img/LiaoTiao/0.png"));("img/LiaoTian/0.png"));Words,aws,750npc[0] = new Npc(awsWords,aws,750,480,"阿旺婶");npc[1] = new Npc(azuWords,azu,560,510,"阿朱");npc[2] = new Npc(wcsWords,wcs,1030,710,"旺财嫂");npc[3] = new Npc(childrenWords,children,1160,770,"熊孩子");}catch(IOException e){e.printStackTrace();}}public GamePanel(){t = new Thread(this);t.start();}/***改变配角图片*/public void updateIndex(){hen_i++;if(hen_i > 5){hen_i = 0;}chick_i++;if(chick i>1){chick_i = 0;}littleChick_i++;if(littleChick_i =1){littleChick_i = 0;}for(int i = 0;i < npc.length;i++){npc[i].updateIndex();}}/*** 改变主角图片* /public void updateRoleIndex(){//步伐速度fianl int speed = 1;role i + = speed;if(role_i > 7){role_i = 0;}}@Overridepublic void paint(Graphics g){super.paint(g);//场景在李家村if(mapID == 1){//背景绘制ljcX = (1024 - role[0][0].getWidth(null))/2 - role_x;ljicY =(768 - role[0][0].getHeight(null))/2 - rolr_y;//判断李家村图片的边界问题if(ljcY > 0){ljcY = 0; } else if(ljcY < 768 - ljc.getHeight(null)){ljc = 768 - ljc.getHeight(null);}if(ljcX > 0){ljcX = 0;}else if(ljcX < 1024 - ljc.getWidth(null)){ljcX = 1024 - ljc.getWidth(null);}//背景绘制g.drawImage(ljc,ljcX,ljcY,this);//配角绘制g.drawImge(hen[hen_i],ljcX + 580,ljcY + 600,this);g.drawImage(chick[chick_i],ljcX + 550,ljcY + 620,this);g.drawImage(littleChick[littleChick_i],ljcX + 573,ljcY + 610,this); //npc绘制for(Npc aNpc : npc){g.drawImage(aNpc.getImage(),aNpc.getX() + ljcX,aNpc.getY() + ljcY,this);} //对话框绘制if(hasChat & ! npc[chatWith].isChatOver()){final int titleX = 200;final int titleY = 629;final int content = 360;final int content = 670;g.drawImge(chat,192,590,this);g.setFont(chatFont);g.chatColor(Color.white);g.drawString(npc[chatWith].getName() + ":",titleX,titleY);g.drawString(npc[chatWith].getWords(),contentX,contentY();}//主角绘制g.drawImage(role[role_dir][role_i],role_x + ljcX,role_y + ljcY,this);}else if(mapID == 2){//场景在李家村市场mallX = (1024 - role[0][0].getWidth(null))/2 - role_x;mallY = (768 - role[0][0].getHeight(null))/2 - role_y;//判断李家村市场图片的边界问题if(mallY > 0){mallY = 0; } else if(mallY < 768 - ljcMall[0].getHeight(null)){mallY = 768 - ljcMall[0].getHeight(null);}if(mallX > 0){mallX = 0; }else if(mallX < 1024 - ljcMall[0].getWidth(null)){mallX = 1024 - ljcMall[0].getWidth(null);}//背景绘制g.drawImge(ljcMall[mall_i],mallX,mallY,this);//主角绘制g.drawImage(role[role_dir][role_i],role_x + mallX,role_y + mallY,this);}}/**检测主角是否靠近npc发起对话* 碰撞检测* 判断主角的四个顶点是否在某个npc的矩形之中* 将配角图片矩形稍微扩大d* /public boolean checkChat(){boolean ret = false;for(int i = 0;i < npc.length;++i){Npc n = npc[i];int d = 15;int ax = n.getX() - d;int ay = n.getY() - d;int aw = n.getWidth() + d;int ah = n.getHeight() + d;if((role_x >= ax && role_x <= ax + aw&& role_y >= ay&&role_y <= ay + ah)||(role_x + roleW > = ax && role_x + role_W <= ax + aw && role_y >= ay && role_y = ay + ah)||(role_x + roleW > = ax && role_x + roleW <= ax + aw && role_y +roleH >= ay && role_y + roleH <= ay + ah)||(role_x >= ax && role_x <= ax + aw && role_y >= && role_y <= ay + ah)){ ret = true;chatWith = ibreak; }}retunr ret;}@Overridepubic void KeyPressed(KeyEvent e){//主角移动速度final int speed = 4;switch (e.getKeyCode()){case KeyEvent.VK_UP;role_dir = 3;hasChat = false;role_y -= speed;int x = role_x + role[0][0].getWidth(null)/2;int y = role_y + role[0][0].getHeight(null);if(mapID == 1 && dataMap[0].getRGB(x,y) == -521461){role_y + = speed;}else if(mapID == 2 && dataMap[1].getRGB(x,y) == -65536){role_y + = speed;} //调整角色步伐改变速度count[0]++;if(count[0] > 100){count[0] = 0;}if(count[0] % 2 == 0){updateRoleIndex();}repaint();break;case KeyEvent.VK_LEFT:role_dir = 1;hasChat = false;if(role_x > -16){role_x -= speed;x = role_x + role[0][0].getWidth(null)/2;y = role_y + role[0][0].getHeight(null);if(mapID == 1 && dataMap[0].getRGB(x,y) == -521561){role_x += speed;}else if(mapID == 2 && dataMap[1].getRGB(x,y) == -65536){role_x += speed;}//调整角色步伐改变速度count[1]++;if(count[1] > 100){count[1] = 0;}if(count[1] % 2 == 0){updateRoleIndex();}}repaint();break;case KeyEvent.VK_RIGHT;role_dir = 2;hasChat = false;role_x += speed;x = role_x + role[0][0].getWidth(null)/2;y = role_y + role[0][0].getHeight(null);if(mapID == 1 && dataMap[0].getRGB(x,y) == -521461){role_x -= speed;}else if(mapID == 2 && dataMap[1].getRGB(x,y) == -65536){role_x -= speed;} //调整角色步伐改变速度count[2]++;if(count[2] > 100){count[2] = 0;}if(count[2]%2 ==0){updateRoleIndex();}repaint();break;case KeyEvent.VK_ESCAPE: if(hasChat){hasChat = false;}else{int ch = JOpetionPane.shoConfirmDialog(null,"确认退出游戏吗?","提示",JOptionPane.YES_NO_OPTION);if (ch == JOptionPane.YES_OPTION){System.exit(0);} }repaint();break;}}}
游戏配角人物NPC:
package cn.tedu.xjqxz;import java.awt.*;/*** 配角人物Npc类**/public class Npc{private String name;private boolean chatOver = false;//npc在背景图片中的坐标private int x;private int y;private int index = 0;int chatIndex = 0;private Image[] image;prviate String[] words;public Npc(String[] words,Image[] image,int x,int y,String name){this.words = words;this.image = image;this.x = x;this.y = y;this.name = name;}public int getX(){return x;}public String getName(){return name;}public int getWidth(){return iamge[0].getWidth(null);}public int getHeight(){return image[0].getHeight(null);}public Image getImage(){return image[index];}public void updateIndex(){index++;if(index > iamge.length - 1){index = 0;}} public void updateChatContent(){chatIndex++;if(chatIndex > words.length - 1){chatOver = true;chatIndex = 0;} }public String getWords(){return words[chatIndex];}public boolean isChatOver(){return chatOver;} public void setChatOver(boolean b){chatOver = b;}}