pytmx를 이용하여 tmx파일 읽어오기

asset은 Tiled 프로그램내의 샘플을 이용(http://www.mapeditor.org)

 

<실행화면>

 

<소스코드>

# -*- coding: utf-8 -*-
#
#	tmx_file_load.py
#	coding with python 3.5.3
#
#	http://codememo.tistory.com
#

import sys
import os
import pygame
import pytmx

pygame.init()
display = pygame.display.set_mode((512, 368))
pygame.display.set_caption("tmx file load")

tmx_data = pytmx.load_pygame("smw_background.tmx")

clock = pygame.time.Clock()

running = True

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

		if event.type == pygame.KEYDOWN:
			if event.key == pygame.K_ESCAPE:
				running = False
	
	display.fill((0, 96, 184))
	
	for layer in tmx_data.visible_layers:
		for x, y, gid, in layer:
			tile = tmx_data.get_tile_image_by_gid(gid)
			if tile:
				display.blit(tile, (x * tmx_data.tilewidth, y * tmx_data.tileheight))

	pygame.display.update()
	clock.tick(60)

 

<첨부파일>

tmx_file_load.zip

 

http://codememo.tistory.com/18 의 코드를 이용하기

 

<실행화면>

 

 

<소스코드>

# -*- coding: utf-8 -*-
#
#	rotation_ship_by_mouse_and_bullet.py
#	coding with python 3.5.3
#
#	http://codememo.tistory.com
#

import sys
import os
import math
import pygame

screen_width = 640
screen_height = 480
FPS = 60

class Background(pygame.sprite.Sprite): # Background
	def __init__(self):
		super().__init__()
		self.image = pygame.image.load("background.jpg")
		
	def update(self):
		self.rect = self.image.get_rect()
		
class Ship(pygame.sprite.Sprite): # ship
	def __init__(self):
		super().__init__()
		self.original_image = pygame.image.load("ship.png")
		self.angle = 0
		
	def update(self):
		mouse_x = pygame.mouse.get_pos()[0]
		mouse_y = pygame.mouse.get_pos()[1]
		
		self.angle = math.pi - math.atan2(mouse_x - int(screen_width / 2), mouse_y - int(screen_height / 2))
		self.image = pygame.transform.rotate(self.original_image, -(int(math.degrees(self.angle))))
		
		self.rect = self.image.get_rect()
		self.rect.center = (int(screen_width / 2), int(screen_height / 2))

class Bullet(pygame.sprite.Sprite): # Bullet
	def __init__(self):
		super().__init__()
		
		self.bullet_image = pygame.image.load("bullet.png")
		
		mouse_x = pygame.mouse.get_pos()[0]
		mouse_y = pygame.mouse.get_pos()[1]		
		self.angle = math.pi - math.atan2(mouse_x - int(screen_width / 2), mouse_y - int(screen_height / 2))
		self.image = pygame.transform.rotate(self.bullet_image, -(int(math.degrees(self.angle))))
		
		self.speed = 10
		self.x = 0
		self.y = 0
		
	def update(self):
	
		self.x += self.speed * math.sin(self.angle)
		self.y -= self.speed * math.cos(self.angle)
		
		self.rect = self.image.get_rect()
		self.rect.center = (int(screen_width / 2) + self.x, int(screen_height / 2) + self.y)
		
def main():
	screen = pygame.display.set_mode([screen_width, screen_height], 0, 32)
	pygame.display.set_caption("Rotation ship by mouse and Bullet")

	background = Background()
	ship = Ship()
	
	background_sprites_list = pygame.sprite.Group(background)
	all_sprites_list = pygame.sprite.Group(ship)
	
	bullet_list = pygame.sprite.Group()
	
	clock = pygame.time.Clock()
	running = True	

	while running:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				running = False
				pygame.quit()
				sys.exit()
				
			if event.type == pygame.KEYDOWN:
				if event.key == pygame.K_ESCAPE:
					running = False
		
		if running:
			
			key = pygame.key.get_pressed()
				
			if key[pygame.K_SPACE]:
				bullet = Bullet()
				bullet_list.add(bullet)
		
		clock.tick(FPS)
		
		background_sprites_list.update()
		bullet_list.update()
		all_sprites_list.update()
		
		background_sprites_list.draw(screen)
		bullet_list.draw(screen)
		all_sprites_list.draw(screen)
		
		pygame.display.flip()
		
if __name__ == "__main__":
	main()

 

 

<이미지소스>

https://opengameart.org

 

<첨부파일>

rotation_ship_by_mouse_and_bullet.zip

 

http://codememo.tistory.com/18 에서 Layer 적용하기

 

# -*- coding: utf-8 -*-
#
#	rotation_ship_by_mouse_with_sprite&layer.py
#	coding with python 3.5.3
#
#	http://codememo.tistory.com
#

import sys
import os
import math
import pygame

screen_width = 640
screen_height = 480
FPS = 60

class Background(pygame.sprite.Sprite): # Background
	def __init__(self):
		super().__init__()
		self.image = pygame.image.load("background.jpg")

	def update(self):
		self.rect = self.image.get_rect()

class Ship(pygame.sprite.Sprite): # ship
	def __init__(self):
		super().__init__()
		self.original_image = pygame.image.load("ship.png")
		self.mouse_angle = 0

	def update(self):
		mouse_x = pygame.mouse.get_pos()[0]
		mouse_y = pygame.mouse.get_pos()[1]
		
		self.mouse_angle = math.pi - math.atan2(mouse_x - int(screen_width / 2), mouse_y - int(screen_height / 2))
		self.image = pygame.transform.rotate(self.original_image, -(int(math.degrees(self.mouse_angle))))
				
		self.rect = self.image.get_rect()
		self.rect.center = (int(screen_width / 2), int(screen_height / 2))
		
def main():
	screen = pygame.display.set_mode([screen_width, screen_height], 0, 32)
	pygame.display.set_caption("Rotation ship by mouse with sprite")

	background = Background()
	ship = Ship()
	
	layer = pygame.sprite.LayeredUpdates()

	layer.add(background)
	layer.add(ship)
	
	clock = pygame.time.Clock()
	running = True	

	while running:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				running = False
				pygame.quit()
				sys.exit()
				
			if event.type == pygame.KEYDOWN:
				if event.key == pygame.K_ESCAPE:
					running = False
		
		clock.tick(FPS)

		layer.update()
		layer.draw(screen)

		pygame.display.flip()
		
if __name__ == "__main__":
	main()

http://codememo.tistory.com/16 를 Sprite를 이용하여 구현하기

 

# -*- coding: utf-8 -*-
#
#	rotation_ship_by_mouse_with_sprite.py
#	coding with python 3.5.3
#
#	http://codememo.tistory.com
#

import sys
import os
import math
import pygame

screen_width = 640
screen_height = 480
FPS = 60

class Background(pygame.sprite.Sprite): # Background
	def __init__(self):
		super().__init__()
		self.image = pygame.image.load("background.jpg")
		
	def update(self):
		self.rect = self.image.get_rect()

class Ship(pygame.sprite.Sprite): # ship
	def __init__(self):
		super().__init__()
		self.original_image = pygame.image.load("ship.png")
		self.mouse_angle = 0
		
	def update(self):
		mouse_x = pygame.mouse.get_pos()[0]
		mouse_y = pygame.mouse.get_pos()[1]
		
		self.mouse_angle = math.pi - math.atan2(mouse_x - int(screen_width / 2), mouse_y - int(screen_height / 2))
		self.image = pygame.transform.rotate(self.original_image, -(int(math.degrees(self.mouse_angle))))
				
		self.rect = self.image.get_rect()
		self.rect.center = (int(screen_width / 2), int(screen_height / 2))
		
def main():
	screen = pygame.display.set_mode([screen_width, screen_height], 0, 32)
	pygame.display.set_caption("Rotation ship by mouse with sprite")

	background = Background()
	ship = Ship()
	
	background_sprites_list = pygame.sprite.Group()
	background_sprites_list.add(background)
	
	all_sprites_list = pygame.sprite.Group()
	all_sprites_list.add(ship)
	
	clock = pygame.time.Clock()
	running = True	

	while running:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				running = False
				pygame.quit()
				sys.exit()
				
			if event.type == pygame.KEYDOWN:
				if event.key == pygame.K_ESCAPE:
					running = False
		
		clock.tick(FPS)
		
		background_sprites_list.update()
		all_sprites_list.update()

		background_sprites_list.draw(screen)
		all_sprites_list.draw(screen)

		pygame.display.flip()
		
if __name__ == "__main__":
	main()

<조건>

1. 640x480 사이즈의 윈도우를 사용한다.

2. 윈도우 중앙에 우주선을 띄운다.

3. 마우스 커서 방향으로 우주선이 회전한다.

 

<실행화면>

 

<소스 코드>

# -*- coding: utf-8 -*-
#
#	rotation_ship_by_mouse.py
#	coding with python 3.5.3
#
#	http://codememo.tistory.com
#

import sys
import os
import math
import pygame

screen_width = 640
screen_height = 480
FPS = 60

class Background(): # Background Image
	def __init__(self, screen):
		self.screen = screen
		self.background_image = pygame.image.load("background.jpg")
		
	def update(self):
		self.screen.blit(self.background_image, (0, 0))
		
class Ship(): # ship Image
	def __init__(self, screen, screen_width, screen_height):
		self.screen = screen
		self.screen_width = screen_width
		self.screen_height = screen_height
		self.ship_image = pygame.image.load("ship.png")
		self.mouse_angle = 0
	
	def update(self):
		mouse_x = pygame.mouse.get_pos()[0]
		mouse_y = pygame.mouse.get_pos()[1]
		
		self.mouse_angle = math.pi - math.atan2(mouse_x - int(self.screen_width / 2), mouse_y - int(self.screen_height / 2))
		rotation_ship_image = pygame.transform.rotate(self.ship_image, -(int(math.degrees(self.mouse_angle))))
		
		self.ship_image_pos = rotation_ship_image.get_rect()
		self.ship_image_pos.center = (int(screen_width / 2), int(screen_height / 2))
		self.screen.blit(rotation_ship_image, self.ship_image_pos)
		
def main():
	screen = pygame.display.set_mode([screen_width, screen_height], 0, 32)
	pygame.display.set_caption("Rotation ship by mouse")

	background = Background(screen)
	ship = Ship(screen, screen_width, screen_height)
	clock = pygame.time.Clock()
	running = True	

	while running:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				running = False
				pygame.quit()
				sys.exit()
				
			if event.type == pygame.KEYDOWN:
				if event.key == pygame.K_ESCAPE:
					running = False
		
		clock.tick(FPS)
		background.update()
		ship.update()
		pygame.display.flip()
		
if __name__ == "__main__":
	main()

 

<이미지 소스 출처>

https://opengameart.org

 

<소스파일>

rotation_ship_by_mouse.zip

/example/lib/lib1.py

/example/exam.py

 

위와 같은 경우 exam.py에서 lib1.py를 불러오기를 할 경우

 

1. sys.path.insert()함수를 사용하는 경우

import sys
sys.path.insert(0, '/example/lib')
import lib1

 

2. sys.path.insert()함수를 사용하지 않는 경우

from lib import lib1

 

3. sys.path.insert()함수를 사용하지 않고 lib1.py의 Class1 클래스를 불러오기를 할 경우

from lib.lib1 import Class1

 

[참고]

http://ngee.tistory.com/157

http://hashcode.co.kr/questions/962

PyInstaller는 Python으로 작성된 파일을 독립 실행형 파일로 만들어 주는 프로그램이다.

  • 지원하는 OS : Windows, Linux, Mac OS X, FreeBSD, Solaris, AIX
  • 지원하는 Python 버전: 2.7, 3.3~3.5 (2017년3월26일 현재)
  • 공식 홈페이지 : http://www.pyinstaller.org

 

<설치하기>

 

<사용하기>

  • 기본적인 사용 방법은 pyinstaller 파일이름.py을 입력하면 된다. (예:pyinstaller example.py)
  • -w(혹은 --windowed, --noconsole) 옵션을 사용하면 실행시 cmd창이 나타나지 않게 할 수 있다.(예:pyinstaller -w example.py)
  • -F(혹은 --onefile) 옵션을 사용하면 모듈 및 기타 실행에 필요한 관련 파일을 포함한 exe 파일로 만들 수 있다.(예:pyinstaller -F -w example.py)
  • 보다 자세한 옵션은 -h로 확인 가능하다.(예:pyinstaller -h)

+ Recent posts