Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/49: Рейтинг темы: голосов - 49, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 31.01.2021
Сообщений: 8

Двойной прыжок в Pygame

03.08.2021, 21:20. Показов 9635. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Очень нужна помощь. Вопрос касается Pygame. Я работаю над созданием простенькой игры. В данный момент столкнулся со следующей ситуацией. Персонаж должен сделать двойной прыжок в небе чтобы перепрыгнуть объекты, которые невозможно перепрыгнуть одиночным прыжком. Сейчас у меня есть код в котором персонаж делает только один прыжок. Отрывки кода связанные с прыжком указаны ниже:

Python
1
2
do_jump = False
jumping_counter = 30

Python
1
2
3
4
5
6
keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            do_jump = True
 
        if do_jump:
            jump()
Python
1
2
3
4
5
6
7
def jump():
    global u_y, jumping_counter, do_jump
    if jumping_counter >= -30:
        pass
    else:
        jumping_counter = 30
        do_jump = False

Я новичок в данной теме и эта игра мой первый проект.
Благодарю за любую помощь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2021, 21:20
Ответы с готовыми решениями:

При импорте pygame пишет что нет модуля pygame.base
Устанавливаю для kivy.Всё есть (sython,gsstreamer,kivy,pyscripter,python) , а вот фраем. pygame не работает.Почему?Что ещё надо для работы...

Ошибка в pygame AttributeError: 'pygame.Rect' object has no attribute 'blit'
Создаю игру, крестики нолики Почему возникает ошибка и как ее исправить? AttributeError: 'pygame.Rect' object has no attribute 'blit' ...

pygame.error: cannot convert without pygame.display initialized
Только начал изучать спрайты Выдаёт ошибку: Traceback (most recent call last): File "D:/project1/OCode.py", line 18, in...

5
Костыли любой сложности
201 / 146 / 36
Регистрация: 27.10.2019
Сообщений: 843
03.08.2021, 21:43
Jayyy, можно весь код?

Добавлено через 1 минуту
скорее всего нужно будет высчитывать тайминг одиночного прыжка (если не встречены препятствия) и если в это время нажата кнопка прыжка, то вызвать функцию прыжка, так же потребуется новая переменная\лимит рекурсий для запрета тройных прыжков
0
0 / 0 / 0
Регистрация: 31.01.2021
Сообщений: 8
04.08.2021, 01:28  [ТС]
user-ganz, Здравствуйте. Спасибо что откликнулись. Надеюсь на вашу помощь.

Вот блок кода прыжка вместе с механикой игры:

Python
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
import pygame
 
pygame.init()
 
d_weight = 800
d_height = 600
display = pygame.display.set_mode((d_weight, d_height))
 
character_width = 60
character_height = 100
character_x = d_weight // 3
character_y = d_height - character_height - 100
 
clock = pygame.time.Clock()
do_jump = False
jumping_counter = 30
 
 
def jump():
    global character_y, do_jump, jumping_counter
    if jumping_counter >= -30:
        character_y -= jumping_counter / 2.5
        jumping_counter -= 1
    else:
        jumping_counter = 30
        do_jump = False
 
 
def game_constructor():
    game = True
 
    while game:
        global do_jump
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
 
        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            do_jump = True
 
        if do_jump:
            jump()
 
        display.fill((255, 255, 255))
        pygame.draw.rect(display, (49, 52, 78), (character_x, character_y, character_width, character_height))
        pygame.display.update()
 
        clock.tick(60)
 
 
game_constructor()
Добавлено через 34 минуты
user-ganz,

Я добавил и объекты к коду, так как насколько я понимаю есть необходимость, чтобы в условии было прописано что персонаж не встретил на своем пути никаких объектов. На самом деле код очень большой, но думаю эта часть является достаточной для имплементации двойного прыжка. Сколько уже бьюсь над этим и никак не могу решить. Помогите пожалуйста)

Python
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
import pygame
 
pygame.init()
 
d_width = 800
d_height = 600
display = pygame.display.set_mode((d_width, d_height))
 
character_width = 60
character_height = 100
character_x = d_width // 3
character_y = d_height - character_height - 100
 
clock = pygame.time.Clock()
do_jump = False
jumping_counter = 30
 
object_width = 20
object_height = 70
object_x = d_width - 50
object_y = d_height - object_height - 100
 
 
def jump():
    global character_y, do_jump, jumping_counter
    if jumping_counter >= -30:
        character_y -= jumping_counter / 2.5
        jumping_counter -= 1
    else:
        jumping_counter = 30
        do_jump = False
 
 
def draw_object():
    global object_x, object_y, object_width, object_height
 
    if object_x >= -object_width:
        pygame.draw.rect(display, (143, 34, 67), (object_x, object_y, object_width, object_height))
        object_x -= 4
    else:
        object_x = d_width - 50
 
 
def game_constructor():
    game = True
 
    while game:
        global do_jump, jumping_counter, character_y
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
 
        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            do_jump = True
        if jumping_counter >= -15:
            pygame.display.update()
            if keys[pygame.K_SPACE]:
                character_y -= jumping_counter / 2.5
                jumping_counter -= 1
 
        if do_jump:
            jump()
 
        display.fill((255, 255, 255))
        draw_object()
        pygame.draw.rect(display, (49, 52, 78), (character_x, character_y, character_width, character_height))
        pygame.display.update()
 
        clock.tick(60)
 
 
game_constructor()
0
Костыли любой сложности
201 / 146 / 36
Регистрация: 27.10.2019
Сообщений: 843
04.08.2021, 12:57
Jayyy, будет как-то так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from time import time
 
jump_time=0 #не обязательно юзать глобальную переменную
 
def on_button_jump():
      global jump_time
      if time()-jump_time >= duration_of_single_jump: #duration длительность одного прыжка
           jump() #second jump
           jump_time=0 #запрет третьего прыжка
      else: 
           jump() #first jump
           jump_time=time()
      #action on any jump
def jump():
    global character_y, do_jump, jumping_counter
    
    if jumping_counter >= -30:
        character_y -= jumping_counter / 2.5
        jumping_counter -= 1
    else:
        jumping_counter = 30
        do_jump = False
Суть в том что при первом прыжке создаётся таймер при втором уничтожается. При прыжке проверяется если первый прыжок не завершён, то прыгать снова. Здесь jump_time, также несёт функцию проверки активности прыжка.
0
0 / 0 / 0
Регистрация: 31.01.2021
Сообщений: 8
04.08.2021, 19:32  [ТС]
user-ganz,

Здравствуйте. Спасибо большое за направление и за предоставленный код, но что-то не выходит. Возможно я что то не так делаю вновь. Можете глянуть мой код + ваше дополнение ниже? Не могу понять почему не получается(

Python
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
import pygame
 
from time import time
 
pygame.init()
 
d_width = 800
d_height = 600
display = pygame.display.set_mode((d_width, d_height))
 
character_width = 60
character_height = 100
character_x = d_width // 3
character_y = d_height - character_height - 100
 
clock = pygame.time.Clock()
do_jump = False
jumping_counter = 30
 
object_width = 20
object_height = 70
object_x = d_width - 50
object_y = d_height - object_height - 100
 
jump_time=0
 
def jump():
    global character_y, do_jump, jumping_counter
    if jumping_counter >= -30:
        character_y -= jumping_counter / 2.5
        jumping_counter -= 1
    else:
        jumping_counter = 30
        do_jump = False
 
def on_button_jump():
      global jump_time
      if time()-jump_time >= 2: #duration длительность одного прыжка
           jump() #second jump
           jump_time=0 #запрет третьего прыжка
      else: 
           jump() #first jump
           jump_time=time()
 
 
def draw_object():
    global object_x, object_y, object_width, object_height
 
    if object_x >= -object_width:
        pygame.draw.rect(display, (143, 34, 67), (object_x, object_y, object_width, object_height))
        object_x -= 4
    else:
        object_x = d_width - 50
 
 
def game_constructor():
    game = True
 
    while game:
        global do_jump, jumping_counter, character_y
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
 
        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            do_jump = True
        if jumping_counter >= -15:
            pygame.display.update()
            if keys[pygame.K_SPACE]:
                character_y -= jumping_counter / 2.5
                jumping_counter -= 1
 
        if do_jump:
            jump()
 
        display.fill((255, 255, 255))
        draw_object()
        pygame.draw.rect(display, (49, 52, 78), (character_x, character_y, character_width, character_height))
        pygame.display.update()
 
        clock.tick(60)
 
 
game_constructor()
0
Костыли любой сложности
201 / 146 / 36
Регистрация: 27.10.2019
Сообщений: 843
06.08.2021, 13:49
Jayyy, хз почему но у меня пайгаме возвращает несколько нажатий, удалось обойти костылями
Python
1
2
3
4
5
6
7
8
9
10
        if keys[pygame.K_SPACE]:
            print(time()-oldtime) 
            if do_jump !=2:
                if time()-oldtime>0.020 and time()-oldtime<2: #0020 здесь время автонажатия
                    do_jump=1
                    'only click'
                else:
                    do_jump=2 #заглушка, чтобы двойной клик не сбрасывался на одинарный
                    'double click'
            oldtime=time()
исправить твой код проблематично, разве что переписать, так как функция прыжка являтся и отрисовкой оного с жёсткой привязкой высоты
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2021, 13:49
Помогаю со студенческими работами здесь

Pygame ошибка module ‘pygame’ has no ‘init’ member
Всем здравствуйте. Недавно начал работать с VS code и выдает такая ошибка. Прикрепляю полностью скрин. Нашел решение перед каждой...

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

Как убрать двойной прыжок?
Использую Box2d для реализации физике в игре. Столкнулся с проблемой бесконечного прыжка если персонаж стоит у стены. Делал проверки по X...

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

Двойной и не полный прыжок на Unity C#
Можно ли на unity сделать одновременно и двойной прыжок, и что-бы при зажатии клавиши можно было прыгать выше (как в Hollow knight)? Если...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru