Java-апплет не перемещает изображение

Я пытаюсь сделать своего рода игру Space Invaders на Java, начиная с перемещения космического корабля PNG по экрану. Он появляется там, где должен, только отказывается двигаться. Программа компилируется нормально, и eclipse не выдает ошибок/предупреждений. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Вот мой код:

import java.awt.*;
import java.net.*;
import java.awt.geom.*;
import java.applet.*;
import java.awt.event.*;

public class DrawImage extends Applet implements KeyListener{
    private static final long serialVersionUID = 1L;
    private Image image;
    private int keycode;
    AffineTransform identity = new AffineTransform();
    private boolean keyleft = false;
    private boolean keyright = false;
    private URL getURL(String filename){
        URL url = null;
        try
        {
            url = this.getClass().getResource(filename);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return url;
    }
    public void init()
    {
        image = getImage(getURL("spaceship.png"));
        addKeyListener(this);
    }

    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        //fill background with black
        AffineTransform trans = new AffineTransform();
        g2d.setColor(Color.GREEN);
        g2d.fillRect(0,0,getSize().width,getSize().height);
        g2d.drawImage(image,320,240,this);
        trans.setTransform(identity);
        if(keyright == true)
        {
            trans.translate(-10,0);
            keyleft = false;
        }
        else if(keyleft == true)
        {
            trans.translate(10,0);
            keyright = false;
        }
    }
    public void keyPressed(KeyEvent e)
    {
        keycode = e.getKeyCode();
        if(keycode == KeyEvent.VK_LEFT)
        {
            keyleft = true;
        }
        else if(keycode == KeyEvent.VK_RIGHT)
        {
            keyright = true;
        }
        repaint();
    }
    public void keyTyped(KeyEvent e){}
    public void keyReleased(KeyEvent e){}

}

person imulsion    schedule 06.01.2013    source источник
comment
Является ли апплет фокусируемым? У него есть фокус? Рассмотрим 1) Качаем AWT в третьем тысячелетии. 2) Привязки клавиш через KeyListener 3) JFrame вместо JApplet 4) Запуск фрейма по ссылке с помощью Java Web Start .   -  person Andrew Thompson    schedule 06.01.2013
comment
Я адаптировал это из книги - понятия не имею, что означает focusable, поскольку об этом не упоминалось. Качаться через AWT? Что это значит? И я хочу, чтобы это был апплет, чтобы его можно было разместить в Интернете.   -  person imulsion    schedule 06.01.2013
comment
книга вышла в 2009 году   -  person imulsion    schedule 06.01.2013
comment
Что это за книга, конкретно? Мое мнение о нем падает с каждым новым комментарием. Действительно, избавься от него - это потратит много твоего времени.   -  person Andrew Thompson    schedule 06.01.2013
comment
Начало программирования игр на Java, второе издание Джонатона С. Харбора. На самом деле это действительно хорошая книга, которая помогла мне многое понять. Почему бы вам не ответить на один из моих вопросов тем, что, по вашему мнению, заставит их работать, вместо того, чтобы постоянно критиковать мои методы и ресурсы?   -  person imulsion    schedule 06.01.2013
comment
что, по вашему мнению, заставит их работать Вы пропустили мой первый комментарий? 1) Будет создан исходный код с использованием компонентов, которые люди использовали в последнее время. 2) Вполне возможно решит проблему фокусировки (если она есть). 3) Это также поможет решить проблему с фокусировкой. 4) Это просто совет, как его запустить. -- Почему бы вам не выслушать то, что я предлагаю, и не посвятить этому свои мысли и исследования, а не жалобно ныть? Вместо того, чтобы постоянно критиковать мои методы и ресурсы. Если вам не нужны лучшие стратегии и методы, заплатите консультанту, который расскажет вам все, что хотите слышать.   -  person Andrew Thompson    schedule 06.01.2013


Ответы (1)


Вы должны установить преобразование в свой g2d в методе paint():

g2d.setTransform(trans);

Итак, весь метод таков:

  public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        //fill background with black
        AffineTransform trans = new AffineTransform();
        g2d.setColor(Color.GREEN);
        g2d.fillRect(0,0,getSize().width,getSize().height);
        trans.setTransform(identity);
        if(keyright == true)
        {
            trans.translate(-10,0);
            keyleft = false;
        }
        else if(keyleft == true)
        {
            trans.translate(10,0);
            keyright = false;
        }
        g2d.setTransform(trans);
        g2d.drawImage(image,320,240,this);
    }
person mpaepper    schedule 06.01.2013
comment
Вы действительно пробовали этот код? Было хорошо замечено, что преобразование никогда не использовалось, но оно не будет иметь никакого эффекта, если будет установлено после выполнения операций рисования. См. этот ответ для примера успешного использования (3 конкатенированных) аффинных преобразований. - person Andrew Thompson; 06.01.2013
comment
@AndrewThompson Вы правы, я обновил код. Это должно работать так, верно? - person mpaepper; 06.01.2013
comment
Выглядит лучше, хотя я тоже не проверял. - person Andrew Thompson; 06.01.2013
comment
@imulsion Возможно, переменные keyright и keyleft не работают. Удалите весь блок if...elseif..., а затем поместите перевод жестко запрограммированным, например: trans.translate(-10,0); поэтому он применяется независимо от того, нажимаете ли вы кнопку. Затем проверьте, позиционируется ли изображение по-другому, если вы прокомментируете перевод. - person mpaepper; 08.01.2013