Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149

Картинка (KeyPressed)

07.10.2013, 15:50. Показов 1473. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет,снова я,с уже всем надоевшей картинкой,ну никак она не двигается,вообще.
Когда два класса,были в одном,так скажем,то все было хорошо,но как только делишь программу действительно на два разных класса,два разных файла,ничего не выходит(

Вот кодец,здесь я пробую сделать задачку через массив:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package Game;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JComponent;
import javax.swing.JFrame;
 
class MyCanvas extends JComponent {
 
    private static final long serialVersionUID = 1L;
 
    private static final int WIDTH = 490;
    private static final int HEIGHT = 470;
    private static final String NAME = "KillHero - Game";
 
    private int x = 0;
    private int y = 0;
    private int Delta = 0;
 
    private static int xKorC = 0;
    private static int yKorC = 0;
    public static boolean leftC;
    public static boolean rightC;
 
    public void move() {
        leftC = rightC = false;
    }
 
    public MyCanvas(boolean left, boolean right, int xKor, int yKor) {
        xKorC = xKor;
        if (left) {
            leftC = true;
        }
        if (right) {
            rightC = true;
        }
        Delta = xKor;
 
        x += Delta;
        y += yKor;
    }
 
    public void paint(Graphics g) {
        Image img1 = Toolkit.getDefaultToolkit().getImage(
                "C:\\Users\\дНМ\\workspace\\Game\\image\\Castle.png");
 
        int width = img1.getWidth(this);
        int height = img1.getHeight(this);
 
        int scale = 4;
        int w = scale * width;
        int h = scale * height;
 
        g.drawImage(img1, x, y, (int) w, (int) h, this);
 
    }
 
    public static void main(String[] a) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH, HEIGHT);
        frame.setTitle(NAME);
        frame.getContentPane().add(new MyCanvas(leftC, rightC, xKorC, yKorC));
        frame.getContentPane().setBackground(Color.BLACK);
        frame.setVisible(true);
        frame.setFocusable(true);
        frame.requestFocusInWindow();
 
    }
 
}
Второй класс.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package Game;
 
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.JComponent;
 
public class InputKey extends JComponent implements KeyListener {
 
    private static final long serialVersionUID = 1L;
 
    public boolean left;
    public boolean right;
    
    MyCanvas[] staff = new MyCanvas[1];
    int xKor;
    int yKor = 10;
    
    public void move(){
        left = right = false;
    }
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            left = true;
            xKor--;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right = true;
            xKor++;
        }
        repaint();
    }
 
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            left = false;
            xKor = 0;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            right = false;
            xKor= 0;
        }
        repaint();
    }
 
    public void keyTyped(KeyEvent e) {
        // bla...bla..bla
    }
    
    public InputKey(){
        staff[0] = new MyCanvas(left,right,xKor,yKor);
    }
}
Ну вот не двигается она и все( стоит на 0.0 Что же все таки надо сделать?)форумчане,пожалуйста, выручайте.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2013, 15:50
Ответы с готовыми решениями:

keyPressed()
Пишу вот игру теннис-тетрис. Там вот платформой нужно водить чтобы мячик отбивать. Использую для движений платформой keyListener. Проблема...

JAVA GUI & keyPressed
Здравствуйте, можете подсказать, где ошибка. Смысл задачи, увеличивать/уменьшать рисунок по нажатию клавиш PgUp и PgDn. Вот мой код: ...

Вызов метода KeyPressed(KeyEvent)
у меня есть метод keyPressed(KeyEvent e) и я хочу вызвать этот метод из какой-то части кода, и передать ему в качестве параметра событие...

10
 Аватар для Lancaster
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
07.10.2013, 18:54
Код оформлен ужасно очень не красиво.
Куча бесполезных методов и пару переменных, которые ни где не используются.

По теме: я не нашел места в коде, где вы вешаете слушатель кнопок для того, чтобы она двигалась(главное - класс для этого есть, и на этом его предназначение заканчивается ). Без него можете до посинения бить по клавишам, но она наврятли когда нибудь начнет двигаться - надежда умирает последней.

Возьмите, пока что, за эталон такую архитектуру кода и сам код, до того момента, пока не будете понимать "почему не двигается"

main
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package thingmove;
 
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
public class ThingMove {
 
    public ThingMove() {
 
        JFrame frame = new JFrame("Move me");
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(450, 320);
        frame.setLocationRelativeTo(null);
        
        frame.add(new Board());
        
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
 
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ThingMove();
            }
        });
    }
}

Board
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package thingmove;
 
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import javax.swing.Timer;
 
public class Board extends JPanel{
    
    private Thing thing;
    private Timer repaintTimer;
    
    public Board(){
        init();
    }
    
    private void init(){
        
        setFocusable(true);
        setDoubleBuffered(true);
        addKeyListener(new KeyHandler());
        
        thing = new Thing();
        
        repaintTimer = new Timer(50, new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();
            }
        });
        
        repaintTimer.start();
    }
    
    @Override
    public void paint(Graphics g){
        super.paint(g);
        
        Graphics2D g2d = (Graphics2D) g;
        
        g2d.drawImage(thing.getImage(), thing.getX(), thing.getY(), this);
    }
    
    
    private class KeyHandler extends KeyAdapter{
        
        @Override
        public void keyPressed(KeyEvent e){
            thing.pressed(e.getKeyCode());
        }
        
        @Override
        public void keyReleased(KeyEvent e){
            //
        }
    }
}

Thing
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package thingmove;
 
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
 
class Thing {
 
    private final String IMAGE_PATH = "C:\\Users\\Ilya\\Desktop\\asd.png"; // путь к картинке поставь свой
    private final int STEP = 3;
    private Image imgThing;
    private int x_pos;
    private int y_pos;
 
    public Thing() {
        init();
    }
 
    private void init() {
 
        imgThing = loadImage(IMAGE_PATH);
    }
 
    public void pressed(int keyCode) {
 
        switch (keyCode) {
            case KeyEvent.VK_LEFT: {
                x_pos -= STEP;
                break;
            }
            case KeyEvent.VK_UP: {
                y_pos -= STEP;
                break;
            }
            case KeyEvent.VK_RIGHT: {
                x_pos += STEP;
                break;
            }
            case KeyEvent.VK_DOWN: {
                y_pos += STEP;
                break;
            }
        }
    }
 
    public Image getImage() {
        return imgThing;
    }
 
    public int getX() {
        return x_pos;
    }
 
    public int getY() {
        return y_pos;
    }
 
    private Image loadImage(String path) {
 
        return Toolkit.getDefaultToolkit().getImage(path);
    }
}
1
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
07.10.2013, 19:09  [ТС]
Цитата Сообщение от Lancaster Посмотреть сообщение
слушатель кнопок
Спасибо!
Хм,как то не думал об этом...И не сталкивался с ним) думал что там переменные должны обновится,кароч пока возьму этот код,так что же должно быть в моем коде,чтобы все задвигалось то? что за слушатель то?

Добавлено через 1 минуту
Цитата Сообщение от Lancaster Посмотреть сообщение
ужасно очень не красиво.
Надо говорить прямо криво? криво.Не надо замазывать,это так и есть - говнокод.Просто я думал,разделить,например ,для кнопок отдельный класс для чего то отдельный,почти получилось( а вообще,никак не получилось))
0
 Аватар для Lancaster
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
07.10.2013, 19:23
так что же должно быть в моем коде,чтобы все задвигалось то?
Мне сложно уловить логику вещей в твоем коде. Так что я не скажу

что за слушатель то?
У меня он добавлен на 25 строке в классе Board. doc
1
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
07.10.2013, 21:50  [ТС]
Взглянул,начал немного понимать,спасибо огромное.

Добавлено через 1 час 22 минуты
Хм,думаю над анимацией(под ней я имею в виду при поворачивании игрока,у него меняется картинка на боковое движение и т д.)

Чуть чуть код под себя сделал:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package Game;
 
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
 
public class ThingMove {
 
    private String NAME = "Title";
    private int WIDTH = 500;
    private int HEIGHT = 470;
 
    public ThingMove() {
 
        JFrame frame = new JFrame(NAME);
 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH, HEIGHT);
        frame.setLocationRelativeTo(null);
 
        frame.add(new Board());
 
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
 
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ThingMove();
            }
        });
    }
}


Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package Game;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
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 javax.swing.JPanel;
import javax.swing.Timer;
 
public class Board extends JPanel {
 
    private final String IMAGE_PATH = "C:\\Users\\дНМ\\workspace\\Game\\image\\Castle.png";
    private static final long serialVersionUID = 1L;
    private Thing thing;
    private Timer repaintTimer;
 
    public Board() {
        init();
    }
 
    private void init() {
 
        setFocusable(true);
        setDoubleBuffered(true);
        addKeyListener(new KeyHandler());
        setBackground(Color.BLACK);
        thing = new Thing();
 
        repaintTimer = new Timer(50, new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();
            }
        });
 
        repaintTimer.start();
    }
 
    @Override
    public void paint(Graphics g) {
        super.paint(g);
 
        Graphics2D g2d = (Graphics2D) g;
 
        Image imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH);
        int width = imgCs.getWidth(this);
        int height = imgCs.getHeight(this);
 
        int scale = 4;
        int speed = 3;
        int w = scale * width;
        int h = scale * height;
 
        g2d.drawImage(imgCs, thing.getX() * speed, thing.getY() * speed,
                (int) w, (int) h, this);
    }
 
    private class KeyHandler extends KeyAdapter {
 
        @Override
        public void keyPressed(KeyEvent e) {
            thing.pressed(e.getKeyCode());
        }
 
        @Override
        public void keyReleased(KeyEvent e) {
            //
        }
    }
}


Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package Game;
 
import java.awt.event.KeyEvent;
 
class Thing {
 
    private final int STEP = 3;
    private int x_pos;
    private int y_pos;
 
    public void pressed(int keyCode) {
 
        switch (keyCode) {
        case KeyEvent.VK_LEFT: {
            x_pos -= STEP;
            break;
        }
        case KeyEvent.VK_UP: {
            y_pos -= STEP;
            break;
        }
        case KeyEvent.VK_RIGHT: {
            x_pos += STEP;
            break;
        }
        case KeyEvent.VK_DOWN: {
            y_pos += STEP;
            break;
        }
        }
    }
 
    public int getX() {
        return x_pos;
    }
 
    public int getY() {
        return y_pos;
    }
 
}


И еще я вот примерно представлю,как сделать анимацию,но для этого нужно вытаскивать значения true если клавиша нажата из третьего класса,пока не знаю как именно это добыть) Как вы думаете можно сделать анимацию движения?

Добавлено через 2 минуты
Хотя стоп, у нас же есть вот это:
Java
1
2
3
4
@Override
        public void keyPressed(KeyEvent e) {
            thing.pressed(e.getKeyCode());
        }
сюда можно вставить что то типо такого;
Java
1
2
3
4
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            left = false;
         
        }
и начать делать анимацию движения.

Добавлено через 22 минуты
Мдя...вот такая форма записи не поможет:
Java
1
2
3
4
5
6
7
8
    @Override
        public void keyPressed(KeyEvent e) {
            thing.pressed(e.getKeyCode());
            
            if(e.getKeyCode() == KeyEvent.VK_UP){
                imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH2);
            }       
        }
Добавлено через 18 секунд
Картинка не обновляется..
0
 Аватар для Lancaster
63 / 63 / 12
Регистрация: 29.08.2012
Сообщений: 152
07.10.2013, 22:14
Картинка не обновляется..
Обновляется. Только после очередного вывоза метода paint(), загружается другая.
Решение: строку
Java
1
 imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH);
переместить в метод init(), тогда не будет загружаться одна и та же картинка при каждом вызове paint()
1
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
08.10.2013, 15:51  [ТС]
It works!

То есть чтобы это все работало,то вот эта строка помогает?:
Java
1
super.paint(g);
Например,хочу вынести все это в отдельный метод,то написать тоже самое?только название метода:
Java
1
super.ололо тут метод(g);
Добавлено через 17 минут
Хм. и еще одно,а если создавать прямо таки анимацию движения,чтобы нажал значит на кнопку левую картинка под левый шаг,нажал еще раз еще одна картинка,получается надо просто две картинки вводить что ли?
Java
1
2
3
4
if(e.getKeyCode() == KeyEvent.VK_UP){
                imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH2);
 imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH3);
            }
Добавлено через 1 минуту
Не такой способ не работает^

Добавлено через 17 часов 13 минут
Может выводит место картинки массив? состоящий из двух картинок.
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
08.10.2013, 15:57
Я уже писал в соседней теме насчет этого кода. такое впечатление, что кто-то уснул, голова упала на клавиатуру и накопипастилось что-то с форумов. Получился файл, который ТС выдает за свой и хочет что бы он заработал.
Кликните здесь для просмотра всего текста
Сделать хотел грозу,
А получил козу,
Розовою козу
С желтою полосой.
Вместо хвоста нога,
А на ноге рога.
я не хотел бы вновь
Встретиться с той козой.

Сделать хотел утюг, -
Слон получился вдруг,
Крылья - как у пчелы,
Вместо ушей цветы.
Ночью мне снится сон, -
Плачут коза и слон,
Плачут и говорят:
"Что с нами сделал ты?!"
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
08.10.2013, 17:00
Незатейливый примерчик с красным кружком двигающимся стрелками внутри окна:
Ball.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package easybudda.examples.movingball;
 
import java.awt.*;
 
public class Ball {
    public static final Dimension DEFAULT_BALL_SIZE = new Dimension(20, 20);
    public static final Color DEFAULT_BALL_COLOR = Color.RED;
    public static final int DEFAULT_DELTA = 10;
    
    private Dimension areaBounds;
    private Dimension ballSize;
    private Color ballColor;
    private int xPos;
    private int yPos;
    private int delta;
    
    Ball(Dimension area) {
        areaBounds = new Dimension(area);
        
        ballSize = DEFAULT_BALL_SIZE;
        ballColor = DEFAULT_BALL_COLOR;
        delta = DEFAULT_DELTA;
        
        xPos = ( areaBounds.width - ballSize.width ) / 2;
        yPos = ( areaBounds.height - ballSize.height ) / 2;
    }
    
    public void moveLeft() {
        if ( ( xPos -= delta ) < 0 )
            xPos = 0;
    }
    
    public void moveRight() {
        if ( ( xPos += delta ) > areaBounds.width - ballSize.width )
            xPos = areaBounds.width - ballSize.width;
    }
    
    public void moveUp() {
        if ( ( yPos -= delta ) < 0 )
            yPos = 0;
    }
    
    public void moveDown() {
        if ( ( yPos += delta ) > areaBounds.height - ballSize.height )
            yPos = areaBounds.height - ballSize.height;
    }
    
    public void draw(Graphics g) {
        g.setColor(ballColor);
        g.fillOval(xPos, yPos, ballSize.width, ballSize.height);
    }
}

PlayGround.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package easybudda.examples.movingball;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
@SuppressWarnings("serial")
class PlayGround extends JPanel {
    public static final Color DEFAULT_BACKGROUND_COLOR = Color.WHITE;
    public static final Color DEFAULT_BORDER_COLOR = Color.BLACK;
    public static final Dimension DEFAULT_BOUNDS = new Dimension(400, 300);
    
    private Ball ball;
    private Dimension bounds;
    
    PlayGround() {
        super();
        this.setOpaque(true);
        this.setBackground(DEFAULT_BACKGROUND_COLOR);
        this.setBorder(BorderFactory.createLineBorder(DEFAULT_BORDER_COLOR));
        this.setFocusable(true);
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent ke) {
                switch ( ke.getKeyCode() ) {
                case KeyEvent.VK_LEFT :
                    ball.moveLeft();
                    repaint();
                    break;
                case KeyEvent.VK_RIGHT :
                    ball.moveRight();
                    repaint();
                    break;
                case KeyEvent.VK_UP :
                    ball.moveUp();
                    repaint();
                    break;
                case KeyEvent.VK_DOWN :
                    ball.moveDown();
                    repaint();
                    break;
                }
            }
        });
        
        bounds = new Dimension(DEFAULT_BOUNDS);
        ball = new Ball(bounds);
    }
    
    @Override
    public Dimension getPreferredSize() {
        return bounds;
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        ball.draw(g);
    }
}

MovingBallTester.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package easybudda.examples.movingball;
 
import javax.swing.*;
 
public class MovingBallTester {
    MovingBallTester() {
        PlayGround playGround = new PlayGround();
        
        JFrame mainFrame = new JFrame("Moving ball");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.add(playGround);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MovingBallTester();
            }
        });
    }
}
может чем пригодится...
1
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
08.10.2013, 19:06  [ТС]
Спасибо,но с этим разобрался,благодаря коды который дал Lancaster,пока есть просто движение в четыре стороны,но как анимировать его - не знаю. Основной код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package Game;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
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 javax.swing.JPanel;
import javax.swing.Timer;
 
public class Board extends JPanel {
 
    private final String IMAGE_PATH = "C:\\Users\\дНМ\\workspace\\Game\\image\\Castle.png";
    private final String IMAGE_PATH_RIGHT = "C:\\Users\\дНМ\\workspace\\Game\\image\\Castle_L.png";
    private final String IMAGE_PATH_TOP = "C:\\Users\\дНМ\\workspace\\Game\\image\\Castle_T.png";
    private final String IMAGE_PATH_LEFT = "C:\\Users\\дНМ\\workspace\\Game\\image\\Castle_Lef.png";
    private static final long serialVersionUID = 1L;
    private Thing thing;
    private Timer repaintTimer;
 
    private Image imgCs;
 
    public Board() {
        init();
 
    }
 
    private void init() {
 
        setFocusable(true);
        setDoubleBuffered(true);
        addKeyListener(new KeyHandler());
        setBackground(Color.BLACK);
        thing = new Thing();
        imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH);
 
        repaintTimer = new Timer(50, new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();
            }
        });
 
        repaintTimer.start();
    }
 
    @Override
    public void paint(Graphics g) {
        super.paint(g);
 
        Graphics2D g2d = (Graphics2D) g;
        int width = imgCs.getWidth(this);
        int height = imgCs.getHeight(this);
        int scale = 4;
        int speed = 3;
        int w = scale * width;
        int h = scale * height;
 
        g2d.drawImage(imgCs, thing.getX() * speed, thing.getY() * speed,
                (int) w, (int) h, this);
 
    }
 
    private class KeyHandler extends KeyAdapter {
 
        @Override
        public void keyPressed(KeyEvent e) {
            thing.pressed(e.getKeyCode());
            if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH_LEFT);
            }
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH_RIGHT);
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH);
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                imgCs = Toolkit.getDefaultToolkit().getImage(IMAGE_PATH_TOP);
            }
 
        }
 
        @Override
        public void keyReleased(KeyEvent e) {
            //
        }
 
    }
}
Тут и выводятся картинки,но как придать им походку,так скажем проблемка.Надо как то переворачивать картинку,но при нажатии клавиши она выводится одна.Так что надо думать.

Добавлено через 46 минут
Сложная задачка..
Может надо использовать что то такое? AffineTransform

Добавлено через 35 минут
Хотя.. если попробовать сделать цикл,чтобы через каждое второе нажатие и увеличение координаты x,например выводилась другая картинка...

Добавлено через 18 минут
Тьфу ты,нафиг методы какие то)) все гениальное оказалось простым!
0
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
10.10.2013, 15:15  [ТС]
Ого,код тупит ну оченьььь сильно:
Java
1
2
3
4
5
6
7
8
        int MapWidth = imgMap.getWidth(this) * 4;
        int MapHeight = imgMap.getHeight(this) * 4;
 
        for (int s = MapWidth - MapWidth; s < MapWidth * 100; s++) {
            for (int i = MapHeight - MapHeight; i < MapHeight * 100; i++) {
                g2d.drawImage(imgMap, s, i, (int) w, (int) h, this);
            }
        }
После добавления вот такой вот конструкции.

Добавлено через 12 минут
Вообще у меня была задача взять картинку и размножить ее по окну,ну и чуть дальше,тем самым - "нарисовав карту"
Но так сильно тупит....

http://stackoverflow.com/quest... y/11556441

Интересное решение^

Добавлено через 44 секунды
Но не то,немного.

Добавлено через 4 минуты
Хотя... Мне ведь надо размножить обычный зеленый цвет,по этому можно нарисовать картинку программно,все таки выводить нарисованную картинку видимо накладно.

Добавлено через 4 минуты
Хм.. еще есть одно,при нажатии клавиш окно будто перерисовывается(он и перерисовывается,наверно))

Добавлено через 1 час 7 минут
Хм.. еще один вопросик,довольно простой,вот мы создаем картинку:
Java
1
2
3
 BufferedImage off_Image =
   новые BufferedImage (100, 50,
                     BufferedImage.TYPE_INT_ARGB);
А как заполнить ее зеленым там?)
То есть получится должен зеленый квадрат со стороной 100 на 50.

Добавлено через 52 минуты
Ибо так он не рисует ничего:
Java
1
2
3
4
  BufferedImage off =
                    new BufferedImage(10, 50,
                        BufferedImage.TYPE_INT_ARGB);
          off.setRGB(51,102,0);
Добавлено через 16 часов 13 минут
Хм,вот еще вопросик:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.awt.Canvas;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
 
public class Game extends Canvas {
 
    private static final long serialVersionUID = 1L;
 
    private static final int WIDTH = 400;
    private static final int HEIGHT = 400;
 
    @Override
    public void paint(Graphics g) {
 
        super.paint(g);
 
        int w = 20;
        int h = 20;
        int type = BufferedImage.TYPE_INT_ARGB;
 
        BufferedImage image = new BufferedImage(w, h, type);
        Graphics2D g2d = image.createGraphics();
        g2d.setColor(Color.GREEN);
        g2d.fillRect(0, 0, w, h);
        g2d.dispose();
        int MapWidth = image.getWidth(this);
        int MapHeight = image.getHeight(this);
 
        for (int s = MapWidth - MapWidth; s < MapWidth * 10; s++) {
            for (int i = MapHeight - MapHeight; i < MapHeight * 10; i++) {
                g.drawImage(image, s, i, (int) w, (int) h, this);
            }
        }
 
    }
 
    public static void main(String[] args) {
 
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
 
                frame.setSize(WIDTH, HEIGHT);
                frame.add(new Game());
 
                frame.setVisible(true);
            }
        });
    }
}
Как ускорить код?) сейчас ,например,нельзя его закрыть ,пока не отрисуются квадратики,да и рисуются они долговато,нельзя как то улучшить/увеличить скорость?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2013, 15:15
Помогаю со студенческими работами здесь

KeyPressed
Помогите... У меня в программе KeyPressed встречается несколько раз... Первый раз все работает, а последующие нет, потому что как бы данные...

Не работает keypressed
может можно както заменить?

Проблема с Keypressed
Нужно передвигать изображение нажатием стрелки &quot;вверх&quot; на клавиатуре. При нажатии ничего не происходит. unit Unit1; {$mode...

repeat until keypressed
Всем привет! По нажатию на кнопку начинается прорисовка графика - это все в цикле. Нужно чтобы по нажатию клавиши цикл прерывался. ...

Не работает keypressed.
Написал программу которая крутит треугольник вокруг своей оси при нажатии enter. Но при прогоне программы открывается новое окно(window...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru