С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 22.08.2018
Сообщений: 12

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

25.08.2018, 14:56. Показов 4698. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю небольшую игру. Хочу сделать так чтобы при столкновении объектов у игрока снимались жизни?
Java
1
2
3
4
5
if ((player.getX() > enemy.getX() - 64) && (player.getX() < enemy.getX() + 64)
                && (player.getY() > enemyPointY - 64) && (player.getY() < enemyPointY + 64)) {
            //
            }
        }
Я думал что можно сделать вот так. Но получается так, что снимается несколько жизней, пока объект проходит сквозь игрока.
Java
1
Player.lives--;
Как сделать так чтобы если условие хоть один раз равняется true выполнялась команда и всё? Надеюсь вы меня поняли. Заранее благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2018, 14:56
Ответы с готовыми решениями:

Что сделать, чтобы метод вызывался лишь один раз?
Доброго времени суток! В общем, персонаж входит в лес и высвечивается диалог(рассуждение). void OnTriggerEnter(Collider other) ...

Что можно сделать, что бы конструктор вызывался один раз при агрегировании?
Добрый день. Написал код, но два раза подряд вызывается конструктор, так как создаю объект в другом классе.. Что можно сделать, что бы...

Превратить программу так, чтобы метод Func вызывался n раз
using System; class Program { static void Func() // дополнительный метод { Console.Write(&quot;x =&quot;); double...

13
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
25.08.2018, 15:01
вместо && использовать ||

шаблон по твоему примеру:
( условие ) || ( условие ) || ( условие )
1
0 / 0 / 0
Регистрация: 22.08.2018
Сообщений: 12
25.08.2018, 15:44  [ТС]
Не помогло теперь постоянно жизни списываются.
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
25.08.2018, 15:52
Лучший ответ Сообщение было отмечено VladJava как решение

Решение

Похоже я понял вопрос.
Раннее, я думал нужно, чтобы 1 раз в скобках условие выполнилось, и тогда делать то, что в скобках { }

Посмотрев на условие, тут же вопрос. Если вы учитываетe радиус от врага, то почему не учитываете радиус от игрока?
Из-за этого, и снимаются жизни только при пересечении на половину.

Но это одно, а чтобы один раз жизнь списывалась, необходимо сделать триггер

Например, один раз урон был от столкновения?
то trigger = true

тогда в условие, добавьте пожалуйста эту запись:
... && !trigger) {...

но, если условие не проходит, то иначе:
trigger = false;

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

Можно было бы сделать так, чтобы игрок мигал (например 3 секунды), а потом, если он опять столкнулся с врагом - опять урон.
ДЛя этого используйте таймер, и по истечению таймера: trigger = false;
1
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
25.08.2018, 15:54
VladJava, Думается мне, у тебя не все ок с ооп.
Сделай класс PointLocation где будешь хранить координаты. В нем же, переопредели метод public boolean equals().
Для player и enemy дай по одному объекту PointLocation. После каждого движения игрока или врагов, вызываешь equals().
1
0 / 0 / 0
Регистрация: 22.08.2018
Сообщений: 12
25.08.2018, 16:43  [ТС]
sdasdaw, Сделал как вы скзали. Объявил boolean trigger = false, а также прописал:
Java
1
2
3
4
5
if ((player.getX() > enemy.getX() - 64) && (player.getX() < enemy.getX() + 64)
                && (player.getY() > enemyPointY - 64) && (player.getY() < enemyPointY + 64) && !trigger) {
            Player.lives--;
            trigger = true;
        }
При столкновении жизнь списывается один раз, как я и хотел, но больше она не списывается при сталкивании.
Потому что trigger нужно вернуть в состояние false. Теперь нужно будеть разобраться с таймером.
Кстати можно ещё сделать так чтобы при сталкивании enemy исчезал. И тогда точно всё будет работать как надо.
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
25.08.2018, 16:47
В условии, добавьте просто else trigger = false;

можно, как вы рисуете врага / компонент?
1
0 / 0 / 0
Регистрация: 22.08.2018
Сообщений: 12
25.08.2018, 18:03  [ТС]
sdasdaw, Я недавно сделал так чтобы объект сам себя перерисовывал. То есть добавил метод paint в класс Enemy.
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
class Enemy {
 
    public Image spriteEnemy;
 
    public int enemyPointY;
 
    private int x = 704;
    private int speed = 6;
 
    public Enemy() {
        enemyPointY = (int) (64 + Math.random() * 512);
 
        try {
            spriteEnemy = ImageIO.read(new File("img/imageLiquid.png"));
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Файл img/imageLiquid.png не найден");
        }
    }
 
    public void paint(Graphics g) {
        if (getX() < -64) {
            enemyPointY = (int) (64 + Math.random() * 512);
            setX(704);
        }
        setX(getX() - getSpeed());
        g.drawImage(spriteEnemy, getX(), enemyPointY, null);
    }
 
    public int getX() {
        return x;
    }
 
    public void setX(int x) {
        this.x = x;
    }
 
    public int getSpeed() {
        return speed;
    }
 
    public void setSpeed(int speed) {
        this.speed = speed;
    }
 
}
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
class Player {
 
    public Image spritePlayer;
 
    public static int score = 0;
    public static int lives = 3;
 
    private int x = 0;
    private int y = 0;
    private int speed = 8;
 
    public Player() {
        try {
            spritePlayer = ImageIO.read(new File("img/imageAnt.png"));
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Файл img/imageAnt.png не найден");
        }
    }
 
    public void paint(Graphics g) {
        g.drawImage(spritePlayer, getX(), getY(), null);
    }
 
    public void setX(int x) {
        this.x = x;
    }
 
    public int getX() {
        if (this.x > 576) {
            x = 576;
        }
        if (this.x < 0) {
            x = 0;
        }
        return x;
    }
 
    public void setY(int y) {
        this.y = y;
    }
 
    public int getY() {
        if (this.y > 576) {
            y = 576;
        }
        if (this.y < 64) {
            y = 64;
        }
        return y;
    }
 
    public void setSpeed(int speed) {
        this.speed = speed;
    }
 
    public int getSpeed() {
        return speed;
    }
 
}
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
class GamePanel extends JPanel implements ActionListener {
 
    Timer timer = new Timer(500, this);
 
    public boolean trigger = false;
    public boolean belse = false;
 
    public static Player player = new Player();
    public static Enemy enemy = new Enemy();
    public static StatusPanel statusPanel = new StatusPanel();
    public static GameBackground gameBackground = new GameBackground();
 
    public GamePanel() {
        setFocusable(true);
        requestFocus();
        timer.start();
    }
 
    public void paintComponent(Graphics g) {
        for (int i = 0; i < 2; i++) {
            gameBackground.paint(g, i);
            //gameBackground.moveBackground();
            Player.score++;
        }
        
        statusPanel.paint(g);
        player.paint(g);    
        enemy.paint(g);
 
        // Событие при столкновение
        if ((player.getX() > enemy.getX() - 64) && (player.getX() < enemy.getX() + 64)
                && (player.getY() > enemy.enemyPointY - 64) && (player.getY() < enemy.enemyPointY + 64) && !trigger && !belse) {
            Player.lives--;
            System.out.println("trigger = true");
            trigger = true;
            /*enemy.enemyPointY = (int) (64 + Math.random() * 512);
            enemy.setX(704);*/
        }
 
 
    }
 
    @Override
    public void actionPerformed(ActionEvent arg0) {
        repaint();
 
    }
 
}
0
 Аватар для Aviz__
2736 / 2046 / 506
Регистрация: 17.02.2014
Сообщений: 9,462
25.08.2018, 18:08
тема то отсюда https://www.cyberforum.ru/java-gui/
1
0 / 0 / 0
Регистрация: 22.08.2018
Сообщений: 12
25.08.2018, 18:17  [ТС]
sdasdaw, Да. Я разобрался. Я добавил ещё одно условие.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Событие при столкновение
        if ((player.getX() > enemy.getX() - 64) && (player.getX() < enemy.getX() + 64)
                && (player.getY() > enemy.enemyPointY - 64) && (player.getY() < enemy.enemyPointY + 64) && !trigger) {
            Player.lives--;
            System.out.println("trigger = true");
            trigger = true;
            /*enemy.enemyPointY = (int) (64 + Math.random() * 512);
            enemy.setX(704);*/
        }
        if (!((player.getX() > enemy.getX() - 64) && (player.getX() < enemy.getX() + 64)
                && (player.getY() > enemy.enemyPointY - 64) && (player.getY() < enemy.enemyPointY + 64))) {
            System.out.println("trigger = false");
            trigger = false;
            /*enemy.enemyPointY = (int) (64 + Math.random() * 512);
            enemy.setX(704);*/
        }
Теперь когда игрок не касается врага - trigger = false; А когда касается true;
Большое спасибо, что рассказал о такое классной вещи, как trigger;
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
25.08.2018, 18:19
перед, нужно скорее всего убедится, что изображение имеет альфа канал, но это не точно.
Проверяйте это:
g.setComposite(AlphaComposite.getInstanc e(AlphaComposite.SRC_OVER, 0.5));

Добавлено через 1 минуту
VladJava, зачем еще одно условие...
просто else добавить к существующему условию
1
0 / 0 / 0
Регистрация: 22.08.2018
Сообщений: 12
25.08.2018, 18:25  [ТС]
sdasdaw, Я уже пробовал.
Если добавить else к условию, то trigger в нём поменяется на false.
И тогда первое условие будет опять true. Так как там идет проверка && !trigger.
0
 Аватар для sdasdaw
406 / 278 / 93
Регистрация: 14.03.2017
Сообщений: 777
25.08.2018, 18:29
Лучший ответ Сообщение было отмечено VladJava как решение

Решение

тогда поменяйте условие
создайте условие в условии и переместите туда проверку trigger
if ( ... ) {
if (!trigger) {
// ...
}
} else {
false
}
1
0 / 0 / 0
Регистрация: 22.08.2018
Сообщений: 12
25.08.2018, 19:27  [ТС]
sdasdaw, Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2018, 19:27
Помогаю со студенческими работами здесь

Эффект CSS применяется лишь один раз, а нужно, чтобы он вызывался для каждой буквы строки
Всем привет, на этом форуме мне скинули сайт с анимацией появления текста в CSS: https://daneden.github.io/animate.css/ Скачал я эту...

При выборке одна и та же строка выводится несколько раз. Как сделать чтобы один?
Считываем журнал безопасности в Базу данных так сказать онлайн и в textbox записываем выборки и он находит запись с eventID=4689 и как...

Как сделать, чтобы при нажатии на кнопку Messagebox открывался только один раз?
Как сделать что-бы когда при нажатии на кнопку Messagebox открывался только один раз (пока на кнопку ок в Messagebox не нажмешь больше не...

Как сделать, чтобы при запуске проги с параметрами, вызывался пункт меню соответствующий введенному параметру?
Добрый день. есть простая консольная прога с меню. хочу, чтобы при запуске проги с параметрами вызывался пункт меню соответствующий...

Как сделать чтобы анимация запускалась каждый раз после нажатия на кнопку, а не один раз?
Как сделать чтобы анимация запускалась каждый раз после нажатия на кнопку, а не один раз? &lt;style&gt; .main { ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru