(Sprite) 순천향대학교컴퓨터공학과 이상정 순천향대학교컴퓨터공학과 1 학습내용 소개 클래스 그룹클래스 충돌 블록수집게임예 게임레벨증가및점수표시 이동 순천향대학교컴퓨터공학과 2
소개 (sprite) 큰그래픽장면의부분으로사용되는단일 2차원이미지 => 쪽화면 게임의장면에서서로상호작용 ( 충돌등 ) 하는물체 => 캐릭터, 아바타 파이게임에서는일반적으로클래스로구현된객체 순천향대학교컴퓨터공학과 3 클래스 기본클래스 pygame.sprite.sprite(*groups): return Sprite 속성 Sprite.image 이미지 Sprite.rectrect 위치 모든게임객체 ( 물체 ) 들의기본클래스 (base class) Group 클래스와함께동작 생성자는그룹또는그룹의리스트를인수로전달 순천향대학교컴퓨터공학과 4
그룹클래스 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() 메소드호출 순천향대학교컴퓨터공학과 5 블록수집게임예 마우스로움직이는빨간블록이검은블록을수집하는예 검은블록, 빨간블록 ( 플레이어 ) 충돌후검은블록없어지고점수올라감 순천향대학교컴퓨터공학과 6
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) 순천향대학교컴퓨터공학과 7 다양한모양의생성예 # 타원의이미지와색지정 # 검은타원생성 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, 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() 순천향대학교컴퓨터공학과 8 # 외계인블록생성 block = Block("alien.png") # UFO 블록생성 player = Block("ufo.png")
그룹생성 전체객체를갖는그룹생성 검은블록의그룹 플레이어를포함한모든그룹 # 그룹생성, 검은블록의그룹 block_list = pygame.sprite.group() # 그룹생성, 플레이어 ( 빨간블록 ) 를포함한모든그룹 all_sprites_list = pygame.sprite.group() 순천향대학교컴퓨터공학과 9 그룹에추가 각그룹에추가 그룹에 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) 순천향대학교컴퓨터공학과 10
충돌 (1) 한와그룹내간의충돌조사 pygame.sprite.spritecollide(sprite, group, dokill, collided = None): return Sprite_list sprite와 group 내의간의충돌조사 dokill 인수가 True이면충돌된가그룹에서제거 collided d 인수는두의충돌여부를계산하는 callback 함수 생략되면영역이 rect 값을가지고, 이를충돌계산에적용 충돌한들의리스트리턴 순천향대학교컴퓨터공학과 11 충돌 (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) 순천향대학교컴퓨터공학과 12
블록수집게임코드 (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() 순천향대학교컴퓨터공학과 13 # 윈도우설정 screen_width=700 screen_height=400 screen=pygame.display.set_mode([screen_width, screen_height]) # 그룹생성, 검은블록의그룹 block_list = pygame.sprite.group() # 그룹생성, 플레이어 ( 빨간블록 ) 를포함한 # 모든그룹 all_sprites_list = pygame.sprite.group() 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] 순천향대학교컴퓨터공학과 14 clock.tick(20) pygame.display.flip() pygame.quit()
시험주행 순천향대학교컴퓨터공학과 15 블록수집게임 - 게임레벨증가 모든블록을수집했으면레벨상승 레벨에따라새로운블록추가 # 플레이어블록과충돌하는블록조사 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) 순천향대학교컴퓨터공학과 16
블록수집게임 - 게임점수표시 윈도우에점수와레벨표시 # 텍스트폰트생성 font = pygame.font.font("nanumgothicbold.ttf", 25) # 충돌된블록수조사하여점수조정 if len(blocks_hit_list) > 0: score +=len(blocks_hit_list) # 점수및레벨텍스트표시 text=font.render(" 점수 : "+str(score), True, black) screen.blit(text, [10, 10]) text=font.render(" 레벨 : "+str(level), True, black) screen.blit(text, [10, 40]) 순천향대학교컴퓨터공학과 17 블록수집코드 레벨증가및점수표시 (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() 순천향대학교컴퓨터공학과 18 # 윈도우설정 screen_width=700 screen_height=400 screen=pygame.display.set_mode([screen_width, screen_height]) # 그룹생성, 검은블록의그룹 block_list = pygame.sprite.group() # 그룹생성, 플레이어 ( 빨간블록 ) 를포함한 # 모든그룹 all_sprites_list = pygame.sprite.group() 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("nanumgothicbold.ttf", 25) score = 0 level = 1 while done==false: for event in pygame.event.get(): event get(): if event.type == pygame.quit: done=true screen.fill(white) # 현재마우스위치읽어서플레이어블록객체의 # 위치로지정 순천향대학교컴퓨터공학과 19 # 플레이어블록과충돌하는블록조사 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(" 점수 : "+str(score), True, black) screen.blit(text, [10, 10]) text=font.render(" 레벨 : "+str(level), True, black) screen.blit(text, [10, 40]) clock.tick(20) k(20) pygame.display.flip() pygame.quit() 순천향대학교컴퓨터공학과 20
시험주행 순천향대학교컴퓨터공학과 21 이동 가위에서아래로이동 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() 순천향대학교컴퓨터공학과 22
블록수집코드 블록이동 (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() 순천향대학교컴퓨터공학과 23 # 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.group() all_sprites_list = pygame.sprite.group() 블록수집코드 블록이동 (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("nanumgothicbold.ttf", 25) score = 0 level = 1 순천향대학교컴퓨터공학과 24 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(" 점수 : "+str(score), True, black) screen.blit(text, [10, 10]) text=font.render(" 레벨 : "+str(level), True, black) screen.blit(text, [10, 40]) 순천향대학교컴퓨터공학과 25 시험주행 순천향대학교컴퓨터공학과 26
과제 1. 앞에서소개된블록수집프로그램을작성하고실행 2. 앞에서배운내용을활용한임의의프로그램작성 프로그램설명 프로그램소스 실행결과 순천향대학교컴퓨터공학과 27