С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38

Столкнулся с такой проблемой, что не получается прописать взаимодействие героя с картой...

07.11.2018, 16:01. Показов 1804. Ответов 19

Студворк — интернет-сервис помощи студентам
Привет всем! Столкнулся с такой проблемой, что не получается прописать взаимодействие героя с картой. К примеру при условии(Проверка на блок стенки слева):
Java
1
if ( winC.arrPic[i][j] == 1 && playerC.heroY >= i )
ничего не выходит, герой просто отказывается двигаться. Хотя если зажать клавишу вниз он всё же пойдет.
Помогите, пожалуйста!

Ссылка на архив на Яндекс-диске(Форум не дал залить архив, хотя в нем 18,4 Мб из разрешенных 20 Мб):
https://yadi.sk/d/nX-usEwXje84YA
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.11.2018, 16:01
Ответы с готовыми решениями:

Начал изучать JFrame и столкнулся с такой проблемой, не устанавливается на бэк цвет вообще никакой
начал изучать JFrame и столкнулся с такой проблемой, не устанавливается на бэк цвет вообще никакой :( вот весь код import...

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

Столкнулся с проблемой на новом компьютере
Здравствуйте! Вчера у меня девушка приобрела компьютер, сегодня я установил туда игры, но есть огромная проблема... Все без исключения игры...

19
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
07.11.2018, 18:09
Цитата Сообщение от CyberGlitch Посмотреть сообщение
хотя в нем 18,4 Мб
А не проще выложить проект на гитхаб и кинуть сюда ссылку?
0
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
07.11.2018, 18:39
архив это дело такое..но если рассуждать логически то либо условие исполнения действия невыполняется либо сам алгоритм действия неправельно описан.В твоём условии как я понял проверка на значение матрицы которая соответсвует координатам поля и она должна быть 1 и координаты игрока по у-оси которые не должны быть меньше переменной цикла.Допустим что матрица может иметь 2 значения 1 и 0 где 1-свободно и 0 -непройти и вторая проверка может ли герой сместиться по у-оси вниз..если как ты пишеш зажать клавишу герой всетаки двигается значит все дело в механизме движения а не в условии его выполнения. Больше без закачки твоего архива врятли что можно посоветовать
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
08.11.2018, 09:38  [ТС]
Так архив на Я-диске лежит. Ссылка ж прилогается

Добавлено через 55 секунд
Так проще (/*0*)/
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
08.11.2018, 11:57
Лучший ответ Сообщение было отмечено CyberGlitch как решение

Решение

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

Посмотрел ваш код:
где научились строить уровень так ?

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
for(int i=0; i<24; i++){ //Заполняем массив для лабиринта
            for(int j=0; j<32; j++){
 
                if (i >= 0 && i <=1 || i >= 21 && i <= 22){
                    arrPic[i][j] = 1;
                }
                else if(j >= 0 && j <= 1 || j>= 29 && j <= 30){
                    arrPic[i][j] = 1;
                }
                else if(i >= 3 && j != 16 && j != 28 && i <= 4){
                    arrPic[i][j] = 1;
                }
                else if( i >=5 && j == 17 && i<=6 || i >=5 && j == 18 && i<=6){
                    arrPic[i][j] = 1;
                }
                else if(i >= 7 && j !=4 && j != 3 && j != 19 && j != 20 && j!= 28 && i<=8){
                    arrPic[i][j] = 1;
                }
                else if(i >= 9 && j >=1 && j <= 6 && i <= 10 || i >= 9 && j >= 17 && j <= 27 && i <= 10){
                    arrPic[i][j] = 1;
                }
                else if(i >= 11 && j >= 9 && j <= 14 && i <= 12 || i >= 11 && j == 17 && j ==18 && i <= 12){
                    arrPic[i][j] = 1;
                }
                else if(i >= 13 && j>=3 && j<=10 && i <= 14 || i >= 13 && j>=13 && j<=14 && i <= 14 || i >= 13 && j>=21 && j<=29 && i <= 14){
                    arrPic[i][j] = 1;
                }
                else if(i >= 15 && j>=3 && j<=4 && i <= 16 || i >= 15 && j>=13 && j<=18 && i <= 16 ||  i >= 15 && j>=21 && j<=22 && i <= 16){
                    arrPic[i][j] = 1;
                }
                else if(i >= 17 && j>=3 && j <= 10 && i <= 18){
                    arrPic[i][j] = 1;
                }
                else if(i >= 19 && j>=3 && j<=4 && i <= 20 || i >= 19 && j>=13 && j<=18 && i <= 20 ||  i >= 19 && j>=21 && j<=22 && i <= 20){
                    arrPic[i][j] = 1;
                }
                else {
                    arrPic[i][j] = 0;
                }
            }
        }
    }
Вы не путаетесь ?

я делаю карты уровней вот так :

room[z][i] = {1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,1,0,0,0,0,0,0,0,0},
{1,0,0,1,1,1,1,1,1,0,0,0},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1};

room[z][i] = {1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,1,1,1,0,0,0},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1};

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

далее ваша коллизия выглядит так

Java
1
2
3
4
5
6
7
8
9
10
11
12
if(heroY <= 64){
            heroY = 64;
        }
        if (heroX >= Game.SIZEX-80){
            heroX = 918;
        }
        if (heroY >= Game.SIZEY-104){
            heroY = 664;
        }
        if (heroX <= 64){
            heroX = 64;
        }
вы серьезно ?

коллизия столкновения с квадратом выглядит немного побольше:

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
if (collision)
        {   
            for (int i = 0; i < boxCollision; i++)
            {
                if (x_Pl + jp_char[0].getWidth() > 
                box[i].getLocation().getX() && 
                x_Pl < box[i].getLocation().getX() + box[i].getWidth() &&
                y_Pl + 16 < box[i].getLocation().getY() + box[i].getHeight() &&
                y_Pl + jp_char[0].getHeight() > 
                box[i].getLocation().getY())
                {
                    if (x_Pl + jp_char[0].getWidth() > 
                    box[i].getLocation().getX() && x_Pl + jp_char[0].getWidth() < 
                    box[i].getLocation().getX() + (speed_Pl + 1))
                    {
                        x_Pl = (int) (box[i].getLocation().getX() - jp_char[0].getWidth());
                    }
                    else if (x_Pl < box[i].getLocation().getX() + box[i].getWidth() && 
                        x_Pl > box[i].getLocation().getX() + (box[i].getWidth() - (speed_Pl + 1)))
                    {
                        x_Pl = (int) (box[i].getLocation().getX() + box[i].getWidth());
                    }
                    else if (y_Pl + jp_char[0].getHeight() > 
                    box[i].getLocation().getY() && y_Pl + jp_char[0].getHeight() < 
                    box[i].getLocation().getY() + (speed_Pl+ 1))
                    {
                        y_Pl = (int) (box[i].getLocation().getY() - jp_char[0].getHeight());
                    }
                    else if (y_Pl + 16 < box[i].getLocation().getY() + box[i].getHeight() && 
                        y_Pl + 16 > box[i].getLocation().getY() + (box[i].getHeight() - (speed_Pl + 1)))
                    {
                        y_Pl = (int) (box[i].getLocation().getY() + box[i].getHeight() - 16);
                    }
                }
            }
        }
В некоторых трудностях лучше создать маленький макет игровой ситуации, отточить все на нем, после внедрить в игру
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
08.11.2018, 12:57  [ТС]
Карту отрисовал, спасибо. Но со столкновением так и не разобрался. Если не сдвинусь до завтра, то обращусь за помощью снова.
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
08.11.2018, 15:44  [ТС]
Пробовал сделать проверку на выход за правую границу:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public void checkCollision() {
 
        for(int i = 0; i<12;i++){
            for(int j = 0; j<16; j++){
                if(winC.arrPic[i][j] == 1 && heroX>=j*32){
                    heroX-=1;
                    break;
                }
            }
        }
 
    }
и компилятор начал ругаться. Даже на простое:
Java
1
if(winC.arrPic[i][j] == 1)
выдает ошибку.

Что делать?
Миниатюры
Столкнулся с такой проблемой, что не получается прописать взаимодействие героя с картой...  
0
08.11.2018, 15:59

Не по теме:

Цитата Сообщение от CyberGlitch Посмотреть сообщение
Что делать?
что-нибудь попроще, очевидно

0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
08.11.2018, 16:01  [ТС]
Это курсач. Ни шагу назад
0
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
08.11.2018, 16:02
возможно что checkCollision невидит массива winC.arrPic[i][j] из твоего кода тоже невидно где ты его делаеш..NullPointerException значит ссылка на пустое место памяти..
если так то тут либо
winC.arrPic[i][j]=функцияКотораяДелает return winC.arrPic[i][j]

либо

public void checkCollision(winC.arrPic[i][j])
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
08.11.2018, 16:07  [ТС]
Я вынес функцию и он её увидел, но проблема со столкновением все ещё актуальна. Как только не пробовал-ничего не выходит
0
541 / 352 / 194
Регистрация: 07.11.2018
Сообщений: 1,243
08.11.2018, 16:34
heroX>=j*32 чисто из любопытсва это смещение игрока по х-оси ..если да то это явно больше размера массива 12х16
если цикл дойдет до 15 например j=15 то какие значения может иметь heroX 480 <> 0 чтобы не выполнить условие
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
08.11.2018, 17:48
для создания условия определения препятствий я руководствуюсь одним своим выдуманным правилом, когда по координатам ваш персонаж перешагнул границу вам нужно 1. напечатать персонажа на границе 2. остановить слушатель клавиши на движение в данном направлении (или зеркально изменить скорость персонажа).

Так же обратите внимание на ваше управление персонажем вас не смущает что при нажатии на клавишу он сначала дернется а потом начнет двигаться ? когда я задаю управление я не вешаю на слушатели клавиш сразу изменение переменной в стиле speed+=3 и так далее. На клавиши я ставлю флажки или булевы переменные под каждую клавишу, а там поток или таймер(кому что ближе) и запускает движение персонажа.

У вас в игре присутствует персонаж который должен принимать решение, ваш соперник, это самый трудный участок в вашей игре (я предпочитаю в играх делать рандомных персонажей, либо с неким алгоритмом движения в замкнутом пространстве) но у вам придется научить видеть лабиринт, и здесь вам нужно идти методом создателя игры пакмен, ставить флажки по лабиринту для него

Добавлено через 31 минуту
простите что пишу не кодом, мои доки не под рукой у меня сейчас.

допустим ваш персонаж это квадрат 30х30 пикселей - "player" так же на потребуеться переменные player_x и player_speed, ваше препятствие это квадрат 50х50 пикселей - "box"

1. вам надо определить что попали в его зону "box"

отсюда:

Java
1
2
3
4
5
if (player.getX() < box.getX() + box.getWhich() && player.getX() + player.getWhich() > box.getX()
player.getY() < box.getY() + box.GETHeight() && player.getY() + player.getHeight() > box.getY())
{
 
}
так вы определили момент столкновения (в старом добром флеше это делала одна строчка hitTest() эх было время))

далее внутри условия вам надо определить с какой из сторон вы столкнулись и что делать дальше

отсюда:

Java
1
2
3
4
5
6
7
8
9
10
11
if (player.getX() < box.getX() + box.getWhich() && player.getX() + player.getWhich() > box.getX()
player.getY() < box.getY() + box.getHeight() && player.getY() + player.getHeight() > box.getY())
{
    if (player.getX() + player.getWidth() < box.getX() - (player_speed + 1)  &&  player.getX() + player.getWidth() >            box.getX())
{
    player_x = (int) (box.getX() - player.getWidth());
}
//и так для всех сторон квадрата
}
 
player.setLocation(player_x, player_y);
Прошу прощение за никудышно написанный текст, редактора под рукой нет пишу в чем есть по пути домой, простите
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
08.11.2018, 18:36  [ТС]
Cделал так,:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void checkCollision() {
 
        for(int i = 0; i < 12; i++){
            for(int j = 0; j < 16; j++){
 
                if(winC.arrPic[i][j] == 1 && playerC.heroX <= j*32 && playerC.heroY >= i*32 && playerC.heroY <= i*32+31){ //
                    playerC.heroX+=DOT_SIZE/2;
                }
                if(winC.arrPic[i][j] == 1 && playerC.heroX >= j*32+32 && playerC.heroY >= i*32 && playerC.heroY <= i*32+31){ //
                    playerC.heroX-=DOT_SIZE/2;
                }
 
            }
        }
 
    }
но выходит ерунда, т.к. он находит "Невидимые" квадраты
Миниатюры
Столкнулся с такой проблемой, что не получается прописать взаимодействие героя с картой...  
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
09.11.2018, 10:11  [ТС]
Даже Ютуб не помог :/
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
10.11.2018, 13:20  [ТС]
Оставил проверку за выход экрана (В setSize(518,414), а по пикселям выходит 505 х 376. Почему так?)
Но с проверкой на блок так и не справился. Если кто-то сможет помочь буду очень благодарен!
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void checkCollision() {
                if (playerC.heroX < 31){
                    playerC.heroX+=DOT_SIZE;
                }
                if(playerC.heroY < 31){
                    playerC.heroY+=DOT_SIZE;
                }
                if(playerC.heroX > boxX){
                    playerC.heroX-=DOT_SIZE;
                }
                if(playerC.heroY > boxY){
                    playerC.heroY-=DOT_SIZE;
                }
                for(int i=1;i<11;i++){
                    for(int j=1; j<15;j++){
                        if( winC.arrPic[i][j]==1 /*Дописать*/){
                           playerC.heroX+=DOT_SIZE;
                        }
                    }
                }
    }
Полный код проекта есть в шапке обсуждения.
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
11.11.2018, 00:57
я же вам написал работающею коллизию на столкновение, я уже 14 лет игры создаю по этой схеме, все идеально работает что не так ? почему вы снова сюда лезете ?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void checkCollision() {
                if (playerC.heroX < 31){
                    playerC.heroX+=DOT_SIZE;
                }
                if(playerC.heroY < 31){
                    playerC.heroY+=DOT_SIZE;
                }
                if(playerC.heroX > boxX){
                    playerC.heroX-=DOT_SIZE;
                }
                if(playerC.heroY > boxY){
                    playerC.heroY-=DOT_SIZE;
                }
                for(int i=1;i<11;i++){
                    for(int j=1; j<15;j++){
                        if( winC.arrPic[i][j]==1 /*Дописать*/){
                           playerC.heroX+=DOT_SIZE;
                        }
                    }
                }
    }
чем здесь намазано ?

если определять границы экрана то это пустяк
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
96
package base;
 
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
 
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
 
 
public class LetsGo
{
    public JFrame window = new JFrame();
    public JLabel character = new JLabel();
    public int[] characterXY = {300,300};
    
    
    public LetsGo()
    {
        makeJFrame();
        makeCharacter();
    }
    
    
    private void makeJFrame()
    {
        window = new JFrame("");
        window.setSize(800, 600);   
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.getContentPane().setBackground(Color.black);
        window.setLayout(null);
        window.setResizable(false);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
    }
    
    
    private void makeCharacter()
    {
        character.setBounds(characterXY[0], characterXY[1], 30, 30);
        character.setOpaque(true);
        character.setLayout(null);
        window.add(character);
        window.repaint();
        
        Timer fpsTimer = new Timer(15, new ActionListener()
        {
            int[] arrSpeed = {3,6,9,12};
            int[] speedControlXY = {1,1};
            int[] speedXY = {arrSpeed[new Random().nextInt(arrSpeed.length)],
                    arrSpeed[new Random().nextInt(arrSpeed.length)]};
        
            
            public void actionPerformed(ActionEvent e)
            {   
                characterXY[0] += speedXY[0];
                characterXY[1] += speedXY[1];
                character.setLocation(characterXY[0], characterXY[1]);
                
                if (characterXY[0] + character.getWidth() > 700)
                {
                    characterXY[0] = 700 - character.getWidth();
                    speedControlXY[0] *= -1;
                    speedXY[0] = arrSpeed[new Random().nextInt(arrSpeed.length)] * speedControlXY[0];
                }
                else if (characterXY[0] < 0)
                {
                    characterXY[0] = 0;
                    speedControlXY[0] *= -1;
                    speedXY[0] = arrSpeed[new Random().nextInt(arrSpeed.length)] * speedControlXY[0];
                }
                else if (characterXY[1] < 0)
                {
                    characterXY[1] = 0;
                    speedControlXY[1] *= -1;
                    speedXY[1] = arrSpeed[new Random().nextInt(arrSpeed.length)] * speedControlXY[1];
                }
                else if (characterXY[1] + character.getHeight() > 500)
                {
                    characterXY[1] = 500 - character.getHeight();
                    speedControlXY[1] *= -1;
                    speedXY[1] = arrSpeed[new Random().nextInt(arrSpeed.length)] * speedControlXY[1];
                }
            }
        });
        fpsTimer.start();
    }
    
    
    public static void main(String[] args)
    {
        new LetsGo();
    }
}
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
11.11.2018, 08:39  [ТС]
Я определил границы экрана. Мне нужно сделать взаимодействие персонажа с картой, т.е. чтоб он не проходил сковозь отрисованные стенки.
Выше я давал кусок когда, где пытался сделать взаимодействие персонажа через праверку на 1 в массиве, но она работает не правильно.
0
0 / 0 / 0
Регистрация: 20.11.2017
Сообщений: 38
12.11.2018, 13:27  [ТС]
Прописал вывод, чтоб отследить координаты, но даже это не помогает. В цикле указал всё, что не обходимо, но ему все равно это не нравится. Вообще никто не может помочь что ли?

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
                System.out.println("HeroX: " + playerC.heroX);
                System.out.println("HeroY: " + playerC.heroY);
                for (int i =1; i < 11; i++){
                    for(int j=1; j < 15; j++){
                        if(winC.arrPic[i][j]==1){
                            float iUp = (float) (i*32);
                            float iDown = (float) ((1+i)*32);
                            float jLeft = (float) (j*32);
                            float jRight = (float) ((1+j)*32);
                            if(playerC.heroX >= jRight && playerC.heroY>=iUp && playerC.heroY<=iDown){
                                playerC.heroX -= DOT_SIZE;
                            }
                            if(playerC.heroX < jLeft && playerC.heroY>=iUp && playerC.heroY<=iDown){
                                playerC.heroX += DOT_SIZE;
                            }
                            if(playerC.heroY >= iUp && playerC.heroX>=jLeft && playerC.heroY<=jRight){
                                playerC.heroY -= DOT_SIZE;
                            }
                            if(playerC.heroY < iDown && playerC.heroX>=jLeft && playerC.heroY<=jRight){
                                playerC.heroY += DOT_SIZE;
                            }
                        }
                    }
                }
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
13.11.2018, 00:20
Скажите вы вообще понимаете что такое коллизия в двухмерном пространстве?
Решение вашей задачи это не программирование, это чистая математика.
На таких вещах диссертации пишут.
Для определения условия столкновения вам я уже дал рабочий выверенный годами код, почему вы его игнорируете ?

В нем вам надо было всего лишь дописать оставшиеся 3 условия для других сторон квадрата и повесить этот код на ваши квадраты цикле. Этот код ПОЛНОСТЬЮ решает задачу по столкновению для вашей игры.

1. Выверяя координатами вы должны сначала понять с каким из блоков произошло условие столкновения.
2. Определить с какой из 4 сторон произошло столкновение.
3. Принять решение что вам делать дальше, отразить движение или остановиться.

ах и чуть не забыл, java прекрасно воспроизводит mp3

Дальше сами...

И только не говорите что ничего не работает.

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
package test;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
 
 
public class Test01
{
    public JFrame window = new JFrame();
    public JLabel[] characters = new JLabel[2];
    public int[][] charactersBase = new int[characters.length][3];
    public int x;
 
    
    public Test01()
    {
        makeWindow();
        makeCharacters();
        makeTimer();
    }
    
    
    private void makeWindow()
    {
        window.setSize(800, 600);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        window.setLayout(null);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
    }
    
    
    private void makeCharacters()
    {
        for (int i = 0; i < characters.length; i++)
        {
            characters[i] = new JLabel();
            characters[i].setBounds(100+i*500, 300, 50, 50);
            characters[i].setBackground(new Color(120,190,255));
            characters[i].setOpaque(true);
            window.add(characters[i]);
            
            charactersBase[i][0] = characters[i].getX();
            charactersBase[i][1] = characters[i].getY();
            charactersBase[i][2] = 5;
        }
    }
    
    
    private void makeTimer()
    {
        Timer tm = new Timer(15, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if (characters[0].getX() < characters[1].getX() + characters[1].getWidth() &&
                    characters[0].getX() + characters[0].getWidth() > characters[1].getX() &&
                    characters[0].getY() < characters[1].getY() + characters[1].getHeight() && 
                    characters[0].getY() + characters[0].getHeight() > characters[1].getY())
                {
                    if (charactersBase[0][0] + characters[0].getWidth() > characters[1].getX() && 
                            charactersBase[0][0] + characters[0].getWidth() < characters[1].getLocation().getX() + (charactersBase[0][2] + 1))
                    {
                        charactersBase[0][0] = characters[1].getX() - characters[0].getWidth();
                    }
                }
                
                charactersBase[0][0] += charactersBase[0][2];
                characters[0].setLocation(charactersBase[0][0], charactersBase[0][1]);
            }
        });
        
        tm.start();
    }
    
    
    public static void main(String[] args)
    {
        new Test01();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2018, 00:20
Помогаю со студенческими работами здесь

перехожу с mysql на mysqli и столкнулся с проблемой
подскажите как тут mysql_field_name правильно изменить на mysqli, если просто заменяю mysql_field_name на mysqli_field_name, то получаю ...

Массивы структур, столкнулся с небольшой проблемой!
Всем доброго дня, столкнулся с небольшой проблемой, вот собственно само задание и код: Написать консольную программу на языке C++ с...

В IE прозрачный фон заменяется на чёрный
написал код в котором через FadeTo меняет на половину прозрачность картинка (png) - все норм а в IE прозрачность заменяет на черный фон

Столкнулся с проблемой установки интерпретатора на Linux Debian
Привет всем. Решил прикоснуться к замечательному языку Haskell, но столкнулся с проблемой установки интерпретатора на Linux Debian. Есть...

Совсем недавно столкнулся с проблемой входа на сайт Вконтакте, периодически всплывает ошибка
Здравствуйте. Заранее извиняюсь если пишу не в тот раздел форума. Совсем недавно столкнулся с проблемой входа на сайт Вконтакте,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru