0

だから私はpygameゲームを書いていて、コードはちょっと大きいですが、私の問題が何であるかを説明します. 必要に応じてコードを投稿することもできます。

したがって、Python 3.3.2 を使用して、pygame に PlayerDataクラスとクラスがあります。クラスには、キーボード入力に応じて位置ベクトルを変更する 3 つのメソッドがあります (具体的には 2D なので x 座標) 。3つ目の方法は. 位置ベクトルを受け取り、それをプレーヤーの rect.left/rect.top に割り当てます。移動関数には flag パラメータがあり、クラスで使用します。EventManagerPlayerDataself.move_left(self)self.move_right(self)self.update_pos(self)EventManager

これまでのところ、これは明らかであり、プレーヤー クラスにとって適切です。ここで問題が発生します。私のEventManagerクラスでは、押された/離されたキーをチェックする for ループがあります。では__init__()私は電話しself.player = playerData()ただけです。キーが押された場合は、クラスself.player.move_left(flag=True)で定義されているものを呼び出します。PlayerData同じキーが離された場合は を呼び出すself.player.move_left(flag=False)ので、ピクセルの減算を停止して左に移動します。

繰り返しますが、これまでのところ、とても良いと思います。しかし、次にゲーム ループに入ります。これは次のようなものです Handle events Update game state Draw 。Handle events ブロックでキーをチェックし、押された場合はPlayerDataメソッドを呼び出して移動します。(クラスで定義された位置ベクトルの x、y 座標を再定義することを意味しますPlayerData)。次に Update data ブロックに移動し、そこで を呼び出しますPlayer.update_pos()。これにより、新しい位置座標がプレーヤーの四角形に割り当てられます。次に、プレーヤーを再描画します。

update_pos()問題は、メソッドを呼び出したときにベクトルの位置が変更されないことです。これがコードです。

import pygame
import sys
import datetime
from pygame.locals import *
from datetime import timedelta

class Vector(object):
    ''' Performs vector aritmetics
    '''
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def add(self, v):
        x = self.x + v.x
        y = self.y + v.y
        return Vector(x, y)


class GroundTerrain(object):
    ''' Ground data structure.
    Creates a ground data structure and her component's.
    '''
    def __init__(self):
        self.position = Vector(0, 334) # TODO: Remove the hard coding
        self.color = (128, 128, 128) # Gray
        self.width = WINDOWWIDTH
        self.height = 166
        self.ground = {'shape': pygame.Rect((self.position.x, self.position.y),
                                        (self.width, self.height)),
                   'color': self.color
                   }

    def draw_ground(self):
        ''' Draw's the ground shape and color using pygame.draw.rect(...).
        '''
        pygame.draw.rect(WINDOWSURFACE, self.ground['color'],
                                    self.ground['shape'])


class PlayerData(object):
    ''' Player data structure.
    Creates a player data structure and handles few actions.
    '''
    def __init__(self):
        self.ground = GroundTerrain()
        self.position = Vector(15, 264) # TODO: Remove the hard coding
        self.size = Vector(50, 70)
        self.velocity = Vector(5, 5)
        self.gravity = Vector(0, -10)

        self.color = (0, 100, 0) # Dark Green
        self.player = {'shape': pygame.Rect((self.position.x, self.position.y),
                                        (self.size.x, self.size.y)),
                   'color': self.color}

    def move_left(self, flag=False):
        ''' Moves the player shape horizontally
        if it's inside window borders.
        '''
        if flag and self.position.x > 0:
            self.position.x = self.position.x - self.velocity.x

    def move_right(self, flag=False):
        ''' Moves the player shape horizontally
        if it's inside window borders.
        '''
        if flag and self.position.x + self.size.x < WINDOWWIDTH:
        self.position.x = self.position.x + self.velocity.x

    def update_pos(self):
        self.player['shape'].left = self.position.x
        self.player['shape'].top = self.position.y

    def draw_player(self):
        ''' Draw's the player shape and color using pygame.draw.rect(...).
        '''
        pygame.draw.rect(WINDOWSURFACE, self.player['color'],
                                    self.player['shape'])


class EventManager(object):
    ''' Handles keyboard event's.
    Toggles player variables according to the event's.
    '''
    def __init__(self):
    self.player = PlayerData()

    def set_variables(self):
        ''' Toggles player variables according to keyboard/mouse event's.
        '''
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            if event.type == KEYDOWN:
                if event.key == K_LEFT or event.key == ord('a'):
                    self.player.move_left(True)
                if event.key == K_RIGHT or event.key == ord('d'):
                    self.player.move_right(True)

            if event.type == KEYUP:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                if event.key == K_LEFT or event.key == ord('a'):
                    self.player.move_left(False)
                if event.key == K_RIGHT or event.key == ord('d'):
                    self.player.move_right(False)

#-------------------------------------------------------------------------

WINDOWWIDTH = 900
WINDOWHEIGHT = 500
WINDOWSURFACE = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption('Placeholder')
MAIN_CLOCK = pygame.time.Clock()
FPS = 40

def main():
    pygame.init()
    Ground = GroundTerrain()
    Player = PlayerData()
    EventHandle = EventManager()

    while True:
        # Handle events
        EventHandle.set_variables()

        # Update game state
        Player.update_pos()

        # Draw
        WINDOWSURFACE.fill((0, 0, 0)) # Black
        Ground.draw_ground()
        Player.draw_player()
        pygame.display.update()

        MAIN_CLOCK.tick(FPS)

main()
4

1 に答える 1