java中的接口是类吗
320
2022-08-29
Java实现萝卜勇者游戏的示例代码
目录前言主要设计功能截图代码实现启动类键盘监听核心算法总结
前言
《萝卜勇者》是由国内玩家自制的一款独立游戏,玩家扮演萝卜勇士闯关,打败各种邪恶的敌人,获得最后的胜利。
《萝卜勇者》游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。
主要需求
参考《萝卜勇者》的剧情,实现JAVA版本的单机游戏。
主要设计
1、 用Swing库做可视化界面
2、键盘监听,用WSAD可以控制光标移动,J是确定,K是取消,游戏中,WSAD移动,J攻击,K格挡。
3、 用线程实现画面刷新。
4、用流实现音乐播放。
5、支持多种语言,支持用户翻译语言文件。
6、在帮助界面下,按键盘1234567890可以启用秘籍(传奇模式:一刀砍999血)
7、使用的是JDK8
8、文件编码GBK
功能截图
游戏开始
游戏帮助
游戏设置
选择不同的关卡
游戏效果
怪物攻击效果
代码实现
启动类
@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(cmdhttp://, '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].http://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-734
double playerY;//0-312
int 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-499
int 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[i]=false; for(int i=0;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 { 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 { 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 { proHead.insert(new proLink(pro)); int tempFinder=0; for(int i=0;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 { parHead.insert(new parLink(par)); int tempFinder=0; for(int i=0;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 playerX=playerWidth/2; if(playerX>784-playerWidth/2) playerX=784-playerWidth/2; if(playerY 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]) { 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"; else backGroundContorler=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(); } } //刷新bossBar if(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; else humanIconContorler=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.doAhttp://ttack(); } 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; else defenceCooldown=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 { 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最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。 以上就是Java实现萝卜勇者游戏的示例代码的详细内容,更多关于Java萝卜勇者的资料请关注我们其它相关文章!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~