Alleger les mouvement et déplacements

Fermé
Jean - Modifié le 28 déc. 2020 à 17:42
 Jean - 29 déc. 2020 à 13:43
Bonjour,
je voudrais que mon personnage ne part et ne s'arrête pas brutalement quand une touche de mon ordinateur est appuyé. voici un exemple: si on est immobile et qu'on se met à courir, on ne vas pas tout de suite aller à sa vitesse maximale, pareil pour s'arrêter, on met quelques secondes pour être complètement immobile.
j'ai donc essayé et cela marche seulement pour le départ. voici mon code.
main.py:
import pygame, sys
from game import Game

pygame.init()

screen = pygame.display.set_mode((1199, 800))
icon = pygame.image.load('icon_and_background/icon.png')
pygame.display.set_caption('the game')
pygame.display.set_icon(icon)
game = Game

running = True

while running:
    pygame.display.flip() 
    screen.blit(game.background_2, (0,0))
    screen.blit(game.background_1, (0, 740))
    screen.blit(game.player.skin, game.player.rect)

    if game.pressed.get(pygame.K_q) and game.player.can_move_left:
        game.player.can_move_right = False
        game.player.move_left()
        game.player.speed_add()

    if game.pressed.get(pygame.K_q) == False and game.player.can_move_right == False:
        if game.player.speed > 1.9:
            for i in range(20):
                game.player.speed -= 0.1
        if game.player.speed < 1.9:
            game.player.speed = 0.1
        game.player.can_move_right = True

    if game.pressed.get(pygame.K_d) and game.player.can_move_right:
        game.player.can_move_left = False
        game.player.move_right()
        game.player.speed_add()

    if game.pressed.get(pygame.K_d) == False and game.player.can_move_left == False:
        game.player.speed = 0.1
        game.player.can_move_left = True


    '''elif game.pressed == False:
        game.player.speed_remove()
        if game.pressed.get(pygame.K_q) == False and game.player.can_move_right == False:
            game.player.can_move_right = True

        if game.pressed.get(pygame.K_d) == False and game.player.can_move_left == False:
            game.player.can_move_left = True
'''
    print(game.player.speed)
    for event in pygame.event.get():

        if event.type == pygame.QUIT: 
            running = False 

        if event.type == pygame.KEYDOWN:
            game.pressed[event.key] = True
        elif event.type == pygame.KEYUP:
            game.pressed[event.key] = False
pygame.quit() 
sys.exit() 


game.py
import pygame
from player import Player

class Game():

    player = Player()
    pressed = {}
    background_1 = pygame.image.load('icon_and_background/bg1.jpg')
    background_2 = pygame.image.load('icon_and_background/bg2.jpg)

player.py
import pygame

class Player(pygame.sprite.Sprite):

    def __init__(self):
        super().__init__()
        self.speed = 0.1
        self.skin = pygame.image.load('player/player_right.png')
        self.rect = self.skin.get_rect()
        self.rect.x = 100.0
        self.posx = self.rect.x
        self.rect.y = 670.0
        self.can_move_left = True
        self.can_move_right = True

    def move_left(self):

        self.posx -= self.speed
        self.rect.x = self.posx
        self.skin = pygame.image.load('player/player_left.png')

    def move_right(self):

        self.posx += self.speed
        self.rect.x = self.posx
        self.skin = pygame.image.load('player/player_right.png')

    def speed_add(self):
        if self.speed <= 2.0:
            self.speed += 0.01

voila j'espère que ce soit réalisable et merci de me répondre le plus rapidement possible.
A voir également:

3 réponses

yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 Ambassadeur 1 556
28 déc. 2020 à 21:21
bonjour,
qu'as-tu changé dans ton code pour rendre le départ progressif?
ne peux-tu pas appliquer la même logique à l'arrivée?
0
dans player.py, j'ai créé(dans la classe player) une définition de speed_add qui rajoute 0.01 de vitesse si la variable speed est inférieur à 2
def speed_add(self):
if self.speed <= 2.0:
self.speed += 0.01

ensuite, dans main.py, dans les condition des 'si telle touche est appuyé alors...' j'ai mis comme action la définition speed_add
if game.pressed.get(pygame.K_d) and game.player.can_move_right:
game.player.can_move_left = False
game.player.move_right()
game.player.speed_add()

et pour les variables "can_move_left" et "can_move_right", j'ai du les rajouter car sinon le départ progressif ne marche pas.
j'ai essayé (et essaie toujours) de faire la même chose pour l'arrêt mais je n'y arrive pas.
0
yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 1 556 > Jean
29 déc. 2020 à 11:19
j'imagine que c'est un peu plus compliqué pour l'arrêt, parce que tu ne sais pas à l'avance quand et où le player va s'arreter.
j'imagine alors que, au moment où le player reçoit l'instruction de s'arreter, il va commencer à ralentir, et donc s'arreter un peu plus loin et un peu pls tard.
c'est bien cela?
0
yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 1 556 > Jean
29 déc. 2020 à 11:37
je me demande si c'est une bonne idée, ces deux variables "can_move". que représentent-elles précisément?
je me demande si ce n'est pas mieux d'avoir une seule variable "mouvement", qui vaudrait "arrete", "vers la gauche", "vers la droite", "freinant vers la gauche", "freinant vers la droite".
je pense que la classe Player devrait faire plus de travail, qui est fait pour le moment dans main.
je suggère de modifier tout cela avant d'ajouter d'autres fonctions, sinon le programme va devenir ingérable.
0
Jean > yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024
29 déc. 2020 à 13:43
le code que j'ai envoyé n'est q'une toute petite partie de mon programme mais c'est vrai que main a beaucoup de travail comme vous le dites. je vais donc alléger ce programme et j'essaierai de résoudre le problème plus tard.
0
yg_be Messages postés 23361 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 Ambassadeur 1 556
28 déc. 2020 à 21:23
j'ai l'impression que tu changes de pseudo entre deux questions. est-ce exact? si oui, pourquoi fais-tu cela?
0
si vous pensez que le deuxième pseudo est Alex, alors oui, c'est vrai.
Je me suis mit à programmer en python en même temps que mon amis Alex, malheureusement, je n'ais plus d'ordinateur et je dois donc utiliser le sien(pour savoir, nous somme en collocation), et j'utilise ce même forum pour résoudre mes problèmes de programmation. mais le pseudo "Jean" ne reviendra plus car je compte bientôt m'acheter un nouvel ordinateur.
et aussi nous travaillons sur le même jeu que nous préparons depuis maintenant 1 mois.
0