> 文档中心 > JAVA 实现《萝卜勇者》游戏

JAVA 实现《萝卜勇者》游戏


前言

《萝卜勇者》是由国内玩家自制的一款独立游戏,玩家扮演萝卜勇士闯关,打败各种邪恶的敌人,获得最后的胜利。

《萝卜勇者》游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。

主要需求

参考《萝卜勇者》的剧情,实现JAVA版本的单机游戏。

主要设计

1、 用Swing库做可视化界面

2、键盘监听,用WSAD可以控制光标移动,J是确定,K是取消,游戏中,WSAD移动,J攻击,K格挡。

3、 用线程实现画面刷新。

4、用流实现音乐播放。

5、支持多种语言,支持用户翻译语言文件。

6、在帮助界面下,按键盘1234567890可以启用秘籍(传奇模式:一刀砍999血)

7、使用的是JDK8

8、文件编码GBK

功能截图

游戏开始

JAVA 实现《萝卜勇者》游戏

游戏帮助

JAVA 实现《萝卜勇者》游戏

游戏设置

JAVA 实现《萝卜勇者》游戏

选择不同的关卡

JAVA 实现《萝卜勇者》游戏

游戏效果

JAVA 实现《萝卜勇者》游戏

怪物攻击效果

JAVA 实现《萝卜勇者》游戏

代码实现

启动类

@SuppressWarnings("serial")public class TestWindowBuilder extends JFrame {TextLibrary textLib;settingLoader settingLib;private JPanel contentPane;boolean isCheating;saveSelect saveSelectMenu;int[] startMenuPointer=new int[1];JLabel lblNewLabel1;JLabel lblNewLabel2;JLabel lblNewLabel3;JLabel lblNewLabel3_2;JLabel lblNewLabel3_1;JLabel lblNewLabel4;JLabel lblNewLabel5;JLabel lblNewLabel6;CMusicLink CMLHead=new CMusicLink(1);CMusicLink CMLLast=new CMusicLink(2);boolean sawExplain=true;CMusic menuBGMusic;/** * Launch the application. */public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {TestWindowBuilder frame = new TestWindowBuilder();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/** * Create the frame. */public TestWindowBuilder() {this.setTitle("CARROT MAN II");this.setIconImage(new ImageIcon("resource/down4.png").getImage());int screenWidth=Calculator.setInside(ScreenSize.getWidth(), 800, 99999);int screenHeight=Calculator.setInside(ScreenSize.getHeight(), 450, 99999);System.out.println("启动控制台222...");CMLHead.next=CMLLast;CMLLast.prev=CMLHead;settingLib=new settingLoader();settingLib.loadSetting();//加载设置settingLib.saveSetting();textLib=new TextLibrary();textLib.saveText();//创建默认的语言文件textLib.loadText(settingLib.settings[0]);startNewMenuBGMusic(1);/*游戏阶段: * 0开始菜单 * */int gamePhase=0;isCheating=false;/*开始菜单指针 * 0开始 * 1帮助 * 2退出 * */startMenuPointer[0]=0;int allSMPCount=5;//总指针数TestWindowBuilder testMenu=this;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds((screenWidth-800)/2, (screenHeight-450)/2, 800, 450);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);JPanel mainMenu = new JPanel();mainMenu.setBounds(0, 0, 784, 412);contentPane.add(mainMenu);mainMenu.setLayout(null);lblNewLabel1 = new JLabel();//菜单标题lblNewLabel1.setBounds(192, 10, 400, 150);lblNewLabel1.setIcon(new ImageIcon("resource/MenuTitle.png"));mainMenu.add(lblNewLabel1);lblNewLabel2 = new JLabel();//开始lblNewLabel2.setBounds(10, 193, 764, 43);lblNewLabel2.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel2.setFont(new Font("Adobe 黑体 Std R", Font.PLAIN, 21));lblNewLabel2.setForeground(new Color(200,200,200));mainMenu.add(lblNewLabel2);lblNewLabel3 = new JLabel();//帮助lblNewLabel3.setBounds(10, 223, 764, 43);lblNewLabel3.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel3.setFont(new Font("Adobe 黑体 Std R", Font.PLAIN, 21));lblNewLabel3.setForeground(new Color(200,200,200));mainMenu.add(lblNewLabel3);lblNewLabel3_2 = new JLabel();//设置lblNewLabel3_2.setBounds(10, 253, 764, 43);lblNewLabel3_2.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel3_2.setFont(new Font("Adobe 黑体 Std R", Font.PLAIN, 21));lblNewLabel3_2.setForeground(new Color(200,200,200));mainMenu.add(lblNewLabel3_2);lblNewLabel3_1 = new JLabel();//语言lblNewLabel3_1.setBounds(10, 283, 764, 43);lblNewLabel3_1.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel3_1.setFont(new Font("Adobe 黑体 Std R", Font.PLAIN, 21));lblNewLabel3_1.setForeground(new Color(200,200,200));mainMenu.add(lblNewLabel3_1);lblNewLabel4 = new JLabel();//退出lblNewLabel4.setBounds(10, 313, 764, 43);lblNewLabel4.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel4.setFont(new Font("Adobe 黑体 Std R", Font.PLAIN, 21));lblNewLabel4.setForeground(new Color(200,200,200));mainMenu.add(lblNewLabel4);lblNewLabel5 = new JLabel(textLib.textData[5]);//底部提示lblNewLabel5.setBounds(10, 371, 764, 31);lblNewLabel5.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel5.setFont(new Font("Adobe 黑体 Std R", Font.PLAIN, 15));lblNewLabel5.setForeground(new Color(200,200,200));mainMenu.add(lblNewLabel5);lblNewLabel6 = new JLabel();//半透明黑背景lblNewLabel6.setBounds(267, 193, 250, 209);lblNewLabel6.setIcon(new ImageIcon("resource/mainMenuButtonBackGround.png"));mainMenu.add(lblNewLabel6);JLabel MenuBackGroundLabel = new JLabel();//白色背景MenuBackGroundLabel.setBounds(0, 0, 800, 450);MenuBackGroundLabel.setIcon(new ImageIcon("resource/mainMenuBackGround.png"));mainMenu.add(MenuBackGroundLabel);reflash();//键盘监听器this.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {char cmd=e.getKeyChar();if(gamePhase==0)//开始菜单{if(sawExplain==false){sawExplain=true;StartView sv=new StartView(testMenu);sv.setVisible(true);testMenu.setVisible(false);}else{if(TestWindowBuilder.charEqualsIgnoreCase(cmd, 'w')){startMenuPointer[0]=(startMenuPointer[0]-1+allSMPCount)%allSMPCount;startNewSound("pointerMove.wav",false,1);}if(TestWindowBuilder.charEqualsIgnoreCase(cmd, 's')){startMenuPointer[0]=(startMenuPointer[0]+1)%allSMPCount;startNewSound("pointerMove.wav",false,1);}reflash();if(TestWindowBuilder.charEqualsIgnoreCase(cmd, 'j')){if(startMenuPointer[0]==0){saveSelectMenu=new saveSelect(testMenu);saveSelectMenu.setVisible(true);testMenu.setVisible(false);startNewSound("menuChange.wav",false,1);}if(startMenuPointer[0]==1){HelpMenu helpMenu=new HelpMenu(testMenu);helpMenu.setVisible(true);testMenu.setVisible(false);startNewSound("menuChange.wav",false,1);}if(startMenuPointer[0]==2){settingMenu sMenu=new settingMenu(testMenu);sMenu.setVisible(true);testMenu.setVisible(false);startNewSound("menuChange.wav",false,1);}if(startMenuPointer[0]==3){settingLanguage settingMenu=new settingLanguage(testMenu);settingMenu.setVisible(true);testMenu.setVisible(false);startNewSound("menuChange.wav",false,1);}if(startMenuPointer[0]==4){startNewSound("menuChange.wav",false,1);System.exit(0);}}}}}});}public void reflash(){lblNewLabel1.setText(textLib.textData[1]);lblNewLabel2.setText(textLib.textData[6]);lblNewLabel3.setText(textLib.textData[3]);lblNewLabel3_2.setText(textLib.textData[60]);lblNewLabel3_1.setText(textLib.textData[49]);lblNewLabel4.setText(textLib.textData[4]);lblNewLabel5.setText(textLib.textData[5]);if(startMenuPointer[0]==0){lblNewLabel2.setText(textLib.textData[6]+" <--");}if(startMenuPointer[0]==1){lblNewLabel3.setText(textLib.textData[3]+" <--");}if(startMenuPointer[0]==2){lblNewLabel3_2.setText(textLib.textData[60]+" <--");}if(startMenuPointer[0]==3){lblNewLabel3_1.setText(textLib.textData[49]+" <--");}if(startMenuPointer[0]==4){lblNewLabel4.setText(textLib.textData[4]+" <--");}}public void startNewMenuBGMusic(int prepare){if(settingLib.settings[1].equals("1")){if(menuBGMusic!=null)menuBGMusic.endMusic();menuBGMusic=new CMusic("menuMusic.wav",true,30000);menuBGMusic.start();}else if(prepare==1){if(menuBGMusic!=null)menuBGMusic.endMusic();menuBGMusic=new CMusic("menuMusic.wav",true,30000);menuBGMusic.start();menuBGMusic.pauseMusic();}}public void startNewSound(String soundName,boolean isReplay,int replayDelay)//开启新音效{if(settingLib.settings[2].equals("1"))new CMusicLink(CMLLast,soundName,isReplay,replayDelay);}/** * 判断字母a和字母b是否相同(无视大小写) * @param a 字母a * @param b 字母b * @return true:字母a和字母b相同 | false:字母a和字母b不同,或ab中存在非字母 */public static boolean charEqualsIgnoreCase(char a,char b){if(((int)a)>=65&&((int)a)<=90)//大写{if(a==b)return true;if(a+32==b)return true;}if(((int)a)>=97&&((int)a)<=122)//小写{if(a==b)return true;if(a-32==b)return true;}return false;}}

键盘监听

public class KeyLininter extends KeyAdapter{GameMenu gameMenu;public KeyLininter(GameMenu gameMenu){this.gameMenu=gameMenu;}public void keyPressed(KeyEvent e) {char cmd = e.getKeyChar();if(cmd=='w'||cmd=='W'){gameMenu.pressingW=1;}if(cmd=='s'||cmd=='S'){gameMenu.pressingS=1;}if(cmd=='a'||cmd=='A'){gameMenu.pressingA=1;}if(cmd=='d'||cmd=='D'){gameMenu.pressingD=1;}if(cmd=='j'||cmd=='J'){gameMenu.pressingJ=1;}if(cmd=='k'||cmd=='K'){gameMenu.pressingK=1;}}public void keyReleased(KeyEvent e){char cmd = e.getKeyChar();if(cmd=='w'||cmd=='W'){gameMenu.pressingW=0;}if(cmd=='s'||cmd=='S'){gameMenu.pressingS=0;}if(cmd=='a'||cmd=='A'){gameMenu.pressingA=0;}if(cmd=='d'||cmd=='D'){gameMenu.pressingD=0;}if(cmd=='j'||cmd=='J'){gameMenu.pressingJ=0;}if(cmd=='k'||cmd=='K'){gameMenu.pressingK=0;}}}

核心算法

@SuppressWarnings("serial")public class GameMenu extends JFrame {GameMenu thisMenu;private JPanel contentPane;TestWindowBuilder fatherMenu;boolean isCheating;CMusic battleBGM,questCompleteBGM;int pressingW;int pressingS;int pressingA;int pressingD;int pressingJ;int pressingK;int playingSave;int playingProfessionID;int g_int1;Role playingRole;double playerX;//0-734double playerY;//0-312int rotationSpeed=15;//旋转速度int movementSpeed=3;//移动速度int NormalSpeed=3;int attackSpeed=3;//攻击速度int activeCounter;int attackCounter;int defenceCounter=0;int perfectDefenceTime=0;//完美格挡剩余时间(在敌人发动攻击前0.1秒启动的格挡能让格挡所需体力消耗减少到原来的十分之一)int defenceCooldown=0;//格挡冷却 这样阻止了玩家疯狂地启动/停止格挡int playerWidth=50;int playerHeight=50;int gamePhaseTimeCounter=0;int gamePhaseTimeCounter2=0;int endPhase=6*4;//游戏通关的阶段/*第一关 0 * 第二关 6 * */int gamePhase=0;//游戏开始时的阶段(正常玩家从第一关开始打,阶段应当从0开始)String humanIconContorler;JPanel viewMap;//玩家有两个Label 一个在boss上方 一个在boss下方int usingPlayerLabel=0;JLabel[] playerLabel=new JLabel[2];JLabel lblNewLabel_6;JLabel lblNewLabel_7;JLabel[] GiantBackGround=new JLabel[400];JLabel bossLabel;JLabel lblNewLabel_2;JLabel lblNewLabel_3;JLabel lblNewLabel_2B;JLabel lblNewLabel_3B;JLabel MobHead;JLabel MobName;JLabel MobHPBar;JLabel MobHPText;JLabel TitleLabelT;JLabel SubTitleLabelT;JLabel TitleLabel;JLabel SubTitleLabel;JPanel Titles;JLabel placeNameLabel;JLabel groundArrayLabel;JLabel placeChangeBlack;//换场地时的黑幕JLabel placeChangeBlack_1;//换场地时的黑幕(用于属性条)int maxProCount=5000;JLabel[] proLabel=new JLabel[maxProCount];boolean[] proIsUsed=new boolean[maxProCount];proLink proHead=new proLink();int existProCount;int maxParCount=5000;JLabel[] parLabel=new JLabel[maxParCount];boolean[] parIsUsed=new boolean[maxParCount];parLink parHead=new parLink();int existParCount;int existPro=0;int proTeamPointer=0;//队列指针 0-499int existPar=0;int parTeamPointer=0;JPanel panel;Mob boss;int allPhaseCount=1;int gameTime=0;Map map;/** * Create the frame. */public GameMenu(TestWindowBuilder fatherMenu,boolean isCheating,int professionID,int partID,int playingSave){this.setTitle("CARROT MAN II");this.setIconImage(new ImageIcon("resource/down4.png").getImage());for(int i=0;i<proIsUsed.length;++i)proIsUsed[i]=false;for(int i=0;i<parIsUsed.length;++i)parIsUsed[i]=false;playingProfessionID=professionID;this.playingSave=playingSave;gamePhase=(partID-1)*6;this.fatherMenu=fatherMenu;this.isCheating=isCheating;//this.isCheating=true;//测试用g_int1=0;playerX=50;playerY=200;thisMenu=this;activeCounter=0;attackCounter=0;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(fatherMenu.getBounds());contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);//转场黑幕 第100层placeChangeBlack=new JLabel("");placeChangeBlack.setIcon(new ImageIcon("resource/black.png"));placeChangeBlack.setVisible(true);placeChangeBlack_1=new JLabel("");placeChangeBlack_1.setIcon(new ImageIcon("resource/black.png"));placeChangeBlack_1.setVisible(true);placeChangeBlack.setBounds(0, 0, 784, 362);placeChangeBlack_1.setBounds(0, 0, 784, 362);//contentPane.add(placeChangeBlack);JPanel panel_1 = new JPanel();panel_1.setBounds(0, 0, 784, 50);contentPane.add(panel_1);panel_1.setLayout(null);panel_1.add(placeChangeBlack_1);JLabel lblNewLabel = new JLabel("");//头像lblNewLabel.setBounds(0, 0, 50, 50);lblNewLabel.setIcon(new ImageIcon("resource/HPBarHead.png"));panel_1.add(lblNewLabel);lblNewLabel_2B = new JLabel("");//血量字lblNewLabel_2B.setForeground(Color.WHITE);lblNewLabel_2B.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel_2B.setBounds(50, 0, 200, 25);panel_1.add(lblNewLabel_2B);lblNewLabel_3B = new JLabel("");//体力字lblNewLabel_3B.setForeground(Color.WHITE);lblNewLabel_3B.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel_3B.setBounds(50, 25, 200, 25);panel_1.add(lblNewLabel_3B);lblNewLabel_2 = new JLabel("");//血条lblNewLabel_2.setBounds(50, 0, 200, 25);lblNewLabel_2.setIcon(new ImageIcon("resource/RedBar.png"));panel_1.add(lblNewLabel_2);lblNewLabel_3 = new JLabel("");//体力条lblNewLabel_3.setBounds(50, 25, 200, 25);lblNewLabel_3.setIcon(new ImageIcon("resource/GreenBar.png"));panel_1.add(lblNewLabel_3);JLabel lblNewLabel_1 = new JLabel("");//血条体力条背景lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel_1.setBounds(50, 0, 200, 50);lblNewLabel_1.setIcon(new ImageIcon("resource/HPBarBG.png"));panel_1.add(lblNewLabel_1);JLabel lblNewLabel_4 = new JLabel("J");lblNewLabel_4.setForeground(Color.GRAY);lblNewLabel_4.setFont(new Font("黑体", Font.BOLD, 30));lblNewLabel_4.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel_4.setBounds(250, 0, 50, 50);panel_1.add(lblNewLabel_4);JLabel lblNewLabel_5 = new JLabel("");lblNewLabel_5.setFont(new Font("宋体", Font.PLAIN, 20));lblNewLabel_5.setHorizontalAlignment(SwingConstants.CENTER);lblNewLabel_5.setBounds(250, 0, 50, 50);lblNewLabel_5.setIcon(new ImageIcon("resource/skillJ.png"));panel_1.add(lblNewLabel_5);JLabel skillKLabel = new JLabel("K");skillKLabel.setForeground(Color.GRAY);skillKLabel.setFont(new Font("黑体", Font.BOLD, 30));skillKLabel.setHorizontalAlignment(SwingConstants.CENTER);skillKLabel.setBounds(300, 0, 50, 50);panel_1.add(skillKLabel);JLabel skillKLabel2 = new JLabel("");skillKLabel2.setFont(new Font("宋体", Font.PLAIN, 20));skillKLabel2.setHorizontalAlignment(SwingConstants.CENTER);skillKLabel2.setBounds(300, 0, 50, 50);skillKLabel2.setIcon(new ImageIcon("resource/skillK.png"));panel_1.add(skillKLabel2);placeNameLabel = new JLabel("");placeNameLabel.setFont(new Font("宋体", Font.PLAIN, 30));placeNameLabel.setHorizontalAlignment(SwingConstants.CENTER);placeNameLabel.setBounds(350, 0, 200, 50);panel_1.add(placeNameLabel);JLabel placeNameLabel2 = new JLabel("");placeNameLabel2.setHorizontalAlignment(SwingConstants.CENTER);placeNameLabel2.setBounds(350, 0, 200, 50);placeNameLabel2.setIcon(new ImageIcon("resource/placeNameBackGround.png"));panel_1.add(placeNameLabel2);MobHead = new JLabel("");MobHead.setHorizontalAlignment(SwingConstants.CENTER);MobHead.setBounds(550, 0, 50, 50);MobHead.setIcon(new ImageIcon("resource/MobHead_0.png"));panel_1.add(MobHead);MobName = new JLabel("");MobName.setHorizontalAlignment(SwingConstants.CENTER);MobName.setBounds(600, 0, 184, 25);panel_1.add(MobName);MobHPText = new JLabel("");MobHPText.setForeground(Color.WHITE);MobHPText.setHorizontalAlignment(SwingConstants.CENTER);MobHPText.setBounds(600, 25, 184, 25);panel_1.add(MobHPText);MobHPBar = new JLabel("");MobHPBar.setHorizontalAlignment(SwingConstants.CENTER);MobHPBar.setBounds(600, 25, 184, 25);MobHPBar.setIcon(new ImageIcon("resource/RedBar.png"));panel_1.add(MobHPBar);JLabel MobNameBG = new JLabel("");MobNameBG.setHorizontalAlignment(SwingConstants.CENTER);MobNameBG.setBounds(600, 0, 184, 50);MobNameBG.setIcon(new ImageIcon("resource/MobNameBG.png"));panel_1.add(MobNameBG);panel = new JPanel();panel.setBounds(0, 50, 784, 362);contentPane.add(panel);viewMap=panel;panel.setLayout(null);panel.add(placeChangeBlack);lblNewLabel_7 = new JLabel("");//玩家tryingFace指示器(暂时停用)lblNewLabel_7.setBounds((int)playerX, (int)playerY, 5, 5);lblNewLabel_7.setIcon(new ImageIcon("resource/moveDeraction2.png"));lblNewLabel_7.setVisible(false);panel.add(lblNewLabel_7);//第99层//标题TitleLabelT = new JLabel("");TitleLabelT.setFont(new Font("黑体", Font.PLAIN, 45));TitleLabelT.setHorizontalAlignment(SwingConstants.CENTER);TitleLabelT.setBounds(100, 50, 584, 50);TitleLabelT.setVisible(true);panel.add(TitleLabelT);//副标题SubTitleLabelT = new JLabel("");SubTitleLabelT.setFont(new Font("黑体", Font.PLAIN, 25));SubTitleLabelT.setHorizontalAlignment(SwingConstants.CENTER);SubTitleLabelT.setBounds(100, 100, 584, 50);SubTitleLabelT.setVisible(true);panel.add(SubTitleLabelT);//预先创建粒子效果的Label,第6层for(int i=0;i<maxParCount;++i){parLabel[i]=new JLabel("");panel.add(parLabel[i]);}//boss上方的玩家,第5层playerLabel[1]=new JLabel("");playerLabel[1].setHorizontalAlignment(SwingConstants.CENTER);playerLabel[1].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerHeight, playerWidth);playerLabel[1].setIcon(new ImageIcon("resource/HumanRight_0.png"));playerLabel[1].setVisible(false);panel.add(playerLabel[1]);//bossLabel,第4.5层bossLabel = new JLabel("");panel.add(bossLabel);//boss下方的玩家,第4层playerLabel[0]=new JLabel("");playerLabel[0].setHorizontalAlignment(SwingConstants.CENTER);playerLabel[0].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerHeight, playerWidth);playerLabel[0].setIcon(new ImageIcon("resource/HumanRight_0.png"));playerLabel[0].setVisible(true);panel.add(playerLabel[0]);//玩家面向方向指示器,第3层lblNewLabel_6 = new JLabel("");lblNewLabel_6.setBounds((int)playerX, (int)playerY, 5, 5);lblNewLabel_6.setIcon(new ImageIcon("resource/moveDeraction.png"));panel.add(lblNewLabel_6);//预先创建发射物的Label,第2层for(int i=0;i<maxProCount;++i){proLabel[i]=new JLabel("");panel.add(proLabel[i]);}//创建地面箭头,第1.5层groundArrayLabel=new JLabel("");groundArrayLabel.setBounds(709,156, 50, 50);groundArrayLabel.setIcon(new ImageIcon("resource/groundArray.png"));groundArrayLabel.setVisible(false);panel.add(groundArrayLabel);//创建地面Label,第1层for(int i=0;i<400;++i){GiantBackGround[i]=new JLabel("");GiantBackGround[i].setVisible(true);panel.add(GiantBackGround[i]);}playingRole=new Role(professionID,thisMenu);KeyLininter kl=new KeyLininter(thisMenu); this.addKeyListener(kl);map=new Map(thisMenu);map.start();}//发射物相关public int addProjectile(Projectile pro){existProCount=proHead.getLength();if(existProCount<maxProCount){proHead.insert(new proLink(pro));int tempFinder=0;for(int i=0;i<maxProCount;++i){if(proIsUsed[i]==false){proIsUsed[i]=true;tempFinder=i;break;}}return tempFinder;}return -1;}public void removeProjectile(int id){proLabel[id].setVisible(false);proIsUsed[id]=false;}public void allProjectilesFly(){proLink tempNode=proHead;while(tempNode.next!=null){tempNode=tempNode.next;tempNode.data.doFly();}}//发射物相关结束//粒子效果相关public int addParticle(particle par){existParCount=parHead.getLength();if(existParCount<maxParCount){parHead.insert(new parLink(par));int tempFinder=0;for(int i=0;i<maxParCount;++i){if(parIsUsed[i]==false){parIsUsed[i]=true;tempFinder=i;break;}}return tempFinder;}return -1;}public void removeParticle(int id){parLabel[id].setVisible(false);parIsUsed[id]=false;}public void allParticlesFly(){parLink tempNode=parHead;while(tempNode.next!=null){tempNode=tempNode.next;tempNode.data.doFly();}}public void checkPlayerLocation()//检测玩家位置 如果超出地图 则拉回地图{if(playerX<playerWidth/2)playerX=playerWidth/2;if(playerX>784-playerWidth/2)playerX=784-playerWidth/2;if(playerY<playerHeight/2)playerY=playerHeight/2;if(playerY>362-playerHeight/2)playerY=362-playerHeight/2;}@SuppressWarnings("unused")public void saveData(int part){if(Integer.parseInt(fatherMenu.saveSelectMenu.savedData[playingSave].split(" ")[1])<part){String[] temp= {fatherMenu.saveSelectMenu.savedData[playingSave].split(" ")[0],fatherMenu.saveSelectMenu.savedData[playingSave].split(" ")[1]};fatherMenu.saveSelectMenu.savedData[playingSave]=""+playingProfessionID+" "+part;fatherMenu.saveSelectMenu.saveSaves();}}@SuppressWarnings({ "deprecation" })public void modTick()//每秒执行50次{if(attackCounter==0&&defenceCounter==0)playingRole.regenerate();if(playingRole.HP>0){//刷新体力条lblNewLabel_3.setBounds(50, 25, (int) (200*playingRole.energy/playingRole.MaxEnergy), 25);lblNewLabel_3B.setText(""+(int)playingRole.energy+"/"+(int)playingRole.MaxEnergy);//刷新血条lblNewLabel_2.setBounds(50, 0, (int) (200*playingRole.HP/playingRole.MaxHP), 25);lblNewLabel_2B.setText(""+(int)playingRole.HP+"/"+(int)playingRole.MaxHP);}else if(gamePhase!=-1){boss.target=null;gamePhaseTimeCounter=0;gamePhase=-1;movementSpeed=0;TitleLabelT.setText("YOU DIED");TitleLabelT.setVisible(true);playerLabel[usingPlayerLabel].setVisible(false);lblNewLabel_6.setVisible(false);lblNewLabel_3.setBounds(50, 25, (int) (200*playingRole.energy/playingRole.MaxEnergy), 25);lblNewLabel_3B.setText(""+(int)playingRole.energy+"/"+(int)playingRole.MaxEnergy);lblNewLabel_2.setBounds(50, 0, (int) (200*playingRole.HP/playingRole.MaxHP), 25);lblNewLabel_2B.setText(""+(int)playingRole.HP+"/"+(int)playingRole.MaxHP);}++gameTime;allProjectilesFly();allParticlesFly();if(gamePhase==0){if(gamePhaseTimeCounter<50)gamePhaseTimeCounter=50;++gamePhaseTimeCounter;if(gamePhaseTimeCounter==51){System.out.println("启动控制台...");movementSpeed=0;placeChangeBlack.setBounds(0, 0, 784, 362);placeChangeBlack_1.setBounds(0, 0, 784, 362);placeChangeBlack.setVisible(true);placeChangeBlack_1.setVisible(true);TitleLabelT.setVisible(false);SubTitleLabelT.setVisible(false);groundArrayLabel.setVisible(false);for(int i=0;i<128;++i)//初始化第一关地面{String backGroundContorler="resource/ground";GiantBackGround[i].setBounds(50*(i%16),50*(int)(i/16), 50, 50);if(Math.random()<0.9)backGroundContorler=backGroundContorler+"1.png";elsebackGroundContorler=backGroundContorler+"2.png";GiantBackGround[i].setIcon(new ImageIcon(backGroundContorler));}playerX=50;playerY=200;placeNameLabel.setText(fatherMenu.textLib.textData[13]);TitleLabelT.setText(fatherMenu.textLib.textData[13]);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[37]);SubTitleLabelT.setVisible(true);}if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150){placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);}if(gamePhaseTimeCounter==151){startNewBattleBGM(1);placeChangeBlack.setVisible(false);placeChangeBlack_1.setVisible(false);gamePhaseTimeCounter=0;++gamePhase;}}if(gamePhase%6==1){++gamePhaseTimeCounter;if(gamePhaseTimeCounter>=200){++gamePhase;TitleLabelT.setVisible(false);SubTitleLabelT.setVisible(false);movementSpeed=NormalSpeed;}}if(gamePhase==2){gamePhaseTimeCounter=0;boss=new Mob(1,bossLabel,thisMenu);boss.reflash();bossLabel.setVisible(true);++gamePhase;}if(gamePhase==3){if(boss.HP>0)boss.reflash();else{bossLabel.setVisible(false);MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);++gamePhase;gamePhaseTimeCounter=0;TitleLabelT.setText(fatherMenu.textLib.textData[38]);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);SubTitleLabelT.setVisible(true);saveData(2);startQuestCompleteBGM();endBattleBGM();}}if(gamePhase%6==4){playingRole.percentReHP(0.005);++gamePhaseTimeCounter;if(gamePhaseTimeCounter>200){gamePhaseTimeCounter=0;++gamePhase;TitleLabelT.setText(fatherMenu.textLib.textData[40]);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[41]);SubTitleLabelT.setVisible(true);gamePhaseTimeCounter2=0;}}if(gamePhase%6==5){++gamePhaseTimeCounter;if(gamePhaseTimeCounter2==0){if(gamePhaseTimeCounter>50){groundArrayLabel.setVisible(true);if(playerX>709&&playerX<759&&playerY>156&&playerY<206)//进入箭头{gamePhaseTimeCounter=0;gamePhaseTimeCounter2=1;movementSpeed=0;placeChangeBlack.setBounds(-784,0,784,362);placeChangeBlack.setVisible(true);placeChangeBlack_1.setBounds(-784,0,784,362);placeChangeBlack_1.setVisible(true);}}}if(gamePhaseTimeCounter2==1){if(gamePhaseTimeCounter>=0&&gamePhaseTimeCounter<=50){placeChangeBlack.setBounds((int)(gamePhaseTimeCounter*0.02*784-784), 0, 784, 362);placeChangeBlack_1.setBounds((int)(gamePhaseTimeCounter*0.02*784-784), 0, 784, 362);}if(gamePhaseTimeCounter==51){++gamePhase;gamePhaseTimeCounter=0;}}}if(gamePhase==6){movementSpeed=0;if(gamePhaseTimeCounter<50)gamePhaseTimeCounter=50;++gamePhaseTimeCounter;if(gamePhaseTimeCounter==51){placeChangeBlack.setBounds(0, 0, 784, 362);placeChangeBlack.setVisible(true);placeChangeBlack_1.setBounds(0, 0, 784, 362);placeChangeBlack_1.setVisible(true);TitleLabelT.setVisible(false);SubTitleLabelT.setVisible(false);groundArrayLabel.setVisible(false);for(int i=0;i<325;++i){GiantBackGround[i].setBounds(32*(i%25),32*(int)(i/25), 32, 32);GiantBackGround[i].setIcon(new ImageIcon("resource/ground6.png"));}playerX=50;playerY=200;placeNameLabel.setText(fatherMenu.textLib.textData[14]);TitleLabelT.setText(fatherMenu.textLib.textData[14]);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[42]);SubTitleLabelT.setVisible(true);}if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150){placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);}if(gamePhaseTimeCounter==151){startNewBattleBGM(2);placeChangeBlack.setVisible(false);placeChangeBlack_1.setVisible(false);gamePhaseTimeCounter=0;++gamePhase;}}if(gamePhase==8){gamePhaseTimeCounter=0;boss=new Mob(2,bossLabel,thisMenu);bossLabel.setBounds(375, 175, 100, 100);boss.reflash();bossLabel.setVisible(true);++gamePhase;}if(gamePhase==9){if(boss.HP>0)boss.reflash();else{bossLabel.setVisible(false);MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);++gamePhase;gamePhaseTimeCounter=0;TitleLabelT.setText(fatherMenu.textLib.textData[43]);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);SubTitleLabelT.setVisible(true);saveData(3);startQuestCompleteBGM();endBattleBGM();}}if(gamePhase==12){movementSpeed=0;if(gamePhaseTimeCounter<50)gamePhaseTimeCounter=50;++gamePhaseTimeCounter;if(gamePhaseTimeCounter==51){placeChangeBlack.setBounds(0, 0, 784, 362);placeChangeBlack.setVisible(true);placeChangeBlack_1.setBounds(0, 0, 784, 362);placeChangeBlack_1.setVisible(true);TitleLabelT.setVisible(false);SubTitleLabelT.setVisible(false);groundArrayLabel.setVisible(false);for(int i=0;i<325;++i){GiantBackGround[i].setBounds(32*(i%25),32*(int)(i/25), 32, 32);GiantBackGround[i].setIcon(new ImageIcon("resource/ground7.png"));}playerX=50;playerY=200;placeNameLabel.setText(fatherMenu.textLib.textData[15]);TitleLabelT.setText(fatherMenu.textLib.textData[15]);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[44]);SubTitleLabelT.setVisible(true);}if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150){placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);}if(gamePhaseTimeCounter==151){startNewBattleBGM(3);placeChangeBlack.setVisible(false);placeChangeBlack_1.setVisible(false);gamePhaseTimeCounter=0;++gamePhase;}}if(gamePhase==14){gamePhaseTimeCounter=0;boss=new Mob(3,bossLabel,thisMenu);bossLabel.setBounds(375, 175, 100, 100);boss.reflash();bossLabel.setVisible(true);++gamePhase;}if(gamePhase==15){if(boss.HP>0)boss.reflash();else{bossLabel.setVisible(false);MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);++gamePhase;gamePhaseTimeCounter=0;TitleLabelT.setText(fatherMenu.textLib.textData[45]);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);SubTitleLabelT.setVisible(true);saveData(4);startQuestCompleteBGM();endBattleBGM();}}if(gamePhase==18){movementSpeed=0;if(gamePhaseTimeCounter<50)gamePhaseTimeCounter=50;++gamePhaseTimeCounter;if(gamePhaseTimeCounter==51){placeChangeBlack.setBounds(0, 0, 784, 362);placeChangeBlack.setVisible(true);placeChangeBlack_1.setBounds(0, 0, 784, 362);placeChangeBlack_1.setVisible(true);TitleLabelT.setVisible(false);SubTitleLabelT.setVisible(false);groundArrayLabel.setVisible(false);//需要修改开始for(int i=0;i<325;++i){GiantBackGround[i].setBounds(32*(i%25),32*(int)(i/25), 32, 32);GiantBackGround[i].setIcon(new ImageIcon("resource/ground8.png"));}//需要修改结束playerX=50;playerY=200;//需要修改开始placeNameLabel.setText(fatherMenu.textLib.textData[70]);TitleLabelT.setText(fatherMenu.textLib.textData[70]);TitleLabelT.setForeground(Color.LIGHT_GRAY);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[71]);SubTitleLabelT.setForeground(Color.LIGHT_GRAY);//需要修改结束SubTitleLabelT.setVisible(true);}if(gamePhaseTimeCounter>=100&&gamePhaseTimeCounter<=150){placeChangeBlack.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);placeChangeBlack_1.setBounds((int)((gamePhaseTimeCounter-100)*0.02*784), 0, 784, 362);}if(gamePhaseTimeCounter==151){startNewBattleBGM(4);//需要修改placeChangeBlack.setVisible(false);placeChangeBlack_1.setVisible(false);gamePhaseTimeCounter=0;++gamePhase;}}if(gamePhase==20){gamePhaseTimeCounter=0;boss=new Mob(4,bossLabel,thisMenu);//需要修改bossLabel.setBounds(375, 175, 100, 100);//需要修改boss.reflash();bossLabel.setVisible(true);++gamePhase;}if(gamePhase==21){if(boss.HP>0)boss.reflash();else{bossLabel.setVisible(false);MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);++gamePhase;gamePhaseTimeCounter=0;//需要修改开始TitleLabelT.setText(fatherMenu.textLib.textData[72]);TitleLabelT.setForeground(Color.LIGHT_GRAY);TitleLabelT.setVisible(true);SubTitleLabelT.setText(fatherMenu.textLib.textData[39]);TitleLabelT.setForeground(Color.LIGHT_GRAY);SubTitleLabelT.setVisible(true);//saveData(4);//需要修改完成startQuestCompleteBGM();endBattleBGM();}}if(gamePhase==endPhase){endBattleBGM();winMenu WM=new winMenu(thisMenu);WM.setVisible(true);thisMenu.setVisible(false);map.stop();}if(gamePhase==-1){if(boss.HP>0)boss.reflash();++gamePhaseTimeCounter;if(gamePhaseTimeCounter>250){endBattleBGM();loseMenu LM=new loseMenu(thisMenu);LM.setVisible(true);thisMenu.setVisible(false);map.stop();}}//刷新bossBarif(boss!=null&&gamePhase%6==3){MobHead.setIcon(new ImageIcon("resource/MobHead_"+boss.MobId+".png"));MobName.setText(""+boss.Name);MobHPBar.setBounds(600, 25, 184*boss.HP/boss.MaxHP, 25);MobHPText.setText(""+boss.HP+"/"+boss.MaxHP);}//玩家试图面向方向if(attackCounter==0&&defenceCounter==0){if(pressingD==1&&pressingW==0&&pressingS==0){playingRole.tryingFace=0;}else if(pressingD==1&&pressingW==1){playingRole.tryingFace=45;}else if(pressingW==1&&pressingA==0&&pressingD==0){playingRole.tryingFace=90;}else if(pressingW==1&&pressingA==1){playingRole.tryingFace=135;}else if(pressingA==1&&pressingW==0&&pressingS==0){playingRole.tryingFace=180;}else if(pressingA==1&&pressingS==1){playingRole.tryingFace=225;}else if(pressingS==1&&pressingA==0&&pressingD==0){playingRole.tryingFace=270;}else if(pressingS==1&&pressingD==1){playingRole.tryingFace=315;}}playingRole.setFace();humanIconContorler="resource/human_"+playingRole.face;if(attackCounter==0&&defenceCounter==0&&(pressingW==1||pressingS==1||pressingA==1||pressingD==1))//进行转向{double d_angle=(playingRole.facingAngle-playingRole.tryingFace+360)%360;//0-180为顺时针if(d_angle<=rotationSpeed||d_angle>=360-rotationSpeed)//旋转功能{playingRole.facingAngle=playingRole.tryingFace;}else{if(d_angle>0&&d_angle<=180){playingRole.facingAngle-=rotationSpeed;}else{playingRole.facingAngle+=rotationSpeed;}}}if(attackCounter==0&&defenceCounter==0&&(pressingW==1||pressingS==1||pressingA==1||pressingD==1))//进行移动{++activeCounter;playerX+=(int)(movementSpeed*Math.cos(playingRole.facingAngle*Math.PI/180));playerY-=(int)(movementSpeed*Math.sin(playingRole.facingAngle*Math.PI/180));checkPlayerLocation();if(activeCounter>=10)//10Tick一次 切换移动图片{activeCounter=0;playingRole.lastMoveActive=(playingRole.lastMoveActive+1)%4;}if(playingRole.lastMoveActive==2)humanIconContorler=humanIconContorler+'_'+0;else if(playingRole.lastMoveActive==3)humanIconContorler=humanIconContorler+'_'+2;elsehumanIconContorler=humanIconContorler+'_'+playingRole.lastMoveActive;}if(pressingJ==1&&attackCounter==0&&defenceCounter==0&&playingRole.HP>0)//发动攻击{attackCounter=1;}if(attackCounter>0&&attackCounter<=8*attackSpeed)//正在攻击{++attackCounter;if(attackCounter>0&&attackCounter<=attackSpeed){humanIconContorler=humanIconContorler+'_'+3;}else if(attackCounter<=2*attackSpeed){humanIconContorler=humanIconContorler+'_'+4;}else if(attackCounter<=3*attackSpeed){humanIconContorler=humanIconContorler+'_'+5;}else if(attackCounter<=4*attackSpeed){humanIconContorler=humanIconContorler+'_'+6;}else if(attackCounter<=5*attackSpeed){humanIconContorler=humanIconContorler+'_'+7;}else if(attackCounter<=6*attackSpeed){humanIconContorler=humanIconContorler+'_'+8;}else if(attackCounter<=7*attackSpeed){humanIconContorler=humanIconContorler+'_'+9;}}if(attackCounter==3*attackSpeed)//完成攻击{playingRole.costEnergy(10);fatherMenu.startNewSound("sweep"+Calculator.randomInt(1,3)+".wav",false,1);playingRole.doAttack();}if(attackCounter>8*attackSpeed)//结束硬直{attackCounter=0;}if(defenceCooldown>0){--defenceCooldown;}if(perfectDefenceTime>0){--perfectDefenceTime;}if(pressingK==1&&attackCounter==0&&defenceCounter==0&&defenceCooldown==0)//发动防御{perfectDefenceTime=5;defenceCounter=1;playingRole.defenceStance=true;playingRole.isBlocked=false;}if(defenceCounter==1){if(pressingK==0)//解除格挡{defenceCounter=0;playingRole.defenceStance=false;if(playingRole.isBlocked==true)defenceCooldown=0;elsedefenceCooldown=30;}else{humanIconContorler=humanIconContorler+'_'+10;}}humanIconContorler=humanIconContorler+".png";if(boss!=null&&playingRole.HP>0){if(playerY>=boss.bossY&&usingPlayerLabel==0)//玩家应当盖住boss,但是却没盖住{usingPlayerLabel=1;playerLabel[0].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);playerLabel[1].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);playerLabel[0].setVisible(false);playerLabel[1].setVisible(true);}if(playerY<boss.bossY&&usingPlayerLabel==1)//boss应当盖住玩家,但是却没盖住{usingPlayerLabel=0;playerLabel[0].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);playerLabel[1].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);playerLabel[0].setVisible(true);playerLabel[1].setVisible(false);}}playerLabel[usingPlayerLabel].setIcon(new ImageIcon(humanIconContorler));playerLabel[usingPlayerLabel].setBounds((int)playerX-playerWidth/2, (int)playerY-playerHeight/2, playerWidth, playerHeight);lblNewLabel_6.setBounds((int)playerX+(int)(25*Math.cos(playingRole.facingAngle*Math.PI/180))-2, (int)playerY-(int)(25*Math.sin(playingRole.facingAngle*Math.PI/180))-2, 4,4);lblNewLabel_7.setBounds((int)playerX+(int)(25*Math.cos(playingRole.tryingFace*Math.PI/180))-2, (int)playerY-(int)(25*Math.sin(playingRole.tryingFace*Math.PI/180))-2, 4,4);}public void startNewBattleBGM(int bossID){if(fatherMenu.settingLib.settings[1].equals("1")){if(battleBGM!=null)battleBGM.endMusic();battleBGM=new CMusic("boss"+bossID+".wav",true,1);battleBGM.start();}}public void endBattleBGM(){if(battleBGM!=null)battleBGM.endMusic();}public void startQuestCompleteBGM(){if(questCompleteBGM!=null)questCompleteBGM.endMusic();questCompleteBGM=new CMusic("QuestComplete.wav",false,1);questCompleteBGM.start();}}

总结

通过此次的《萝卜勇者》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

源码获取

源码下载地址:传送门------->

点赞,关注博主后,私聊博主免费获取
需要技术指导,写项目程序,等更多服务请联系博主

今天是持续写作的第 9 / 100 天。
可以关注我,点赞我、评论我、收藏我啦。