0

pygame で簡単なゲームを作っています。私のキャラクターの画像をインポートして、自由に動かすことができます。キャラクターがゆっくりと止まるようにする方法を考えていました。

event.type == KEYUP:

のように、キーを離すと、キャラクターは、キーが離されてからキャラクターがゆっくりと止まるまで 50 ピクセルかかります。

私はいくつかの異なることを試しましたが、何もうまくいかないようです。以下は私のコードです。どんな助けでも素晴らしいでしょう=]

bg="bg.jpg"
staticCharacter="toon.png"

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

pygame.init()
screen = pygame.display.set_mode((640,360),0,32)

background=pygame.image.load(bg).convert()

staticToon = pygame.image.load(characterMid).convert_alpha()

x = 0
y = 0
movex = 0
movey = 0

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                movex = -0.20 
            elif event.key == K_RIGHT:
                movex = +0.20        
            elif event.key == K_UP:
                movey = -0.20       
            elif event.key == K_DOWN:
                movey = +0.20

        if event.type == KEYUP:
            if event.key == K_LEFT:
                movex = 0           
            elif event.key == K_RIGHT:
                movex = 0                    
            elif event.key == K_UP:
                movey = 0         
            elif event.key == K_DOWN:
                movey = 0


    x += movex
    y += movey

    if x > 560:
        x = 560
    if y > 280:
        y = 280
    if x < 0:
        x = 0
    if y < 0:
        y = 0

screen.blit(background,(0,0))
screen.blit(staticToon,(x,y))
pygame.display.update()
4

3 に答える 3

1

distance = speed*time

movex(またはを使用して) 位置を増加させる代わりにmovey、速度を増加させます。

delta = {
    pygame.K_LEFT: (-20, 0),
    pygame.K_RIGHT: (+20, 0),
    pygame.K_UP: (0, -20),
    pygame.K_DOWN: (0, +20),  
    }
...

elif event.type == pygame.KEYDOWN:
    deltax, deltay = delta.get(event.key, (0, 0))
    ball.speed[0] += deltax
    ball.speed[1] += deltay

ここで、オブジェクト (以下の例ではボール) を遅くするために、摩擦を追加します。

    ball.speed[0] *= 0.95
    ball.speed[1] *= 0.95  

これにより、イベント ループを通過するたびに速度が少しずつ低下します。

オブジェクトを に等しい距離だけ移動しますspeed * time。簡単にするために、時間の変化を 1 にしましょう。

self.rect = self.rect.move(self.speed)

実行可能な例を次に示します ( の正しいパスを追加するだけですstaticCharacter。)

import sys
import pygame
import os

'''
Based on http://www.pygame.org/docs/tut/intro/intro.html
Draws a red ball bouncing around in the window.
Pressing the arrow keys moves the ball
'''

staticCharacter = "toon.png"

delta = {
    pygame.K_LEFT: (-20, 0),
    pygame.K_RIGHT: (+20, 0),
    pygame.K_UP: (0, -20),
    pygame.K_DOWN: (0, +20),  
    }

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self) 
        self.image = pygame.image.load(staticCharacter)
        self.rect = self.image.get_rect()
        self.speed = [2, 2]
        self.area = pygame.display.get_surface().get_rect()
    def update(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.left < 0 or self.rect.right > self.area.width:
            self.speed[0] = -self.speed[0]
        if self.rect.top < 0 or self.rect.bottom > self.area.height:
            self.speed[1] = -self.speed[1]

class Main(object):
    def __init__(self):
        self.setup()
    def setup(self):
        pygame.init()
        size = (self.width, self.height) = (640,360)
        self.black = (0, 0, 0)
        self.screen = pygame.display.set_mode(size, 0, 32)
        self.ball = Ball()
        self.setup_background()
    def setup_background(self):
        self.background = pygame.Surface(self.screen.get_size())
        self.background = self.background.convert()
        self.background.fill(self.black)
        self.screen.blit(self.background, (0, 0))
        pygame.display.flip()
    def draw(self):
        self.screen.blit(self.background, (0, 0))
        self.screen.blit(self.ball.image, self.ball.rect)
        pygame.display.flip()
    def event_loop(self):
        ball = self.ball
        while True:
            for event in pygame.event.get():
                if ((event.type == pygame.QUIT) or 
                    (event.type == pygame.KEYDOWN and 
                     event.key == pygame.K_ESCAPE)):
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    deltax, deltay = delta.get(event.key, (0, 0))
                    ball.speed[0] += deltax
                    ball.speed[1] += deltay
            ball.speed = [0.99*s for s in ball.speed]
            ball.update()
            self.draw()
            pygame.time.delay(10)

if __name__ == '__main__':
    app = Main()
    app.event_loop()
于 2013-03-17T10:44:38.630 に答える
0

通常、キャラクターの動きはマシンの速度に依存しないように作られています。あなたの例では、While ループが 1 秒間に何回実行されるかわかりません。これはコンピューターの速度に依存します。したがって、最初に、pygame クロックを使用して、各 move() 呼び出し間の時間差を計算する必要があります。

myclock = pygame.Clock()
delta = myclock.tick()

時差がある場合は、次のような距離方程式を使用できます。

position += speed * direction * delta

deltaはミリ秒単位なので、それに応じて設定する必要がありますspeed。現在direction押されているキーに応じて、-1 または +1 になります。キーアップは方向を 0 に設定します。

では質問に戻ります。上記を少し変更する必要があります。キーアップは、方向から小さな値を減算します。

次に、方向が 1 または -1 でないかどうかを確認し、方向から値を減算します。これをループごとに行います。このようにして、どんどん小さくなり、キャラクターの動きが鈍くなっているように見えます。減算した値にデルタを掛けると、すべてのコンピューターで一定の減速度になります。

于 2013-03-17T10:25:06.043 に答える