Get*_*awn 1 java swing multithreading
我有这个奇怪的问题,我不确定是什么导致它.有时问题甚至不存在.根据我的猜测,这是一个Java内存问题或某种线程问题.
我有一个Ship
和船射击Bullets
如果我按住Space钥匙,船射击子弹.我的子弹每隔200毫秒开始发射一次.有时他们射击很好,并以相同的速度移动!其他时候,他们射击他们以不同的速度移动.什么可能导致这个?
package JGame.Actions;
import JGame.GameObject.GameObject;
import javax.swing.AbstractAction;
public class MoveAction extends Action implements Runnable{
protected GameObject obj;
protected int endX = 0, endY = 0;
protected int moveAmount = 0;
protected Thread thread;
public void moveToY(GameObject obj, int y, int amount, AbstractAction complete){
this.obj = obj;
this.endY = y;
this.moveAmount = amount;
this.complete = complete;
thread = new Thread(this);
thread.start();
}
public void run(){
try{
boolean run = true;
while(run){
int objY = obj.getY();
if(objY > this.endY){
obj.setY(obj.getY() - 1);
}else if(objY < this.endY){
obj.setY(obj.getY() + 1);
}else{
run = false;
this.actionComplete();
}
thread.sleep(moveAmount);
}
}catch(Exception e){
}
}
}
Run Code Online (Sandbox Code Playgroud)
行动完成:
package JGame.Actions;
import javax.swing.AbstractAction;
public class Action {
protected boolean actionComplete = false;
protected AbstractAction complete;
public void actionComplete(){
complete.actionPerformed(null);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我称之为moveToY
一个非常简单的调用,但有时候Bullets
以不同的速度移动(错误),而其他移动速度相同(右).我不知道是否有必要提一下,因为子弹移动有时会减速一两秒然后速度恢复到正确的速度.
以下是我使用paintComponent的主线程
@Override
public void run(){
try{
while(true){
// Check for key press events
Iterator actions = KeyboardMap.map.entrySet().iterator();
while(actions.hasNext()){
Map.Entry ap = (Map.Entry)actions.next();
Mapping mp = (Mapping)ap.getValue();
if(mp.pressed){
mp.run();
}
}
// Check for click mouse events
Iterator actions2 = MouseMap.map.entrySet().iterator();
while(actions2.hasNext()){
Map.Entry ap = (Map.Entry)actions2.next();
Mapping mp = (Mapping)ap.getValue();
if(mp.pressed){
mp.run();
}
}
for(GameObject go : gameObjects){
if(!go.getLeaveScreen()){
int goWidth = go.getWidth();
int goHeight = go.getHeight();
int goX = go.getX();
int goY = go.getY();
int gameWidth = Game.width;
int gameHeight = Game.height;
if(goX + goWidth >= gameWidth){
go.setX(gameWidth - goWidth);
}
if(goX <= 0){
go.setX(0);
}
if(goY + goHeight >= gameHeight){
go.setY(gameHeight - goHeight);
}
if(goY <= 0){
go.setY(0);
}
}
}
this.repaint();
Thread.sleep(roomSpeed);
}
}catch(Exception e){
}
}
public void paintComponent(Graphics g){
try{
g.drawImage(bg, 0, 0, this);
for(int i = 0; i < gameObjects.size(); i++){
GameObject go = gameObjects.get(i);
g.drawImage(go.getSprite(), go.getX(), go.getY(), this);
}
}catch(Exception e){
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,我猜你有大量并发线程在运行(一个是移动子弹),你希望每个线程在完全moveAmount
毫秒后唤醒.你不能有这样的保证,因为线程调度程序允许每个线程一次运行一个时间,因此你可能会有毛刺.
另一个问题是你似乎在事件调度线程中对Swing组件执行了修改,这显然是Swing的线程策略所禁止的.
归档时间: |
|
查看次数: |
126 次 |
最近记录: |