1

そのため、スプライトを画面の境界内にとどめることに問題がありました。単純な rect(0,0,16,16) で動作するようになりましたが、スプライトが画面にブリットされていると動作しないようです。スプライトを画面解像度内に固定するには、何を変更する必要がありますか? 今日、コードを整理するためにクラスを使用し始めたばかりなので、どんな入力も高く評価され、役に立ちます。

import pygame
from pygame.locals import *
from pygame import Color


class Game():
    """ Lets try to get this going by simple steps
    One by one. First step, lets figure how to make a class
    that can do the display stuff. Lord have mercy on my soul"""

    def __init__(self, wi=256, hi=224, multii=3):
        """Initialization"""
        pygame.init()
        self.runGame    = True
        self.width      = wi*multii
        self.height     = hi*multii
        self.spritesize = 16*multii
        self.clock      = pygame.time.Clock()
        self.fps        = self.clock.get_fps()
        self.screen     = pygame.display.set_mode((self.width, self.height))
        self.kl         = []
        self.walk       = [0, 0]
        self.speed      = multii*1.5
        self.x,self.y   = self.width/2, self.height/2
        self.playerSpr  = pygame.image.load('images/'+'link1.png').convert_alpha()
        self.playerRec  = Rect(self.playerSpr.get_rect())


    def mainLoop(self):
        """Loop through the main game routines
        1. Drawing  2. Input handling  3. Updating
        Then loop through it until user quits"""
        while self.runGame:
            self.clock.tick(60)
            self.events()
            self.draw()


    def events(self):
        """Time to handle some events"""
        for e in pygame.event.get():
            if (e.type == pygame.QUIT) or (e.type == KEYDOWN and e.key == K_ESCAPE):
                self.runGame = False
                break                            
            if e.type==KEYDOWN:     
                if e.key==pygame.K_a: self.kl.append(1)
                if e.key==pygame.K_d: self.kl.append(2)
                if e.key==pygame.K_w: self.kl.append(3)
                if e.key==pygame.K_s: self.kl.append(4)             
            if e.type==pygame.KEYUP:
                if e.key==pygame.K_a: self.kl.remove(1)            
                if e.key==pygame.K_d: self.kl.remove(2)
                if e.key==pygame.K_w: self.kl.remove(3)             
                if e.key==pygame.K_s: self.kl.remove(4)

            if   self.kl[-1:]==[1]: self.walk=[-self.speed, 0]
            elif self.kl[-1:]==[2]: self.walk=[ self.speed, 0]
            elif self.kl[-1:]==[3]: self.walk=[0,-self.speed]
            elif self.kl[-1:]==[4]: self.walk=[0, self.speed]
            else:                   self.walk=[0, 0]

        self.x+=self.walk[0]
        self.y+=self.walk[1]


    def draw(self):
        """Draw and update the main screen"""
        self.fps = self.clock.get_fps()
        self.screen.fill(Color('purple'))
        #print self.screen.get_rect()
        #print player_rect
        self.playerSpr.clamp_ip(self.screen.get_rect())
        #pygame.draw.rect(self.screen, (255, 255, 255), self.playerrect)
        self.screen.blit(self.playerSpr, (self.x,self.y), self.playerRec)
        pygame.display.set_caption('Grid2. FPS: '+str(self.fps))
        pygame.display.update()



game = Game()
game.mainLoop()
4

2 に答える 2

1

追加の属性や属性playerRecの代わりに、プレーヤーの位置を追跡するために使用してみませんか?xy

moveメソッド(または)も使用することをお勧めしますmove_ip

def events(self):
    for e in pygame.event.get():
       ...

    self.playerRec.move_ip(*self.walk) # instead of self.x+=self.walk[0] / self.y+=self.walk[1]

def draw(self):
    ...

    # probably do this right after 'move_ip'
    self.playerRec.clamp_ip(self.screen.get_rect())

    # note that 'blit' accepts a 'Rect' as second parameter
    self.screen.blit(self.playerSpr, self.playerRec) 

補足として:Sprite基本的に と を組み合わせているため、の使用を検討する必要がImageありRectます。

于 2012-12-18T12:01:23.230 に答える
1

2つのこと:

  1. スプライトが画面から外れても、スプライトの動きを止めません。方向を取得し、さらに横に移動できるかどうかを決定する Move 関数を作成します。そうすれば、スプライトの右側が画面の場合、右側に移動しなくなります。

  2. スタックのように機能するリストに方向キーを配置するため、キーを押すごとに 1 つの方向しか得られません。斜めにも移動したい場合は、2 つのリストを両方向に 1 つにするか、次のような簡単な方法を使用します。

    if KEYDOWN == K_LEFT: direction_x = -1
    if KEYUP == K_LEFT AND direction_x == -1: direction_x = 0
    

    すべてのキーに対してこれを行います。

于 2012-12-18T10:05:56.273 に答える