问题求助
大佬们,大一作业老师要求做飞机大战
问题:
本来登陆注册界面,和游戏内容单独运行测试的话都是可以的,但是当集成后:
在登录页面如果登录成功会到游戏界面:

但是转到游戏界面后除了绘画出窗口就不会绘制其他:
调试的时候会执行了repaint方法,但是并没有进入到paint方法中,键盘监听也失效了。
后来将repaint方法写到invokeAndWait()的run方法里,会进行重绘,但是页面没有更新,只有将窗口放大缩小后才会更新内容。
游戏内容是通过launch()方法里用while循环不断创建游戏元素并进行重绘,通过键盘监听实现开始暂停,单独测试时可以运行,但是当在登陆成功后创建游戏界面重绘就出问题了。
想问问大佬们该怎么写才对。
package gaming;
import gaming.obj.*;
import gaming.utils.GameUtils;
import gaming.utils.SoundUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//编写方法用于设置窗口属性
public class GameLaunch extends JFrame {
//设置静态变量记录游戏状态
//0:未开始 1:游戏进行中 2:暂停 3:失败 4:通关
public static int state = 0;
//添加一个游戏背景对象
//bgobj bg = new bgobj(GameUtils.bg01Img, 0, -1000, 2);
//定义一个图片变量
Image offScreenImage = null;
//我方飞机的对象
Planeobj planeobj = new Planeobj(GameUtils.heroImg, 97, 124, 180, 550, 0, this);
//我方飞机子弹的对象,位置坐标在我方飞机处
//Bulletobj bulletobj = new Bulletobj(GameUtils.bulletImg,5,11,planeobj.getX(),planeobj.getY(),5,this);
//当游戏开始时播放战斗音乐
SoundUtils bgsound = new SoundUtils(SoundUtils.bgmusic);
//我方飞机每发射一颗子弹添加音效
SoundUtils bulletsound = new SoundUtils(SoundUtils.bulletmusic);
//记录游戏绘制的次数
int count = 1;
//定义变量记录游戏所得的分数
public static int score = 0;
//定义变量记录炸弹数量
public static int num = 0;
public void launch() {
//窗口是否可见
this.setVisible(true);
//窗口的大小
this.setSize(480, 700);
//窗口的位置
this.setLocationRelativeTo(null);
//窗口的标题
this.setTitle("飞机大战单机版");
//关闭窗口会自动结束进程
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将所有需要绘制的游戏元素对象加入到所有元素集合中进行遍历绘制
//GameUtils.gameobjList.add(bg);
GameUtils.gameobjList.add(planeobj);
//添加鼠标点击事件
/*this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//==1时表示点击鼠标左键
//当游戏处于未开始状态下点击鼠标左键才有反应
if (e.getButton() == 1 && state == 0) {
//游戏转为开始状态
state = 1;
//重新绘制游戏内容(游戏开始后)
//repaint();
}
}
});
*/
//添加键盘敲击事件(enter键)
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER && state == 0) {
//播放按键音乐
new SoundUtils(SoundUtils.pressbuttonmusic).playoneSound();
bgsound.playSound();
bulletsound.playSound();
//游戏转为开始状态
state = 1;
//每次转为开始游戏时,将所有数据重置,实现重新开始
score = 0;
num = 0;
count = 1;
planeobj.setDoublefire(0);
planeobj.planeblood = 3;
planeobj.setX(180);
planeobj.setY(550);
//重新绘制游戏内容(游戏开始后)
//repaint();
GameUtils.gameobjList.clear();
//添加一个游戏背景对象
bgobj bg = new bgobj(GameUtils.bg01Img, 0, -1000, 2);
GameUtils.gameobjList.add(bg);
}
}
});
//添加键盘的监听事件(空格键)
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//播放按键音乐
new SoundUtils(SoundUtils.pressbuttonmusic).playoneSound();
if (e.getKeyCode() == 32) {
//当游戏进行中时游戏转为暂停状态
if (state == 1) {
state = 2;
//暂停音乐
bgsound.stopSound();
bulletsound.stopSound();
} else if (state == 2) {//若为暂停状态转为游戏进行状态
state = 1;
//重新播放音乐
bgsound.playSound();
bulletsound.playSound();
}
//若游戏为失败状态,按下空格键重新开始游戏状态
if (state == 3) {
//暂停音乐
bgsound.stopSound();
bulletsound.stopSound();
state = 0;
}
}
}
});
//添加键盘监听事件(J键)
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_J) {
if (num > 0) {
//炸弹数量-1
num--;
//播放炸弹投放音乐
new SoundUtils(SoundUtils.usebombmusic).playoneSound();
//敌方大飞机
for (Enemy02obj enemy02obj : GameUtils.enemy02objList) {
if(enemy02obj.getY() < 700 && enemy02obj.getY() > 0) {
score += 5;
}
Explode02obj explode02obj = new Explode02obj(enemy02obj.getX(), enemy02obj.getY());
GameUtils.explode02objList.add(explode02obj);
enemy02obj.setX(-2000);
enemy02obj.setY(-2000);
GameUtils.removeList.add(explode02obj);
GameUtils.removeList.add(enemy02obj);
}
//敌方中飞机
for (Enemy01obj enemy01obj : GameUtils.enemy01objList) {
if(enemy01obj.getY() < 700 && enemy01obj.getY() > 0) {
score += 3;
}
Explode01obj explode01obj = new Explode01obj(enemy01obj.getX(), enemy01obj.getY());
GameUtils.explode01objList.add(explode01obj);
enemy01obj.setX(-2000);
enemy01obj.setY(-2000);
GameUtils.removeList.add(explode01obj);
GameUtils.removeList.add(enemy01obj);
}
//敌方小飞机
for (Enemyobj enemyobj : GameUtils.enemyobjList) {
if(enemyobj.getY() < 700 && enemyobj.getY() > 0) {
score += 1;
}
Explodeobj explodeobj = new Explodeobj(enemyobj.getX(), enemyobj.getY());
GameUtils.explodeobjList.add(explodeobj);
enemyobj.setX(-2000);
enemyobj.setY(-2000);
GameUtils.removeList.add(explodeobj);
GameUtils.removeList.add(enemyobj);
}
}
}
}
});
//无限循环
while (true) {
if (state == 1) {
createobj();
}
repaint();
//线程睡眠25毫秒,防止重绘过快
try {
Thread.sleep(25);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
//用于批量创建游戏元素
void createobj() {
//控制游戏元素产生的速度,每绘制15次后才能创建新的游戏元素
//创建我方子弹
if (count % 10 == 0) {
if (planeobj.getDoublefire() == 0) {
GameUtils.bulletobjList.add(new Bulletobj(GameUtils.bulletImg, 5, 11, planeobj.getX() + planeobj.getWidth() / 2, planeobj.getY(), 20, this));
//添加所有游戏元素集合中的对象,使新new出来的游戏元素对象,而不是整个集合
GameUtils.gameobjList.add(GameUtils.bulletobjList.get(GameUtils.bulletobjList.size() - 1));
} else {
GameUtils.bulletobjList.add(new Bulletobj(GameUtils.enemy01bulletImg, 5, 11, planeobj.getX() + 12 + 12, planeobj.getY() + 30, 20, this));
GameUtils.bulletobjList.add(new Bulletobj(GameUtils.enemy01bulletImg, 5, 11, planeobj.getX() + planeobj.getWidth() - 18 - 12, planeobj.getY() + 30, 20, this));
//添加所有游戏元素集合中的对象,使新new出来的游戏元素对象,而不是整个集合
GameUtils.gameobjList.add(GameUtils.bulletobjList.get(GameUtils.bulletobjList.size() - 1));
GameUtils.gameobjList.add(GameUtils.bulletobjList.get(GameUtils.bulletobjList.size() - 2));
planeobj.setDoublefire(planeobj.getDoublefire() - 2);
}
}
//创建三种飞机
//控制敌方小飞机的产生速度
if (count % 25 == 0) {
//敌方小飞机产生坐标:横坐标为随机数(将窗口均匀分成十份,在这是个位置随机产生,防止敌方飞机产生交错),纵坐标为0,在窗口最上方产生
GameUtils.enemyobjList.add(new Enemyobj(GameUtils.enemyImg, 49, 36, (int) (Math.random() * 10) * 43, -36, 5, this));
GameUtils.gameobjList.add(GameUtils.enemyobjList.get(GameUtils.enemyobjList.size() - 1));
}
//控制敌方中飞机子弹的产生速度
//if (count % 15 == 0) {
//控制敌方中飞机的产生速度
if (count % 50 == 0) {
//敌方中飞机产生坐标:横坐标为随机数(将窗口均匀分成十份,在这是个位置随机产生,防止敌方飞机产生交错),纵坐标为0,在窗口最上方产生
GameUtils.enemy01objList.add(new Enemy01obj(GameUtils.enemy01Img, 69, 99, (int) (Math.random() * 6) * 68, -99, 4, this));
GameUtils.gameobjList.add(GameUtils.enemy01objList.get(GameUtils.enemy01objList.size() - 1));
}
/*
//当已经有中飞机产生时才创建对应子弹
if (GameUtils.enemy01objList.size() > 0) {
//获取子弹产生位置坐标
int x = GameUtils.enemy01objList.get(GameUtils.enemy01objList.size() - 1).getX() + GameUtils.enemy01objList.get(GameUtils.enemy01objList.size() - 1).getWidth() / 2;
int y = (int) (GameUtils.enemy01objList.get(GameUtils.enemy01objList.size() - 1).getY() + GameUtils.enemy01objList.get(GameUtils.enemy01objList.size() - 1).getHeight() * 1.3);
GameUtils.enemy01BulletobjList.add(new Enemy01Bulletobj(GameUtils.enemy01bulletImg, 5, 11, x, y, 5, this));
GameUtils.gameobjList.add(GameUtils.enemy01BulletobjList.get(GameUtils.enemy01BulletobjList.size() - 1));
}
}
*/
//控制敌方大飞机的产生速度
if (count % 250 == 0) {
GameUtils.enemy02objList.add(new Enemy02obj(GameUtils.enemy02Img, 169, 258, (int) (Math.random() * 5) * 60, -258, 3, this));
GameUtils.gameobjList.add(GameUtils.enemy02objList.get(GameUtils.enemy02objList.size() - 1));
}
//控制我方飞机子弹补给的产生速度
if (count % 400 == 0) {
//播放子弹补给出现音乐
new SoundUtils(SoundUtils.supplymusic).playoneSound();
GameUtils.bulletsupplyobjList.add(new Bulletsupplyobj(GameUtils.bulletsupplyImg, 58, 88, (int) (Math.random() * 8) * 60, -88, 4, this));
GameUtils.gameobjList.add(GameUtils.bulletsupplyobjList.get(GameUtils.bulletsupplyobjList.size() - 1));
}
//控制我方飞机炸弹补给的产生速度
if (count % 500 == 0) {
//播放炸弹补给出现音乐
new SoundUtils(SoundUtils.supplymusic).playoneSound();
GameUtils.bombsupplyobjList.add(new Bombsupplyobj(GameUtils.bombsupplyImg, 60, 107, (int) (Math.random() * 8) * 60, -107, 4, this));
GameUtils.gameobjList.add(GameUtils.bombsupplyobjList.get(GameUtils.bombsupplyobjList.size() - 1));
}
}
int flag = 1;
//重写paint方法
@Override
public void paint(Graphics g) {
//绘画原点为窗口左上角
//初始化双缓存图片对象,大小与窗口大小相等
//解决屏幕闪动问题(双缓存机制)
offScreenImage = createImage(480, 700);
//获取双缓存对象的画笔
Graphics gImage = offScreenImage.getGraphics();
gImage.fillRect(0, 0, 600, 800);
//绘画游戏未开始界面
if (state == 0) {
//绘画背景图
gImage.drawImage(GameUtils.bgImg, 0, 0, null);
//绘制英雄机
gImage.drawImage(GameUtils.heroImg, 180, 500, null);
//绘制文字
gImage.setColor(Color.gray);
gImage.setFont(new Font("仿宋", Font.BOLD, 60));
gImage.drawString("飞机大战", 120, 200);
gImage.setColor(Color.gray);
gImage.setFont(new Font("仿宋", Font.BOLD, 30));
gImage.drawString("Press enter to start!", 78, 480);
}
//游戏进行中界面
if (state == 1) {
/*
//使游戏背景对象绘制自己
bg.paintself(gImage);
//绘制我方飞机
planeobj.paintself(gImage);
//绘制我方子弹对象
bulletobj.paintself(gImage);
*/
if (flag == 1) {
planeobj.setImg(GameUtils.heroImg);
flag = 2;
} else {
planeobj.setImg(GameUtils.hero2Img);
flag = 1;
}
//当我方飞机生命值大于0时,继续绘画我方飞机
if (planeobj.planeblood > 0) {
GameUtils.gameobjList.add(planeobj);
}
//在绘画之前将爆炸集合加入到所有元素集合当中
GameUtils.gameobjList.addAll(GameUtils.explodeobjList);
GameUtils.gameobjList.addAll(GameUtils.explode01objList);
GameUtils.gameobjList.addAll(GameUtils.explode02objList);
GameUtils.gameobjList.addAll(GameUtils.explode03objList);
//不再单独绘制游戏元素,将所有新创建的元素加入到所有元素集合中,循环绘画每次加入的所有游戏元素对象
for (int i = 0; i < GameUtils.gameobjList.size() - 1; i++) {
GameUtils.gameobjList.get(i).paintself(gImage);
}
//将要移除的所有游戏元素从所有元素集合中删除
GameUtils.gameobjList.removeAll(GameUtils.removeList);
}
//游戏暂停界面
if (state == 2) {
//绘制暂停时游戏当前的状态
for (int i = 0; i < GameUtils.gameobjList.size() - 1; i++) {
GameUtils.gameobjList.get(i).paintself(gImage);
}
GameUtils.draword(gImage, "pause!", Color.gray, 50, 150, 350);
GameUtils.draword(gImage, "Press space to continue!", Color.gray, 20, 100, 550);
}
//游戏失败界面
if (state == 3) {
//暂停音乐
bgsound.stopSound();
bulletsound.stopSound();
//绘制失败时游戏当前的状态
for (int i = 0; i < GameUtils.gameobjList.size() - 1; i++) {
GameUtils.gameobjList.get(i).paintself(gImage);
}
GameUtils.draword(gImage, "Game Over!", Color.gray, 50, 100, 350);
GameUtils.draword(gImage, "Press space to play again!", Color.gray, 20, 100, 550);
}
if (state == 1 || state == 2 || state == 3) {
//绘制游戏的左上角积分面板
GameUtils.draword(gImage, score + "", Color.gray, 50, 100, 90);
//绘制左下角我方飞机持有炸弹数量
gImage.drawImage(GameUtils.bombbuttonImg, 25, 600, 63, 57, this);
GameUtils.draword(gImage, "*" + num, Color.gray, 50, 95, 645);
//绘制右下角我方飞机剩余生命值
gImage.drawImage(GameUtils.planebuttonImg, 330, 600, 46, 57, this);
if (planeobj.planeblood > 0) {
GameUtils.draword(gImage, "*" + planeobj.planeblood, Color.gray, 50, 385, 645);
} else {
GameUtils.draword(gImage, "*" + 0, Color.gray, 50, 385, 645);
}
}
if (state == 1) {
//绘制游戏进行中状态显示按钮
gImage.drawImage(GameUtils.startImg, 25, 50, 60, 45, this);
} else if (state == 2 || state == 3) {
//绘制游戏暂停中状态显示按钮
gImage.drawImage(GameUtils.pauseImg, 25, 50, 45, 60, this);
}
//将双缓存图片绘制在游戏窗口
g.drawImage(offScreenImage, 0, 0, null);
count++;
}
}
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
物流智能体工程师-基于浏览器操作的多平台箱号查询与表单提交方案
3
突然有点迷茫了,本科毕业4年,专业是计算机类,干过客服、干过技术支持,现在在干巡查性质的工作,下完班回来能抽个两三小时学习,目前学完了Java基础、面向对象、集合、异常、IO流、线程等内容,也完成了Mysql的语法学习、知道了索引、事务相关的内容。现在正在攻略学习路线里的SQL之母的自定义关卡(实战进阶),进度完成了2/3,到明天就能结束SQL部分的学习。我三年前找过王道培训班学的Java后端,但
5
问题描述我们评测一个功能是否正确,应该怎么写测试呢?特别是在AI时代,不人工review代码的情况 如何更好的使用测试来验收代码呢具体疑问平时都用AI写代码,随着需求增加,每次生成的代码都看不过来,只能借助AI生成测试来验收一下。但是测试也是AI生成的,我并不知道AI生成的测试是否符合我的需求,我也不太清楚,应该生成哪几种类型的测试才能更好的评估我们开发的功能。已有理解目前让AI写的有单元测试,集
4
想问一下大家,之前是在星球上充值了,然后俩年前没续费了,最近想学习所以在原来星球上续费了,发现没有人和项目提问和更新,才发现编程导航现在单独有一个网站,续费的会员不会同步吗
0
我想问一下大家简历的字体是多少号的呢,是2页还是3页
2
作者分享
暂无数据
