Помощь в игре Pygame: Ускорение / Ускорение - PullRequest
2 голосов
/ 07 января 2020

Привет, может кто-нибудь помочь мне с моей игрой-пигмеем, это моя первая игра, и я очень плох в этом. По сути, я пытаюсь сделать одну из тех игр сумо, где 2 игрока находятся на ледяном ринге (круговая стадия), и им приходится набрасываться sh друг на друга, чтобы набрать очки, сейчас у меня проблемы с физикой льда, я понимаю, что там должен быть некоторый тип ускорения, когда клавиша удерживается нажатой, и трение, когда она отпущена, и я пытаюсь сделать это прямо сейчас, но в настоящее время, когда клавиша нажата, она только увеличивает скорость один раз, а не непрерывно, что означает, что вы должны нажать спам. это go быстрее. Также, если вы хотите помочь мне с моей игрой, если у меня возникнут вопросы, я был бы очень признателен, если бы вы хотели добавить спасибо: vincent # 3996

import pygame, sys, time
from pygame.locals import *
import random

#Colors
colorRed=pygame.Color(241,59,62)
colorPurple=pygame.Color(200,254,249)
colorBlue=pygame.Color(52, 207, 235)
colorGreen=pygame.Color(100,182,100)
colorWhite=pygame.Color(255,250,250)
colorBlack=pygame.Color(0,0,0)
colorOrange=pygame.Color(242,164,0)
colorBrown=pygame.Color(148,103,58)

#Dimensions
w=800
h=600
pygame.init()
fpsClock=pygame.time.Clock()
screen=pygame.display.set_mode((w,h))
pygame.display.set_caption ('SUMO')
centerX=w//2
centerY=h//2

#Stage
stageR=250
def stage (centerX,centerY):
    """stage (centerX,centerY) - creates a stage with given centerpoint"""
    pygame.draw.circle(screen, colorBlue, (centerX,centerY),stageR)

#Character 1
xR=int((stageR//10))
x1=int(centerX-(stageR*0.8))
y1=centerY
x1_dir=0
y1_dir=0
x1_right=False
def char1 (x1,y1):
    """char1 (x1,y1) - creates char1 at given coordinates"""
    pygame.draw.circle(screen, colorRed, (x1,y1),xR)
print (x1)
print (centerX)
if x1_right==True:
    x1_dir+2

while True:
    screen.fill(colorBlack)
    for event in pygame.event.get():
        #Game Exit
        if event.type== QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_d:
                x1_dir+=1
                x1_right=True
            if event.key==K_a:
                x1_dir-=1
            if event.key==K_w:
                y1_dir-=1
            if event.key==K_s:
                y1_dir+=1
        if event.type==KEYUP:
            if event.key==K_d:
                x1_right=False

    stage (centerX,centerY)
    char1 (x1,y1)
    x1+=x1_dir
    y1+=y1_dir
    pygame.display.update()
    fpsClock.tick(60)

1 Ответ

1 голос
/ 07 января 2020

Событие KEYDOWN происходит только один раз при нажатии клавиши (см. pygame.event).
Используйте pygame.key.get_pressed(), чтобы получить текущее состояние клавиш в каждом кадре.
Увеличивайте скорость в направлении x (x1_dir), если нажата a или d , и уменьшайте ее, если ни одна из клавиш не нажата.
Увеличьте скорость в направлении y (y1_dir), если нажата w или s , и уменьшите ее, если ни одна из клавиш не нажата. Например:

while True:
    screen.fill(colorBlack)
    for event in pygame.event.get():
        #Game Exit
        if event.type== QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_d:
                x1_right=True
        if event.type==KEYUP:
            if event.key==K_d:
                x1_right=False

    keys = pygame.key.get_pressed()

    if keys[K_d] or keys[K_a]:
        x1_dir += 0.1 if keys[K_d] else -0.1
    else:
        x1_dir *= 0.98

    if keys[K_w] or keys[K_s]:
        y1_dir += 0.1 if keys[K_s] else -0.1
    else:
        y1_dir *= 0.98

Для плавного движения вы должны использовать значения с плавающей запятой. Используйте round для преобразования чисел с плавающей запятой в целые целые числа, например

char1(round(x1), round(y1))

...