在同一个游戏中我的旧问题仍在改进,但这次我现在有四个类和另一个异常错误。仍然相同" Java是第二语言,但似乎无法证明我的中间C ++标签。"
Briefer:在2到2。5年的时间里制作游戏,必须用我不熟悉的语言来做,因为我们团队中的多数统治(三个java,一个C ++,一个php家伙)。我用这个"迷你"测试机械。游戏并试图修复破坏的东西,但这个(以及其他)是我似乎无法自己解决的另一个问题。 我试过论坛并且已经撇去通过我们的一些旧的自学java书籍。我需要帮助来解决如何修复类强制转换异常的情况。
我的代码并简要说明了应该发生的事情:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Stage extends JPanel implements ActionListener
{
private static final long serialVersionUID = 1L;
private Timer start_stop;
private SPRITES player;
public Stage()
{
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.black);
setDoubleBuffered(true);
player = new SPRITES();
start_stop = new Timer(5, this);
start_stop.start();
}
public void paint(Graphics character)
{
super.paint(character);
Graphics2D G2D = (Graphics2D) character;
G2D.drawImage(player.getImage(), player.getX(), player.getY(), this);
@SuppressWarnings("rawtypes")
ArrayList ms = player.getMissiles();
Toolkit.getDefaultToolkit().sync();
character.dispose();
for (int i = 0; i < ms.size(); i++ )
{
SPRITES m = (SPRITES) ms.get(i); //error here
G2D.drawImage(m.getImage(), m.getX(), m.getY(), this);
if(m.isVisible())
m.move();
else ms.remove(i);
}
}
public void actionPerformedjuan(ActionEvent e)
{
@SuppressWarnings("rawtypes")
ArrayList ms = player.getMissiles();
for (int i = 0; i < ms.size(); i++)
{
SPRITES m = (SPRITES) ms.get(i);
if (m.isVisible())
m.move();
else ms.remove(i);
}
player.move();
repaint();
}
public void actionPerformed(ActionEvent arg0)
{
player.move();
repaint();
}
private class TAdapter extends KeyAdapter
{
public void keyReleased(KeyEvent e)
{
player.keyReleased(e);
}
public void keyPressed(KeyEvent e)
{
player.keyPressed(e);
}
}
}
设置舞台,获取背景色并准备好导入的图片。
import java.awt.event.KeyEvent;
import java.awt.Image;
import java.util.ArrayList;
import javax.swing.*;
public class SPRITES extends JPanel
{
private static final long serialVersionUID = 1L;
private static int x_sped;
private static int y_sped;
private static int x;
private static int y;
private Image sprite;
@SuppressWarnings("rawtypes")
private static ArrayList missiles;
private final static int sprite_size = 20;
@SuppressWarnings("rawtypes")
public SPRITES()
{
ImageIcon pine = new ImageIcon(this.getClass().getResource("/resouse/SHIP.png"));
sprite = pine.getImage();
missiles = new ArrayList();
x = 40;
y = 60;
}
public void move()
{
x += x_sped;
y += y_sped;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public Image getImage()
{
return sprite;
}
@SuppressWarnings("rawtypes")
public ArrayList getMissiles()
{
return missiles;
}
@SuppressWarnings("unchecked")
public static void fire()
{
missiles.add(new Mussiles(x + sprite_size, y + sprite_size/2));
}
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
if(key == KeyEvent.VK_SPACE)
{
fire();
}
if(key == KeyEvent.VK_A)
{
x_sped = -1;
}
if(key == KeyEvent.VK_D)
{
x_sped = 2;
}
if(key == KeyEvent.VK_W)
{
y_sped = -1;
}
if(key == KeyEvent.VK_S)
{
y_sped = 1;
}
}
public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();
if(key == KeyEvent.VK_A)
{
x_sped = 0;
}
if(key == KeyEvent.VK_D)
{
x_sped = 0;
}
if(key == KeyEvent.VK_W)
{
y_sped = 0;
}
if(key == KeyEvent.VK_S)
{
y_sped = 0;
}
}
}
进行动作并导入图片。它也应该用空格键从船上射出我的导弹,或者至少建立这个想法的结构。
import java.awt.Image;
import javax.swing.ImageIcon;
public class Mussiles
{
private int x, y;
private Image missile;
boolean visible;
private final int width = 30;
private final int missile_sped = 2;
public Mussiles(int x, int y)
{
ImageIcon pine = new ImageIcon(this.getClass().getResource("/resouse/missile.png"));
missile = pine.getImage();
visible = true;
this.x = x;
this.y = y;
}
public Image getImage()
{
return missile;
}
public int getX()
{
return x;
}
public int getY()
{
return y;
}
public boolean isVisible()
{
return visible;
}
public void move()
{
x += missile_sped;
if(x > width)
visible = false;
}
}
进口导弹,并在它不直接出现在屏幕上时看不见。
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class Framing extends JFrame
{
public Framing()
{
add(new Stage());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocationRelativeTo(null);
setTitle("Failing Mini Game");
setResizable(false);
setVisible(true);
}
public static void main(String[] args)
{
new Framing();
}
}
将所有课程联系在一起,使其全部运转。
我遇到的问题是当我按空格按钮开火时。它只是在控制台上出现错误,如果我读到了eclipse回溯,它会在第一堂课中显示出来:
SPRITES m = (SPRITES) ms.get(i); //error here
据我所知,这是因为我导入的是非扩展或已实现的对象。这就是我如何解决这个问题的方法。 我是否将此一般代码区域放在另一个类中,或者是否有更智能的方法来解决此问题?
我还想知道是否有人知道一个好的几乎是外行的简单指导调试,我还没有听说过任何详细的解释,但不是太麻烦的麻烦细节。
答案 0 :(得分:3)
public class Mussiles {
...这不是SPRITES
的类型,而是将其添加到missiles
ArrayList
,
missiles.add(new Mussiles(x + sprite_size, y + sprite_size/2));
这是ClassCastException
的原因,因为Mussiles
无法将SPRITES
视为Mussiles
的实例。
首先,确保SPRITES
从ArrayList
延伸,然后将SPRITES
更新为仅限于private static ArrayList<SPRITES> missiles;
类型
static
(nb:对于实例类,你应该避免@SuppressWarnings("rawtypes")
,它们只会给你带来问题)
这也意味着你可以摆脱public ArrayList<SPRITES> getMissiles() {
//...
,你真的应该避免,因为编译器试图警告你刚刚遇到的潜在问题......
同时更新您的方法以反映此限制......
ArrayList<SPRITES> ms = player.getMissiles();
for (int i = 0; i < ms.size(); i++)
{
SPRITES m = ms.get(i);
这也意味着你不需要盲目的案例值,因为现在类型将被更严格地定义......
{{1}}
查看Generics Trail了解更多详情
答案 1 :(得分:2)
您的班级Mussiles
不是SPRITE。
另外,正常ArrayList
并不能保证您返回SPRITE
。尝试将其声明更改为ArrayList<SPRITE>
,以便它只能保存SPRITE对象(并相应地更新其他值)这样更安全。