2017-05-03 11 views
1

pygameを使用したクラスのための単純なPythonゲームを作成しています。私は短い時間をコーディングしましたが、このプロジェクトまではグラフィックを使用していませんでした。私はすでに、プレイヤーからクリックされたポイントに移動する「火の玉」を作成しました。 私は戦士に取り組んでいます。彼は彼と一緒に旅する剣を持っています。私はまた、私が望むスラッシュルックの動きを持っています。スペースバーを押して剣の角度を変えてから、通常の位置に戻します。私が抱えている問題は、イメージ/オブジェクト(剣)が下の位置に描かれると、その位置にとどまるということです。元の画像は元の位置に戻りますが、私は誰かが正しい方向にポイントを持つことを望んでいた。これが私の最初のグラフィカルゲームです。私はこれが通常、オブジェクトがメインで描画されている行と何か関係があることを知っていますが、私はそれを少しでも幸せにしています。また、私がこれについて間違っていると言っても、何かを言いたいことはありません。 ご協力いただきありがとうございます。Pygameアニメーションオブジェクトが描画されない

クラスプレーヤー(pygame.sprite.Sprite):

def __init__(self, name): 
    pygame.sprite.Sprite.__init__(self) 
    self.name = name 
    self.level = 1 
    self.xp = 0 
    self.health = 100 
    self.power = 100 
    self.disc = 0 
    self.currentAtk = 1 


def draw(self, screen): 
    screen.blit(self.image, (self.rect.x, self.rect.y)) 

def update(self): 
    key = pygame.key.get_pressed() 

    if key[K_SPACE]: 
     if self.disc == 1 and self.currentAtk == 1: 
      self.warsword.stab() 

クラス剣(pygame.sprite.Sprite):

image = pygame.image.load('images\\sword.png') 

def __init__(self, x1, y1, angle = -25, stabtime = 5): 
    pygame.sprite.Sprite.__init__(self) 
    self.angle = angle 
    self.image = pygame.transform.rotate(Sword.image, self.angle) 
    self.rect = self.image.get_rect() 
    self.rect.x, self.rect.y = x1, y1 
    self.stabtime = stabtime 
    self.repeat = 2 

def update(self): 
    key = pygame.key.get_pressed() 

    if key[K_a] and self.rect.x >= 72: 
     self.rect.x -= 1 
    if key[K_d] and self.rect.x <= 572: 
     self.rect.x += 1 
    if key[K_w] and self.rect.y >= 154: 
     self.rect.y -= 1 
    if key[K_s] and self.rect.y <= 309: 
     self.rect.y += 1 

def draw(self, screen, x, y): 
    screen.blit(self.image, (x, y)) 

def stab(self): 
    if self.angle != -90 and self.stabtime == 5: 
     self.angle = -90 
     self.rect.y += 15 
    if self.stabtime >= -5: 
     self.image = pygame.transform.rotate(self.image, self.angle) 
    else: 
     pygame.sprite.Sprite.update(self) 
    self.stabtime -= 1 

クラスの戦士(プレーヤー):

image = pygame.image.load('images\\warrior.png') 
SwordX = 0 
SwordY = 0 
def __init__(self, name, x, y): 
    super(Warrior, self).__init__(name) 
    self.disc = 1 
    self.image = Warrior.image 
    self.rect = self.image.get_rect() 
    self.rect.x = x 
    self.rect.y = y 
    Warrior.SwordX = self.rect.x + 12 
    Warrior.SwordY = self.rect.y + 10 
    self.warsword = Sword(Warrior.SwordX, Warrior.SwordY) 
    atks.add(self.warsword) 

def main():

chars = pygame.sprite.Group(()) 
screen = pygame.display.set_mode((640, 480)) 
a = Warrior('Fago', 250, 200) 
chars.add(a) 
screen = pygame.display.set_mode((640, 480)) 
while True: 

    chars.update() 
    atks.update() 
    screen.blit(pygame.image.load('images\\arena.png'), (0,0)) 
    atks.draw(screen) 

    chars.draw(screen) 

    pygame.display.update() 
    CLOCK.tick(75) 
    pygame.event.pump() 

メイン()

答えて

0

これは1つの方法です。まず、元画像のコピーをSwordクラスに保存し、stabbingという属性を付けます。 stab()を呼び出すと画像が回転し、self.stabbing = Trueに設定されます。今度はupdateメソッドでは、それがまだ刺さっている場合はself.stabtimeをデクリメントし、<= 0の場合は画像と角度をリセットします。

SWORD_IMAGE = pygame.image.load('images\\sword.png').convert() 

class Sword(pygame.sprite.Sprite): 

    def __init__(self, x1, y1, angle=-25, stabtime=30): 
     super().__init__() 
     self.angle = angle 
     self.image = pygame.transform.rotate(SWORD_IMAGE, self.angle) 
     self.orig_image = self.image 
     self.rect = self.image.get_rect(topleft=(x1, y1)) 
     self.stabtime = stabtime 
     self.stabbing = False 

    def update(self): 
     if self.stabbing: 
      if self.stabtime <= 0: 
       self.reset_stab() 
      self.stabtime -= 1 

    def stab(self): 
     self.angle = -65 
     self.image = pygame.transform.rotate(self.orig_image, self.angle) 
     self.stabbing = True 

    def reset_stab(self): 
     self.stabtime = 30 
     self.image = self.orig_image 
     self.angle = -25 
     self.stabbing = False 

サイドノート:

一度だけ世界的にそれらをロードして、プログラムでそれらを再利用し、whileループ内部のハードディスクから何度も何度もイメージをロードしないでください。また、パフォーマンスを向上させるために、convert()またはconvert_alpha()の方法で画像を変換します。

pygame.key.get_pressed()を複数回呼び出すことはできません。whileループで呼び出すと、keyタプルが必要なオブジェクトに渡されます。

+1

私はそれを(サイドノートと一緒に)高く評価しますが、私はいつ何がより良くできるのかを知りたいのです。私はそれを動作させるようにしましたが、私はこれを実装しようとしています、それはもっときれいであるようです。再度、感謝します! :) –

関連する問題