(Computer Science with Python and Pygame, Ch.14 introduction to Sprites) 순천향대학교컴퓨터공학과이상정 순천향대학교컴퓨터공학과 1 학습내용 스프라이트클래스 그룹클래스 스프라이트충돌 블록수집게임예 게임레벨증가및점수표시 스프라이트이동 순천향대학교컴퓨터공학과 2
(1) 스프라이트 (sprite) 큰그래픽장면의부분으로사용되는단일 2차원이미지 쪽화면 순천향대학교컴퓨터공학과 3 (2) 순천향대학교컴퓨터공학과 4
스프라이트클래스 스프라이트기본클래스 pygame.sprite.sprite(*groups): return Sprite 속성 Sprite.image 스프라이트이미지 Sprite.rectrect 스프라이트위치 모든게임오브젝트 ( 물체 ) 들의기본클래스 Group 클래스와함께동작 생성자는그룹또는그룹의리스트를인수로전달 순천향대학교컴퓨터공학과 5 그룹클래스 pygame.sprite.group(*sprites): return Group 스프라이트들의컨테이너 (container) 클래스 메소드 Group.add(*sprites): return None 그룹에스프라이트를추가 Group.remove(*sprites): return None 그룹에서스프라이트를제거 Group.draw(Surface): return None Surface에포함된스프라이트를그리기 Group.update(*args): return None 그룹내모든스프라이트의 update() 메소드호출 그룹클래스 Group 클래스를상속하는그룹클래스 GroupSingle: 가장최근에추가된스프라이트만표현 RenderPlain: draw() 메소드가스크린에모든스프라이트를그리기 순천향대학교컴퓨터공학과 6
블록수집게임예 마우스로움직이는빨간블록이검은블록을수집하는예 검은블록스프라이트, 빨간블록스프라이트 ( 플레이어 ) 충돌검은블록없어지고점수올라감 순천향대학교컴퓨터공학과 7 Block 클래스정의 Sprite 클래스를상속받아블록을정의하는클래스 블록의색과크기를생성자인수로전달 # 블록을정의하는클래스 # Sprite 부모클래스를상속 class Block(pygame.sprite.Sprite): # 블록의색과크기를생성자인수로전달 def init (self, color, width, height): # 부모클래스생성자호출 pygame.sprite.sprite. init (self) i i i # 블록의이미지와색지정 self.image = pygame.surface([width, height]) self.image.fill(color) # 이미지크기의 rect 객체지정 self.rect = self.image.get_rect() # 빨간블록생성 player = Block(red, 20, 15) 순천향대학교컴퓨터공학과 8
다양한모양의스프라이트생성예 # 타원의이미지와색지정 # 검은타원생성 self.image = pygame.surface([width, height]) self.image.fill(white) self.image.set_colorkey(white) pygame.draw.ellipse(self.image,color,[0,0,width,height]) # 빨간타원생성 player = Block(red, 20, 15) def init (self, color, filename): # 부모클래스생성자호출 pygame.sprite.sprite. init (self) # 블록의이미지와색지정 self.image = pygame.image.load(filename).convert() self.image.set_colorkey(black) # 이미지크기의 rect 객체지정 self.rect = self.image.get_rect() 순천향대학교컴퓨터공학과 9 # 외계인블록생성 block = Block(black, "alien.png") # UFO 블록생성 player = Block(red, "ufo.png") 스프라이트그룹생성 전체스프라이트객체를갖는스프라이트그룹생성 RenderPlain 그룹생성 draw() 메소드가스크린에모든스프라이트를그림 검은블록의스프라이트그룹 플레이어를포함한모든스프라이트그룹 # 스프라이트그룹생성, 검은블록의스프라이트그룹 block_list = pygame.sprite.renderplain() # 스프라이트그룹생성, 플레이어 ( 빨간블록 ) 를포함한모든스프라이트그룹 all_sprites_list = pygame.sprite.renderplain() 순천향대학교컴퓨터공학과 10
그룹에스프라이트추가 각그룹에스프라이트추가 그룹에 50개의블록객체추가 위치는랜덤으로지정 for i in range(50): # 블록들의위치를랜덤생성 block.rect.x = random.randrange(screen_width) randrange(screen block.rect.y = random.randrange(screen_height) # 스프라이트그룹에블록객체추가 block_list.add(block) list all_sprites_list.add(block) # 플레이어 ( 빨간블록 ) 생성 player = Block(red, 20, 15) all_sprites_list.add(player) 순천향대학교컴퓨터공학과 11 스프라이트충돌 (1) 한스프라이트와그룹내스프라이트간의충돌조사 pygame.sprite.spritecollide(sprite, group, dokill, collided = None): return Sprite_list sprite와 group 내의스프라이트간의충돌조사 dokill 인수가 True이면충돌된스프라이트가그룹에서제거 collided d 인수는두스프라이트의충돌여부를계산하는 callback 함수 생략되면스프라이트영역이 rect 값을가지고, 이를충돌계산에적용 충돌한스프라이트들의리스트리턴 순천향대학교컴퓨터공학과 12
스프라이트충돌 (2) # 플레이어블록과충돌하는블록조사 blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True) # 충돌된블록수조사하여점수조정 if len(blocks_hit_list) > 0: score +=len(blocks_hit_list) _ print( score ) # 모든스프라이트그리기 all_sprites_list.draw(screen) 순천향대학교컴퓨터공학과 13 블록수집게임코드 (1) import pygame import random black = ( 0, 0, 0) white = ( 255, 255, 255) red = ( 255, 0, 0) # 블록을정의하는클래스 # Sprite 부모클래스를상속 class Block(pygame.sprite.Sprite): # 블록의색과크기를생성자인수로전달 def init (self, it color, width, height): ht): # 부모클래스생성자호출 pygame.sprite.sprite. init (self) # 블록의이미지와색지정 self.image = pygame.surface([width, height]) self.image.fill(color) # 이미지크기의 rect 객체지정 self.rect = self.image.get_rect() pygame.init() 순천향대학교컴퓨터공학과 14 # 윈도우설정 screen_width=700 screen_height=400 screen=pygame.display.set_mode([screen_width, screen_height]) # 스프라이트그룹생성, 검은블록의스프라이트그룹 block_list = pygame.sprite.renderplain() # 스프라이트그룹생성, 플레이어 ( 빨간블록 ) 를포함한 # 모든스프라이트그룹 all_sprites_list = pygame.sprite.renderplain() for i in range(50): # 블록들의위치를랜덤생성 block.rect.x = random.randrange(screen_width) block.rect.y = random.randrange(screen_height) # 스프라이트그룹에블록객체추가 block_list.add(block) all_sprites_list.add(block)
블록수집게임코드 (2) # 플레이어블록 ( 빨간블록 ) 생성 player = Block(red, 20, 15) all_sprites_list.add(player) done=false clock=pygame.time.clock() score = 0 while done==false: for event in pygame.event.get(): if event.type == pygame.quit: done=true # 플레이어블록과충돌하는블록조사 blocks_hit_list = pygame.sprite.spritecollide (player, block_list, True) # 충돌된블록수조사하여점수조정 if len(blocks_hit_list) > 0: score +=len(blocks_hit_list) list) print( score ) # 모든스프라이트그리기 all_sprites_list.draw(screen) screen.fill(white) # 현재마우스위치읽어서플레이어블록객체의 # 위치로지정 pos = pygame.mouse.get_pos() mouse get pos() player.rect.x=pos[0] player.rect.y=pos[1] 순천향대학교컴퓨터공학과 15 clock.tick(20) pygame.display.flip() pygame.quit() 시험주행 순천향대학교컴퓨터공학과 16
블록수집게임 - 게임레벨증가 모든블록을수집했으면레벨상승 레벨에따라새로운블록추가 # 플레이어블록과충돌하는블록조사 blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True) # 모든블록을수집했으면레벨상승 if len(block_list) == 0: level += 1 # 레벨에따라새로운블록추가 for i in range(level * 10): # 블록들의위치를랜덤생성 block.rect.x = random.randrange(screen_width) block.rect.y = random.randrange(screen_height) # 스프라이트그룹에블록객체추가 block_list.add(block) all_sprites_list.add(block) 순천향대학교컴퓨터공학과 17 블록수집게임 - 게임점수표시 윈도우에점수와레벨표시 # 텍스트폰트생성 font = pygame.font.font(none, 36) # 충돌된블록수조사하여점수조정 if len(blocks_hit_list) > 0: score +=len(blocks_hit_list) # 점수및레벨텍스트표시 text=font.render("score: "+str(score), True, black) screen.blit(text, [10, 10]) text=font.render("level: "+str(level), True, black) screen.blit(text, [10, 40]) 순천향대학교컴퓨터공학과 18
블록수집코드 레벨증가및점수표시 (1) import pygame import random black = ( 0, 0, 0) white = ( 255, 255, 255) red = ( 255, 0, 0) # 블록을정의하는클래스 # Sprite 부모클래스를상속 class Block(pygame.sprite.Sprite): # 블록의색과크기를생성자인수로전달 def init (self, it color, width, height): ht): # 부모클래스생성자호출 pygame.sprite.sprite. init (self) # 블록의이미지와색지정 self.image = pygame.surface([width, height]) self.image.fill(color) # 이미지크기의 rect 객체지정 self.rect = self.image.get_rect() pygame.init() 순천향대학교컴퓨터공학과 19 # 윈도우설정 screen_width=700 screen_height=400 screen=pygame.display.set_mode([screen_width, screen_height]) # 스프라이트그룹생성, 검은블록의스프라이트그룹 block_list = pygame.sprite.renderplain() # 스프라이트그룹생성, 플레이어 ( 빨간블록 ) 를포함한 # 모든스프라이트그룹 all_sprites_list = pygame.sprite.renderplain() for i in range(50): # 블록들의위치를랜덤생성 block.rect.x = random.randrange(screen_width) block.rect.y = random.randrange(screen_height) # 스프라이트그룹에블록객체추가 block_list.add(block) all_sprites_list.add(block) 블록수집코드 레벨증가및점수표시 (2) # 플레이어블록 ( 빨간블록 ) 생성 pos = pygame.mouse.get_pos() player = Block(red, 20, 15) player.rect.x=pos[0] all_sprites_list.add(player) player.rect.y=pos[1] done=false clock=pygame.time.clock() # 텍스트폰트생성 font = pygame.font.font(none, 36) score = 0 level = 1 while done==false: for event in pygame.event.get(): t() if event.type == pygame.quit: done=true screen.fill(white) # 현재마우스위치읽어서플레이어블록객체의 # 위치로지정 순천향대학교컴퓨터공학과 20 # 플레이어블록과충돌하는블록조사 blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True) # 충돌된블록수조사하여점수조정 if len(blocks_hit_list) > 0: score +=len(blocks_hit_list) # 모든블록을수집했으면레벨상승 if len(block_list) == 0: level += 1 # 레벨에따라새로운블록추가 for i in range(level * 10): # 블록들의위치를랜덤생성 block.rect.x = random.randrange(screen_width)
블록수집코드 레벨증가및점수표시 (2) block.rect.y = random.randrange(screen_height) # 스프라이트그룹에블록객체추가 block_list.add(block) all_sprites_list.add(block) # 모든스프라이트그리기 all_sprites_list.draw(screen) # 점수및레벨텍스트표시 text=font.render("score: "+str(score), True, black) screen.blit(text, [10, 10]) text=font.render("level: "+str(level), True, black) screen.blit(text, [10, 40]) clock.tick(20) k(20) pygame.display.flip() pygame.quit() 순천향대학교컴퓨터공학과 21 시험주행 순천향대학교컴퓨터공학과 22
스프라이트이동 스프라이트가위에서아래로이동 Block 클래스에 update() 메소드추가 각프레임에서블록의 y 좌표증가 증가속도는레벨에따라커짐 블록이아래끝에도달하면 y 위치값을위로조정 class Block(pygame.sprite.Sprite): # y 좌표값리셋 def reset_pos(self): self.rect.y = random.randrange(-100,-10) self.rect.x = random.randrange(0,screen_width) def update(self, change_y): # 블록을아래로이동 self.rect.y += change_y if self.rect.y > screen_height: self.reset_pos() 순천향대학교컴퓨터공학과 23 블록수집코드 블록이동 (1) import pygame import random black = ( 0, 0, 0) white = ( 255, 255, 255) red = ( 255, 0, 0) # 블록을정의하는클래스 # Sprite 부모클래스를상속 class Block(pygame.sprite.Sprite): # 블록의색과크기를생성자인수로전달 def init (self, it color, width, height): ht): # 부모클래스생성자호출 pygame.sprite.sprite. init (self) # 블록의이미지와색지정 self.image = pygame.surface([width, height]) self.image.fill(color) # 이미지크기의 rect 객체지정 self.rect = self.image.get_rect() 순천향대학교컴퓨터공학과 24 # y 좌표값리셋 def reset_pos(self): self.rect.y = random.randrange(-100,-10) self.rect.x = random.randrange(0,screen_width) def update(self, change_y): # 블록을아래로이동 self.rect.y += change_y if self.rect.y > screen_height: self.reset_pos() pygame.init() it() # 윈도우설정 screen_width=700 screen_height=400 screen=pygame.display.set_mode([screen_width, screen_height]) # 스프라이트그룹생성 block_list = pygame.sprite.renderplain() all_sprites_list = pygame.sprite.renderplain()
블록수집코드 블록이동 (2) for i in range(50): # 블록들의위치를랜덤생성 block.rect.x = random.randrange(screen_width) randrange(screen block.rect.y = random.randrange(screen_height) # 스프라이트그룹에블록객체추가 block_list.add(block) all_sprites_list.add(block) # 플레이어블록 ( 빨간블록 ) 생성 player = Block(red, 20, 15) all_sprites_list.add(player) done=false clock=pygame.time.clock() # 텍스트폰트생성 font = pygame.font.font(none, 36) score = 0 level = 1 순천향대학교컴퓨터공학과 25 while done==false: for event in pygame.event.get(): t() if event.type == pygame.quit: done=true screen.fill(white) # 현재마우스위치를플레이어블록의위치로지정 pos = pygame.mouse.get_pos() player.rect.x=pos[0] player.rect.y=pos[1] # 플레이어블록과충돌하는블록조사 blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True) # 충돌된블록수조사하여점수조정 if len(blocks_hit_list) > 0: score +=len(blocks_hit_list) # 모든블록을수집했으면레벨상승 if len(block_list) == 0: level += 1 블록수집코드 블록이동 (3) # 레벨에따라새로운블록추가 for i in range(level l * 10): # 그룹내스프라이트 update() 메소드호출 # 이동속도는레벨값으로지정 block_list.update(level) # 블록들의위치를랜덤생성 block.rect.x = random.randrange(screen_width) block.rect.y = random.randrange(screen_height) # 스프라이트그룹에블록객체추가 block_list.add(block) all_sprites_list.add(block) clock.tick(20) pygame.display.flip() pygame.quit() # 모든스프라이트그리기 all_sprites_list.draw(screen) # 점수및레벨텍스트표시 text=font.render("score: "+str(score), True, black) screen.blit(text, [10, 10]) text=font.render("level: "+str(level), True, black) screen.blit(text, [10, 40]) 순천향대학교컴퓨터공학과 26
시험주행 순천향대학교컴퓨터공학과 27 과제 1. 앞에서소개된블록수집프로그램을작성하고실행 2. 앞에서배운내용을사용한임의의프로그램작성 프로그램설명 프로그램소스 실행결과 순천향대학교컴퓨터공학과 28