728x90
반응형
SMALL

애니메이션 이미지는 여러개의 이미지가 겹쳐진 gif 포맷으로 되어 있다

그 이미지를 파이썬에 적용하기 위해서는 gif 가 몇장의 이미지로 구성되어 있는지 확인을 해야한다.

[gif png, jpg 이미지 추출 방법]

gif 읽기 방법은 gif 의 이미지들 모두 읽어서 각각 리스트에 저장하고

 

다음 이미지를 한장씩 보여주면서 애니메이션이 재생되는 방식이다.

 

그래서 리스트에 gif 에 포함된 모든 이미지를 저장하고 index를 증가시키면서 다음이미지를 보여준다.

 

for 문과 PhotoImage 함수를 이용하여 gif 파일 안에 이미지를 하나씩 읽어 올 수 있다. 이때 중요한 부분은 format 설정임(아래 코드 참조)

 

dragon-gif.gif
0.43MB

 

from tkinter import * # tkinter에서 모든 정의를 임포트한다.


class LoadGIFImage:
	def __init__(self):
		window = Tk() # 윈도우 생성
		window.title("GIF Image Example") # 제목을 설정
		window.geometry("640x480") # 윈도우 크기 설정
		window.resizable(0,0)        
		self.canvas = Canvas(window, bg = "white")
		self.canvas.pack(expand=True,fill=BOTH)	
		
		self.my_image_number = 0 
		#마지막 range(60) 에서 60 은 gif 이미지 수를 나타냄
		#gif 파일의 이미지를 한장씩 읽고 리스트에 저장함
		self.myimages = [PhotoImage(file='dragon-gif.gif',format = 'gif -index %i' %(i)) for i in range(60)]
		
		
		#아래 코드에서 subsample(2) 는 이미지 크기를 작게함. 인수 값에 따라 작아짐
		#self.myimages = [PhotoImage(file='dragon-gif.gif',format = 'gif -index %i' %(i)).subsample(1) for i in range(60)]

		#이미지를 canvas에 그리고 id 값을 생성후 self.dragon 변수에 저장
		self.dragon = self.canvas.create_image(300,240, image = self.myimages[0],tags="dragon")

		self.canvas.create_text(320,360,font="Times 15 italic bold",text="Load GIF Image")

		while True:

			#canvas에서 self.dragon 이미지를 읽어오고 gif의 다음 이미지로 교체함
			self.canvas.itemconfig(self.dragon, image = self.myimages[self.my_image_number%len(self.myimages)])    

			self.my_image_number += 1
			window.after(33)
			window.update()

		#window.mainloop() # 이벤트 루프를 생성한다.


LoadGIFImage() # GUI 생성한다.

 

728x90
반응형
LIST
728x90
반응형
SMALL

아래 이미지, 사운드(효과음) 파일을 다운로드 받고 소스코드 폴더에 함께 복사한 후 실행시키기 바랍니다.

tank.png
0.14MB
tankmove.MP3
0.29MB

from tkinter import *
import pygame

class ObjectControlByKeyEvent:
    def __init__(self):
        window = Tk()
        window.title("키보드를 이용한 이미지 컨트롤")
        window.geometry("640x480")
        self.keys = set()
        self.canvas=Canvas(window, bg ="white")
        self.canvas.pack(expand=True, fill=BOTH)
        window.bind("<KeyPress>",self.keyPressHandler)
        window.bind("<KeyRelease>",self.keyReleaseHandler)
        
        self.tankimg = PhotoImage(file="tank.png").subsample(8)
        self.tank = self.canvas.create_image(320,240, image = self.tankimg,tags="tank")

        #Effect sound
        self.sounds = pygame.mixer
        self.sounds.init()
        self.s_effect1 = self.sounds.Sound("tankmove.mp3")
        
        self.canvas.create_text(320,350,font="Times 15 italic bold",text="← 또는 → 키를 입력하시오")
        self.canvas.create_text(320,450,font="Times 15 italic bold",text="Object Control By KeyEvent")

        while True:
            #
            self.display()
            window.after(33)
            window.update()

    def display(self):
        for key in self.keys:
            if key == 39: # right direction key                
                #self.s_effect1.play()
                self.canvas.move(self.tank, 5, 0)
            if key == 37: # left direction key                
                #self.s_effect1.play()
                self.canvas.move(self.tank, -5, 0)

    def keyReleaseHandler(self, event):
        if event.keycode in self.keys:
            #self.s_effect1.stop()
            self.keys.remove(event.keycode)

    def keyPressHandler(self,event):        
        self.keys.add(event.keycode)
        
ObjectControlByKeyEvent()
728x90
반응형
LIST
728x90
반응형
SMALL

파이썬에서 모든 이벤트 처리는 bind를 통해서 이루어진다. bind는 "묶다" 라는 의미로서 이벤트가 발생할 때 어떠 함수가 호출 되도록 할 것인지를 연결하는 역할을 합니다. 다른 언어에도 bind 이외에 다른 용어 또는 키워드를 사용하지만 동일한 의미를 가지고 있습니다.
 
파이썬에서 이벤트와 함수와의 연결은 아래와 같은 형식으로 작성을 합니다.
 

widget.bind("이벤트 종류",함수명)
 

위젯은 윈도우, 버튼, 라벨 등 을 작성하고 bind() 함수를 이용하여 위젯에 발생한 이벤트를 두번째로 작성된 함수명으로 전달을 합니다.  아래 코드는 window 위젯에 키 이벤트처리를 위한 기본 예제 코드입니다.

from tkinter import *


def keyPressHandler(event):
	print("Press: ",event.keycode)

def keyReleaseHandler(event):
	print("Release: ",event.keycode)

window = Tk()
window.geometry("640x480")

window.bind("<KeyPress>",keyPressHandler)
window.bind("<KeyRelease>",keyReleaseHandler)

window.mainloop()

키를 눌렀을 때 KeyPressHandler 함수가 호출되고 호출된 함수안에 작성된 print() 함수를 실행합니다(Line 4, 5). 이때 계속 누르고 있으면 연속으로 계속 호출되는 것이 아닌 키를 누르는 시점에 한 번 호출됩니다. 반대로 키를 떼는 순간 keyReleaseHandler() 함수를 호출합니다.
이벤트에 의해 호출되는 함수를 정의할 때는 항상 매개변수 1개를 선언해야 합니다. 매개변수의 역할은 이벤트가 발생할 때 이벤트에 대한 정보를 함께 함수로 전달하는데 이때 전달된 정보가 매개변수에 저장됩니다. 위 예제의 키 이벤트의 경우 어떤 키가 눌러졌는지 키 정보가 event 변수에 저장됩니다. 그리고 event.keycode는 눌러진 키의 아스키코드 값을 알 수 있습니다.
키보드 이외에 마우스와 같은 많은 이벤트들이 있으며 필요에 따라 직접 찾아서 사용해보기 바랍니다.
 
이제 키보드 이벤트 기능을 게임 기본구조 코드에 적용하도록 하겠습니다.
일반적으로 게임에서는 키 입력에 따른 콘텐츠를 조작을 위해 키보드 이벤트를 사용한다. 이때 2가지 중요한 이슈가 있는데,
 
첫번째는 2개 이상의 키입력을 어떻게 처리 할 것인가?
두번째는 이벤트 처리 시점 입니다.
 
2개 이상의 키를 눌렀을 때 눌러진 상태를 알려주는 친절한 프로그래밍 언어는 없습니다.(라이브러리에서 지원해주는 경우는 있음) 가령, 대각선 위(북동 방향)로 계속 이동하도록 프로그래밍을 한다고 가정을 하였을 때, →, ↑ 방향 키를 동시에 누르고 있으면 두 키가 눌러진 시점에서 이벤트만 한번이 발생하고 끝입니다. 아래와 같이 프로그래밍을 한다면 누르는 시점 한번만 이동하고 더이상 움직임이 없다는 것입니다.

def keyPressHandler(event):
	if (event.keycode==38):#아스키코드 38 는 ↑ 키
    	# 콘텐츠 위로 이동 코드
	elif (event.keycode==39):#아스키코드 39 는 → 키
    	# 콘텐츠 앞으로 이동 코드

그래서
1. 키 이벤트 발생한 시점에서 콘텐츠(이미지)의 이동 코드를 작성하면 안되고, 콘텐츠의 이동 코드는 다른 코드영역(무한루프 영역)에서 작성해야 합니다.
2. KeyPress 이벤트 처리 함수에는 어떤 키가 눌러졌는지에 대한 키 정보를 저장하는 코드를 작성합니다. 그리고 KeyRelease 에는 저장된 키 정보에서 떼어진 키를 삭제하는 코드를 작성합니다.
 
 
앞에 내용들을 포함하여 작성한 코드는 아래와 같습니다.

from tkinter import *

keys = set()

def keyReleaseHandler(event):
    if event.keycode in keys:
        keys.remove(event.keycode)

def keyPressHandler(event):
    keys.add(event.keycode)
        
window = Tk()
window.geometry("640x480")

window.bind("<KeyPress>",keyPressHandler)
window.bind("<KeyRelease>",keyReleaseHandler)                

while True:
	#
	if (len(keys)>0):
		print("Key: ", keys)
	#
	window.after(33)
	window.update()

눌러진 키 정보를 저장할 때는 파이썬 자료구조 중 집합인 set() 을 이용하였습니다. set() 의 경우 유일한 값만 가지기 때문에 동일한 키값을 입력해도 자동으로 하나로 처리가 되는 장점이 있습니다.
 
위 코드를 게임 기본 코드 구조에 적용하면 아래와 같습니다. 이벤트 처리 함수의 경우, 클래스 멤버함수이기 때문에 매개변수가 하나 더 추가 되며 두번째 매개변수에 이벤트 정보가 저장됩니다.

from tkinter import *

class KeyboardEvent:
    def __init__(self):
        window = Tk()
        window.title("키보드 이벤트")
        window.geometry("640x480")
        
        self.keys = set()
        self.canvas=Canvas(window, bg ="white")
        self.canvas.pack(expand=True, fill=BOTH)
        
        window.bind("<KeyPress>",self.keyPressHandler)
        window.bind("<KeyRelease>",self.keyReleaseHandler)                
        
        self.canvas.create_text(320,400,font="Times 15 italic bold",text="Key Event Example")
        
        while True:
            #
            if(len(self.keys)>0):
            	print("Key: ", self.keys)            
            #
            window.after(33)
            window.update()

    def keyReleaseHandler(self, event):
        if event.keycode in self.keys:
            self.keys.remove(event.keycode)

    def keyPressHandler(self,event):
        self.keys.add(event.keycode)

KeyboardEvent()
728x90
반응형
LIST
728x90
반응형
SMALL
from tkinter import *
import pygame

class GameSound:
	def __init__(self):
		window = Tk() # 윈도우 생성
		window.title("게임사운드") # 제목을 설정
		window.geometry("640x480") # 윈도우 크기 설정
		window.resizable(0,0)        
		
		
		self.canvas = Canvas(window, bg = "white")
		self.canvas.pack(expand=True,fill=BOTH)
		window.bind("<KeyPress>",self.keyPressHandler)
		window.bind("<KeyRelease>",self.keyReleaseHandler)

		#pygame 에서 music vs sound
		# music: 배경음악 재생을 위해 사용
		# sound: 효과음을 위해 사용

        #BG sound.
		pygame.init()
		pygame.mixer.music.load("bgm.wav") #Loading File Into Mixer
		pygame.mixer.music.play(-1) #Playing It In The Whole Device
		self.canvas.create_text(320,400,font="Times 15 italic bold",text="Sound Example")

		#Effect sound
		self.sounds = pygame.mixer
		self.sounds.init()
		self.s_effect1 = self.sounds.Sound("gunsound.mp3")
				
		while True:
			#
			window.after(33)
			window.update()

	def keyReleaseHandler(self, event):
		if event.keycode in self.keys:
		    self.keys.remove(event.keycode)

	def keyPressHandler(self, event):		
		self.s_effect1.play()
		self.keys.add(event.keycode)

GameSound()

tkinter에서는 사운드와 관련된 클래스 및 함수를 제공하지 않습니다.  그래서 코드에서는 pygame 모듈을 이용하여 사운드 재생방법을 설명을 하도록 하겠습니다. (앞서 설명된 게임 기본 코드 구조 위에서 추가된 내용들만 설명)

 

사운드의 종류는 크게 기본적으로 배경사운드, 이펙트사운드로 구분될 수 있습니다. 배경사운드는 게임의 전체적인 분위기를 담당하고 이펙트 사운드는 그 순간의 효과 또는 느낌(타격감, 행위(점프, 스피드업, 아이템 획득), 죽음 등)을 담당하며, 사운드를 게임의 진행에 있어서 필수적인 요소입니다. 그래서 위 코드에서는 배경사운드와 이펙트사운드의 재생 방법에 대해서 설명하도록 하겠습니다.

 

pygame에서 사운드 재생 방법은 music와 sound 이렇게 2가지를 제공하고 있습니다.

차이점은 music의 경우 하나의 재생만 가능하고 만약 다른 파일을 load() 해서 재생하면 기존 재생은 멈추게 되며, 반대로 sound 는 여러 개가 동시 재생이 가능하고 같은 사운드의 중첩해서 재생도 가능합니다.

그리고 music의 경우 파일이 저장된 장치(ssd 또는 hard disk 등)에서 재생을 하지만 sound의 경우 파일 전체를 메모리에 가져온 후 재생하게 됩니다. 즉 music은 큰 용량을 가진 음악 파일 재생에 유리하며 sound의 경우 작은 용량과 짧은 사운드(이펙트)에 유리합니다.

그러므로 music의 경우 배경사운드에 이용되고 sound의 경우 이펙트사운드에 사용합니다.

 

위 소스에 대한 주요 코드 설명은 아래와 같습니다.

  • pygame 모듈을 사용하기 위해 pygame을 import 한다.(line 2)
  • pygame을 사용하기 위해서는 pygame.init()함수를 호출해야한다.(line 21)
  • 위 코드에서 music.load(), music.play() 함수를 이용하여 배경음악을 무한반복 재생한다.(line 22, 23)
  • effect sound를 위해 sounds 를 초기화 한다.(line 28)
  • 이펙트 사운드 'gunsound.mp3'  파일을 읽고 sound 객체를 반환한다. sound 객체는 이펙트 사운드는 게임중 재생 및 멈춤을 컨트롤할 수 있다.
  • line 41에서 이펙트 사운드를 재생한다.

위 코드만으로 간단히 게임에서 필요한 음악 재생은 가능하며 좀 더 다양한 기능을 구현하기 위해서는 아래의 링크를 참조하기 바랍니다.

 

 

https://www.pygame.org/docs/ref/music.html

 

pygame.mixer.music — pygame v2.1.1 documentation

Resets playback of the current music to the beginning. If pause() has previoulsy been used to pause the music, the music will remain paused. Note rewind() supports a limited number of file types and notably WAV files are NOT supported. For unsupported file

www.pygame.org

https://www.pygame.org/docs/ref/mixer.html

 

pygame.mixer — pygame v2.1.1 documentation

begin sound playback play(loops=0, maxtime=0, fade_ms=0) -> Channel Begin playback of the Sound (i.e., on the computer's speakers) on an available Channel. This will forcibly select a Channel, so playback may cut off a currently playing sound if necessary.

www.pygame.org

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

1. 이미지 다운로드

   - 명령어: sudo docker pull nginx

2. 다운로드된 nginx 이미지 확인

3. nginx 실행

   - 명령어: docker container run --name webserver -d -p 8080:80 nginx

   - 아래와 같이 에러가 발생함 .^^;;

   - 위 에러의 문제점은 사용자가 /var/run/docker.sock 을 접근하려고 하였지만 권한이 없어 발생하는 문제라고 함

   - 사용자가 가지고 있는 권한 확인 방법: 명령어 id  입력

4. docker 에 사용자 권한 부여하기

   - 명령어: sudo usermod -a -G docker $USER

   - 명령어 내용:

          > usermode: 사용자 권한 할당 명령어

          > a : append 라는 의미

          > G: additional group

          > $USER: 사용자 아이디

   - 위 명령어 입력후 시스템 재시작 후 권한 확인하면 위와 다르게 docker에 대한 권한을 가졌음을 확인할 수 있다.

5. 다시 nginx 를 실행해 보자.

   - 명령어: docker container run --name webserver -d -p 8080:80 nginx

   - 정상적으로 완료되면 컨테이너 id를 확인할 수 있다.

6. Docker에서 실행중인 컨테이너를 확인

   - 명령어: sudo docker container ps

   - nginx가 실행되고 있음을 확인할 수 있다.

7. Nginx(웹서버) 동작확인

   - 우분투의 웹브라우저(Firefox, 우분투 화면의 왼쪽에 불꽃이 동그랗게 그려져 있는 아이콘)를 실행하여 127.0.0.1:8080 (또는 localhost:8080) 를 주소에 입력하자.

   - 아래와 같이 동작을 확인되면 성공~!!!

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

0. 도커(Docker) 사용이유

   - 도커는 컨테이너 라는 표준화된 형태로 패키징하고 이 컨텐이너 안에는 라이브러리, 시스템 도구, 코드, 등 소프트웨어를 실행하는데 필요한 모든 것들을 포함할 수 있다.

   - 도커를 통하여 이미지화 하고 이러한 이미지들은 배포 및 관리를 단순하고 쉽게 하게 한다.

   - 일반적으로 가상머신과 컨테이너(도커)를 비교하는데 차이점은 가상머신은 운영체제와 하드웨어까지 모두 가상화에 포함되기 때문에 무거우며 컨테이너(도커)는 운영체제 수준에서 가상화를 하기 때문에 가상머신 보다 가볍다.

 

1. Docker 설치 여부 확인 및 옛날 버전 삭제하기

   - 명령어: sudo apt-get remove docker-engine docker.io containerd runc

   - 그외 설치 관련 명령어 설명

      sudo apt-get update: 새로 추가되거나 변경된 패키지 정보를 업데이트 한다. 새로운 패키지 존재 여부확인을 위해  해야된다.

      sudo apt-get upgrade: 설치된 모든 패키지의 버전을 업그레이드 한다.

      sudo apt-get install [패키지 이름]: [패키지 이름]를 설치한다.

      sudo apt-get remove [패키지 이름]: [패키지 이름]를 삭제한다.

      sudo apt-get purge [패키지 이름]: 패키지 삭제와 동시에 관련된 모든 설정 파일을 함께 삭제한다.

      sudo apt-get autoremove: 불필요한 의존성을 가진 패키지를 모두 삭제한다. 이전에 설치된 패키지를 설치할 때 함  께 설치된 패키지들중 지금 더이상 사용하지 않는 패키지들을 삭제한다.      

2. 설치 가능한 패키지 정보 업데이트

   - 명렁어: sudo apt-get update

3. 필수패키지 설치

   - 명령어: sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

4. GPG Key 인증

   - 명령어: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 

   - 정상적으로 동작하면 OK 가 출력됨

5. Docker Repository 등록

   - 자신의 아키텍쳐에 맞춰서 Docker Repository를 등록해야됨

   - 아키텍쳐 확인 명령어: arch

   - 명령어:

          sudo add-apt-repository \
          "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
          $(lsb_release -cs) \
          stable"

정상 작동 결과

6. Docker 설치

   - 명령어: sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io

   - Docker 설치후 설치된 Docker 확인 명령어: docker -v

7. Docker Service 동작 유무 확인

   - 명령어: systemctl status docker 또는 service docker status

   - Docker 가 active 되어 동작하고 있는 것을 확인할 수 있다.

   - 타 블로그 내용에서 시스템 부팅시 Docker가 시작되도록 설정하는 내용들이 있는데, 설정 없이도 시스템 부팅시  docker가 기본적으로 시작되도록 설정되어 있음

   - 만약 부팅시 자동실행 설정을 해야된다면 아래 명령어를 사용하면 된다.

      명령어: sudo systemctl enable docker && service docker start

Docker 상태 출력결과(Ctrl + C 를 누르면 원래 명령어 입력 상태로 돌아감)

 

8. 서비스 관리 명령어 정리

   - service 명령어와 systemctl 명령어?: 실행결과는 같지만 service 명령어를 실행하면 결국 systemctl 명령어가 실행되어 동작하게 된다.

   - systemctl start [서비스명]: 서비스 시작

   - systemctl stop [서비스명]: 서비스 중지

   - systemctl status [서비스명] : 서비스 상태 확인(서비스 구동 유무 확인이 가능)

   - systemctl restart [서비스명] : 서비스 재시작

   - systemctl reload [서비스명] : 서비스를 중지하지 않고 설정 값을 반영

   - systemctl enable [서비스명] : 시스템이 재부팅하면 자동으로 서비스 실행하도록 등록

728x90
반응형
LIST
728x90
반응형
SMALL
from tkinter import *

class BasicForm:
    def __init__(self):
        window = Tk()
        window.title("기본폼")
        window.geometry("640x480")
        
        self.canvas=Canvas(window, bg ="white")
        self.canvas.pack(expand=True, fill=BOTH)

        self.canvas.create_text(320,440,font="Times 15 italic bold",text="Basic Form")
        
        while True:
            #
            window.after(33)
            window.update()


BasicForm()

위 코드와 이후 공유되는 코드들은 파이썬에서 GUI 개발 모듈인 tkinter 를 이용한 게임 제작에 필요한 몇가지 기능들을 구현한 내용입니다.

코드에 대한 설명은 기초적인 파이썬 문법과 클래스에 대한 이해와 사용이 가능하다는 가정하에 작성을 하도록 하겠습니다.

-------------------------------------------------------------------------------------------------------

파이썬에서 tkinter 모듈을 이용하여 GUI 기반의 윈도우 프로그래밍을 할 수 있다. tkinter 에서 가장 기본 단위를 위젯이라고 하며 위젯의 종류에는 버튼(button), 라벨(label), 콤보박스(combobox), 캔버스(canvas) 등 이 있다. 게임을 위해서는 이미지를 이용한 애니메이션이 기본이되며 이와 같은 기능 구현은 캔버스에서 가능하다. 그러므로 작성된 코드에는 사운드를 제외한 대부분의 기능들을 캔버스만을 이용한다.

 

그림 1. 게임 코드 영역

게임을 만들때 일반적으로 코드는 3가지 영역(준비, 무한루프, 이벤트처리)으로 구분되어 작성된다.

  1. 준비영역에서는 윈도우를 생성, 사운드 및 이미지 파일등의 리소스 파일 로딩, 그리고 게임에 필요한 변수들을 초기화하는 코드가 작성된다(line5 ~12). 
  2. 무한루프 영역에서는 게임이 실행되는 동안 변화되는 데이터, 이미지의 위치, 사운드 on / off 등에 대한 코드를 작성한다.(line 15~17)
  3. 마지막으로 이벤츠처리 영역에는 키 또는 마우스 입력이 있을 때 처리해야 될 코드(이미지 위치값 이동, 사운드 on/off등)를 작성한다.(위 예제코드에는 이벤트처리 영역이 미 작성됨)

준비영역은 최초 게임 코드가 시작될 시 한번만 실행되며, 무한루프 영역은 계속 반복해서 실행된다.(일반적으로 while 을 이용한 무한루프형식으로 작성됨) 이벤트처리 영역은 키 또는 마우스 입력이 있을 시 실행되고 실행이 끝나면 다시 무한루프 영역의 코드가 실행되며, 이러한 방식을 Event-based Programming 방식이라고 한다. 무한루프 영역에서 키 또는 마우스 입력이 있을 시 바로 이벤트처리 영역으로 이동하는 것이 아닌 루프영역에서 마지막 코드인 window.update() 함수 호출시 이벤트처리 영역으로 이동하여 코드가 실행된다.

 

준비 영역과 무한루프 영역에 대한 코드 설명은 아래와 같다.

  • 윈도우 프로그래밍에서 가장 먼저 해야될 일은 윈도우 만들기다. Tk 클래스를 이용하여 윈도우 창을 생성할 수 있다.(line 5) 그리고 title, geometry 함수를 이용하여 윈도우 이름과 크기를 설정한다. (line 6~7)
  • 다음으로 캔버스 객체를 생성하는데, 생성시 캔버스가 붙여질 윈도우를 인수로 작성한다.(line 9) 윈도우 틀이 만들어지고 그 앞에 캔버스를 붙인 후 캔버스 위에 원하는 위치에 이미지를 그릴 수 있는 것이다.

그림 2. 윈도우, 캔버스, 이미지 레이어 구조

  • 윈도우도 하나의 위젯으로 생각할 수 있는데 위젯 간에 서로 붙이기 위해서는 붙일 대상 위젯 지정(line 9)과 실제 붙이는 동작이 있어야 되며 그 중에 하나가 pack() 이라는 함수이다.(line 10) 옵션은 윈도우에 꽉차게 그리기 위해 expand를 true 그리고 fill=BOTH로 설정하였다.
  • 캔버스는 도화지 처럼 무엇이든 그릴 수 있는 함수를 제공하고 있다. 그 함수들의 이름은 "create_"로 시작되며 create_rectangle, create_oval, create_line, create_text, create_image 등 그리는데 필요한 다양한 함수들을 이용할 수 있다. 위 코드에서는 create_text() 함수를 이용하여 "Basic Form" 글자를 320, 400 위치에 작성한다.

그림 3. canvas 클래스에서 사용되는 다양한 create 함수들

  • 캔버스에 무언가를 그리기 위해서는 기준좌표와 기준점이 어디 인지 알아야 된다. 아래 그림은 width: 640, hegiht: 480 크기로 그려진 윈도우의 좌표를 보여준다. 윈도우의 기준좌표는 왼쪽 위가 되며 0, 0 의 좌표값을 가진다. 그리고 그려지는 글자는 글자크기의 가운데 위치가 기준점이 된다. 그래서 글자는 코드에서 작성된 320, 400 의 위치에 글자의 기준점이 맞춰서 그려지게 된다.

그림 4. 기준좌표와 기준점

  • 무한루프 영역에서는 윈도우 클래스의 after()와 update() 함수가 호출된다(line 16, 17). after() 에는 33 이 작성되어 있으며 33은 대기 시간(단위: ms) 나타낸다. 위 코드에서는 게임영상을 초당 30 프레임로 동작하게 하기위해 33 을 작성하였다. 마지막으로 update() 함수 호출시 변화된 내용의 반영과 앞서 설명된 키 또는 마우스 이벤트들이 처리된다.
  • 무한루프 영역에서 이미지의 위치 변경 코드가 작성되어 있으면 그 코드가 호출된 시점에서 바로 이미지의 위치변경이 되는 것은 아니다. 이미지의 위치변경 코드가 많을 경우 코드마다 바로 위치변경하여 화면에 보여주게 되면 컴퓨터가 많은 부하가 발생할 수 있다. 그렇게 때문에 변화된 내용들을 모아서 특정 시간 마다 한번에 처리하면 부하를 줄일 수 있다. 모든 게임에서 그래픽 애니메이션은 이러한 방식으로 처리됨을 명심하기 바란다.

앞서 설명된 내용들은 다른 프로그래밍 언어(c++, java, visual basic등)로 게임을 제작할 때도 동일한 영역과 동작방식을 가지고 있어서 위 내용들을 이해하면 다른 프로그래밍 언어를 이용한 게임제작도 쉽게 할 수 있다. 모든 게임 개발 및 동작을 위한 코드 구조가 위와 동일하다고 생각하면된다(Unity, UnReal Engine 역시 기본구조는 동일함).

이상으로 게임 기본구조에 대한 설명 끝~~!

 

코드 실행결과

728x90
반응형
LIST
728x90
반응형
SMALL

1. 파이썬 실행 구조의 이해

   ▶ 시작은 어디인가?
      - 모든 일의 행위는 시작이 있음

      - 프로그램의 실행은 컴퓨터가 일을 하는 행위

      - 일의 시작을 알려줘야 됨

   ▶ 명시적 시작 위치

      - 일반적인 프로그램 언어는 명시적으로 시작 위치가 정해져 있음

자바와 C언어에서의 시작 위치
   ▶ 파이썬 코드
      - 묵시적으로 시작위치를 설정함
      - 파이썬은 왼쪽에 있는 코드로 시작

2. 변수란 무엇인가?

   ▶ 값을 저장하는 저장공간
   ▶ 컴퓨터에게 저장공간을 만드는 명령어
      - 컴퓨터가 값이 저장된 공간을 구분하기 위해 변수 이름이 필요함

3. 변수의 종류

   ▶ 정수형: 10, 20, 1000, …
   ▶ 실수형: 1.2, 0.2, 10.4, …
   ▶ 문자열: 안녕’, ‘이름’, ‘ABCED’, '102425'
 

4. 변수 생성 방법과 출력하기

   ▶ 코드 작성
   - 작성방법: 변수 이름 = 값
   ▶ 출력결과

5. 변수의 사용

   ▶ 다른 값 저장하기

   ▶ 계산 값 저장하기
   ▶ 문자열, 실수 저장하기

6. 입력 함수

7. 변수 이름

   ▶ 의미 있는 이름을 사용
   ▶ 소문자 대문자가 서로 구분됨
   ▶ 변수 이름은 영문자, 숫자, 밑줄(_)만 가능함
   ▶ 변수 이름 중간에 공백 불가

 

8. 낙타체(Camel Case)

   ▶ 소문자로 적고 뒤에 붙는 단어의 첫 글자는 대문자로 작성

9. 상수(constant)

   ▶ 변하지 않고 항상 같은 값을 가지는 수

   ▶ 저장된 값을 변경할 수 없는 변수

   ▶ 파이썬에서는 모두 대문자로 작성한 변수를 상수로 약속함

 

10. 주석

   ▶ 소스코드에 설명 글 작성
   ▶ 코드 전체 설명을 위해 작성

 

728x90
반응형
LIST

'IT > 파이썬 문법' 카테고리의 다른 글

파이썬 sort, sorted 함수에 key, lambda 사용  (0) 2024.05.08
파이썬 sort, sorted 함수 차이  (0) 2024.05.08
파이썬 zip 함수 사용하기  (0) 2024.05.08
파이썬 map 함수  (0) 2024.05.08
파이썬 enumerate 함수  (0) 2024.05.04
728x90
반응형
SMALL

VMware 시작시 아래와 같이 에러 창이 나타난다면?

VMWare에서 하드웨드 세팅시 기본적으로 CD/DVD가 있다. 하지만 사용되는 컴퓨터에서 CD/DVD가 없는 경우 이와 같은 에러 창이 나타난다.

해결방법: 하드웨어 세팅에서 CD/DVD 를 제거하면된다.

 - Edit virtual machine settings 선택(왼쪽 그림)

 - CD/DVD(SATA) 선택(오른쪽 그림)

 - 아래 Remove 버튼 클릭(오른쪽 그림)

 - OK 버튼 클릭(오른쪽 그림)

 

에러 창 없이 잘 실행됨을 확인할 수 있다.^^

728x90
반응형
LIST
728x90
반응형
SMALL

1. 종료하기

   1.1 UI에서 종료하기

      - 아래 화면에서 오른쪽위 버튼 클릭

      - Pwer Off / Log Out 선택

      - Power Off... 선택

      - Power Off 팝업 창에서 Power Off 선택

  1.2 터미널에서 종료하기

      - Ctrl + Alt + T 키를 입력하여 터미널 실행한다.(왼쪽 그림)

      - sudo shutdown -h now 입력 후 엔터(오른쪽 그림)

      - 계정 비밀번호 입력 

 

2. 터미널 실행하기

   - 터미널이란 컴퓨터에 사용자가 명령을 할 수 있게 하는 인터페이스이다. 인터페이스는 명령어를 직접 입력할 수 있는 창으로 되어 있으며 그 창에 키보드를 이용하여 명령어들을 입력한다.

   - 1990년 말 윈도우 운영체제가 대중화 되고 대부분의 사람들은 GUI 인터페이스가 익숙하지한 90년 중반 이전에는 MS 도스 운영체제를 사용하고 Console 창을 이용하여 명령어를 직접 입력하고 이를 통하여 필요한 프로그램을 실행하였다.

MS 도스 운영체제에서 명령어 입력

   - 리눅스(우분투) 에서도 이와 동일하게 터미널을 이용하게 된다.

 

   2.1 UI에서 터미널 실행

      - 왼쪽아래에 3x3 그리드 형태의 아이콘 클릭

      - 맨 아래에 Ter...(원래는 Terminal) 으로 보이는 아이콘 클릭

      - 터미널 실행됨^^

   2.2 단축키로 터미널 실행

      - Ctrl + Alt + T 키를 누르면 터미널이 실행됨

3. 터미널 명령어

   - cd <directory 이름>: 디렉토리 위치 이동시 사용

   - ls : 현재 디렉토리에 있는 파일 및 폴더를 출력

   - cp <파일1> <파일2>: 파일1과 동일한 파일2를 만든다.

   - mkdir <디렉토리이름>: <디렉토리이름>의 폴더를 만든다.

   - rmdir <디렉토리이름>: <디렉토리이름>의 폴더를 삭제한다.

   - pwd: 현재 경로 출력

   - touch <파일명>: <파일명> 파일 생성

   

728x90
반응형
LIST

+ Recent posts