6回目:pygameでゲームを作成する|スプライトをつかい主人公を動かす方法

スプライトというのは、背景画像以外の動く画像などを指すということは前回説明しました。

 

今回は、背景画像と主人公画像を表示して、主人公のほうを動かしてみます。

 

まずは背景画像を表示させる

ソースコード


#-*- coding utf-8 -*-
import pygame
from pygame.locals import*
import sys

(h,w)=(480,680)

pygame.init()
screen=pygame.display.set_mode((w,h))
pygame.display.set_caption("背景画像の出力")

BackgroundImg=pygame.image.load("b.jpg").convert()

while(1):
 screen.blit(BackgroundImg,(0,0))
 pygame.display.update()
 
 for event in pygame.event.get():
  if event.type==QUIT:
   sys.exit()

 

これは普通に、前回までの知識で作成することができますが、スプライトを使用するには「クラス」の考え方が必要となりかなり難しいです。

 

スプライトを使い主人公を作成する

ソースコード


#-*- coding utf-8 -*-
import pygame
from pygame.locals import*
import sys

(h,w)=(480,680)

class Sprite1(pygame.sprite.Sprite):		#pygame.sprite.Spriteはスプライトクラス
  def __init__(self,filename,x,y):	#Sprite1を呼び出したときに最初呼び出されるメゾット
   pygame.sprite.Sprite.__init__(self)
   self.image=pygame.image.load(filename).convert_alpha()	#画像情報をself.imageとする
   width=self.image.get_width()			#画像の横幅
   height=self.image.get_height()
   self.rect=Rect(x,y,width,height)		#x,yは座標

  def draw(self,screen):			#描写するメゾット
   screen.blit(self.image,self.rect)

def main():		#main関数
 pygame.init()
 screen=pygame.display.set_mode((w,h))
 pygame.display.set_caption("スプライトの生成")

 BackgroundImg=pygame.image.load("b.jpg").convert()

 SyuzinkoImg=Sprite1("a.jpg",0,0)	#スプライトの作成

 while(1):
  screen.blit(BackgroundImg,(0,0))

  SyuzinkoImg.draw(screen)	#スプライトの描写

  pygame.display.update()
 
  for event in pygame.event.get():
   if event.type==QUIT:
    sys.exit()

if __name__ == "__main__":	#main関数を呼び出し
    main()

 

シンプルに画像を設置するだけですが、かなり難しい文です。

 


class Sprite1(pygame.sprite.Sprite):		#pygame.sprite.Spriteはスプライトクラス
  def __init__(self,filename,x,y):	#Sprite1を呼び出したときに最初呼び出されるメゾット
   pygame.sprite.Sprite.__init__(self)	#Spriteを継承させる
   self.image=pygame.image.load(filename).convert_alpha()	#画像情報をself.imageとする
   width=self.image.get_width()			#画像の横幅
   height=self.image.get_height()
   self.rect=Rect(x,y,width,height)		#x,yは座標

  def draw(self,screen):			#描写するメゾット
   screen.blit(self.image,self.rect)

 

これがクラスです。

 


 SyuzinkoImg=Sprite1("a.jpg",0,0)	#スプライトの作成
 SyuzinkoImg.draw(screen)	#スプライトの描写

 

これで、スプライトクラスを呼び出します。

 

drawメゾットに動きを加えるとこうなります。

 


#-*- coding utf-8 -*-
import pygame
from pygame.locals import*
import sys

(h,w)=(480,680)

class Sprite1(pygame.sprite.Sprite):		#pygame.sprite.Spriteはスプライトクラス
  def __init__(self,filename):			#Sprite1を呼び出したときに最初呼び出されるメゾット
   pygame.sprite.Sprite.__init__(self)
   self.image=pygame.image.load(filename).convert_alpha()	#画像情報をself.imageとする
   width=self.image.get_width()			#画像の横幅
   height=self.image.get_height()
   self.rect=self.image.get_rect()		#x,yは座標
   

  def draw(self,screen):			#描写するメゾット
   pressed_keys=pygame.key.get_pressed()
   if pressed_keys[K_LEFT]:
    self.rect.move_ip(-1,0)
   if pressed_keys[K_RIGHT]:
    self.rect.move_ip(1,0)
   if pressed_keys[K_UP]:
    self.rect.move_ip(0,-1)
   if pressed_keys[K_DOWN]:
    self.rect.move_ip(0,1)

   self.rect=self.rect.clamp(Rect(0,0,w,h))	#画面外に行かないようにするため
   screen.blit(self.image,self.rect)



def main():		#main関数
 pygame.init()
 screen=pygame.display.set_mode((w,h))
 pygame.display.set_caption("スプライトの生成")

 BackgroundImg=pygame.image.load("b.jpg").convert()

 SyuzinkoImg=Sprite1("a.jpg")	#スプライトの作成


 while(1):

  screen.blit(BackgroundImg,(0,0))

  SyuzinkoImg.draw(screen)	#スプライトの描写

  pygame.display.update()
 
  for event in pygame.event.get():
   if event.type==QUIT:
    sys.exit()

if __name__ == "__main__":	#main関数を呼び出し
    main()

 

これで動かすことができるようになりました。

 

まとめ

クラスの概念はかなりめんどくさかったです。

 

しかし、使えるようになるとプログラミングが効率よく正確にできるようになるので、覚えるのは必須でしょう。

 

pythonだけでなくjavaなどでもクラスの考え方を使うので、かなり幅広く役にたちます。

 

参考サイト

スプライトの使い方