7回目:pygameでゲームを作成する|スプライトグループを作成 歩行するキャラクター

前回はスプライトを作成しましたが、今回はその作成したスプライトをグループにまとめていきたいと思います。

 

スプライトグループを作る

ソースコード


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

(w,h)=(640,480)

class Sprite1(pygame.sprite.Sprite):
 def __init__(self,filename,x,y):
  pygame.sprite.Sprite.__init__(self)
  self.image=pygame.image.load(filename).convert_alpha()
  width=self.image.get_width()
  height=self.image.get_height()
  self.rect=Rect(x,y,width,height)
 
def main():
 pygame.init()
 screen=pygame.display.set_mode((w,h))
 pygame.display.set_caption("スプライトグループの作成")
 BackgroundImg=pygame.image.load("b.jpg").convert()
 
 Img1=Sprite1("a.jpg",0,0)
 Img2=Sprite1("a.jpg",100,50)
 Img3=Sprite1("a.jpg",500,300)
 
 group=pygame.sprite.RenderUpdates()	#グループの作成
 group.add(Img1)
 group.add(Img2)
 group.add(Img3)
 
 while(1):
  screen.blit(BackgroundImg,(0,0))
  group.draw(screen)			#グループをいっきに表示
  pygame.display.update()
  
  for event in pygame.event.get():
   if event.type==QUIT: 
    sys.exit()

if __name__=="__main__":
 main()
 

これで、3つの画像を違う座標に出力しました。

 

たくさんの画像を使いたいというときは、グループにすると効率よくプログラムができます。

 

歩いているキャラクターを作成する

前回までは止まっているキャラクターを作成しました。

 

今回は、動いているキャラクターを作成していきます。

 

キャラクターチップを使います。

 

これは、ピクセルごとに分割して使います。

 

この画像は「96×128」で「3人×4人」なので「一人あたり32×32」で表されます。

 

とりあえず今回は前を向いている状態で足踏みのような事をするので、使う範囲は「横92ピクセル、縦32ピクセル」の3人です。

 


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

(w,h)=(640,480)
RECT=Rect(0,0,w,h)

def load_image(filename,colorkey=None):		#filenameからイメージを取得
 image=pygame.image.load(filename).convert()
 if colorkey is not None:	#画像の透明色が設定されていたら
   if colorkey is -1:
     colorkey=image.get_at((0,0))	#透明色にする
   image.set_colorkey(colorkey,RLEACCEL)
 return image

def split_image(image):	#画像を配列に分ける
 imageList=[]		#配列を作成
 for i in range(0,96,32):	#0~96を32ずつ進む(3回繰り返す)
  surface=pygame.Surface((32,32))	#カラのfurefacを作成
  surface.blit(image,(0,0),(i,0,32,32))	#(0,0)は画像の左上の場所 iはimageのx座標、0はy座標、32がwidthとheight
  surface.convert()		#ピクセル形式を変更
  imageList.append(surface)	#imageListに加える

 return imageList

#----------------charaクラス----------------------------------------------------
class chara(pygame.sprite.Sprite):	#引数はSpirite.imageとSpirite.rect
 anime=12	#アニメーション速度
 frame=0
 def __init__(self,filename,x,y):	#filenameにSpirite.image、x,yにSpirite.rect
  pygame.sprite.Sprite.__init__(self,self.containers)
  self.images=split_image(load_image(filename))	#split_imageを呼び出し画像の配列をself.imagesに返す。
  self.image=self.images[0]			#最初の画像
  self.rect=self.image.get_rect(topleft=(x,y))	#self.imageの座標
 def update(self):
  self.frame+=1		#次のフレーム
  self.image=self.images[self.frame//self.anime%3]	#1/12/3=0,2/12/3=0…12/12/3=1 次のフレームに対応する配列番号
#↑//は整数の割り算 
#--------------------------------------------------------------------------------

def main():
 pygame.init()
 screen=pygame.display.set_mode(RECT.size)
 pygame.display.set_caption("キャラクターアニメーション")
 
 backImg=pygame.image.load("b.jpg").convert()
 
 spirit=pygame.sprite.RenderUpdates()	#pygame.sprite.RnderUpdates()を短くする
 chara.containers=spirit
 player=chara("c.png",100,100)		#charaクラスを呼び出す

 clock=pygame.time.Clock()
 while(1):
  clock.tick(60)	#1秒間に60回フレームが更新
  screen.blit(backImg,(0,0))
 
  spirit.update()	#updateする(配列から新たに次の画像を取得)
  spirit.draw(screen)	#imageに格納されてある画像を出力
  pygame.display.update()

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

if __name__=="__main__":
 main()

 

かなり難しかったですが、少しずつ調べながらなんとかできました。

 

背景色の設定がいまいち理解できなかったので、photoshopで背景を透明にしてからやりたいと思います。

 

(最終的には、pythonの方で透明化できるようにはしますが。)

まとめ

今回はかなり難しかったですが、プログラミングをしている!!という実感がもてたので私的には楽しかったです。

 

次は、移動させてみたいと思います。(かなり難しそうですが)

 

参考サイト

キャラクターアニメーション