1장. 시작하기

Similar documents
Microsoft PowerPoint PythonGUI-sprite

Microsoft PowerPoint - 6-PythonGUI-sprite

UI TASK & KEY EVENT

PowerPoint Presentation

tkinter를 이용한 계산기 구현

gnu-lee-oop-kor-lec10-1-chap10

PowerPoint Presentation

Microsoft PowerPoint - gnu-w06-python_[실습]_day13-turtle-shape

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

슬라이드 1

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Javascript

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint 프레젠테이션

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

슬라이드 1

System Recovery 사용자 매뉴얼

슬라이드 1

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Infinity(∞) Strategy

Install stm32cubemx and st-link utility

JVM 메모리구조

Chapter 4. LISTS

UI TASK & KEY EVENT

Visual Basic 반복문

17장 클래스와 메소드

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

ATmega128

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - C++ 5 .pptx

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

게임 기획서 표준양식 연구보고서

4장기본프로그래밍2

슬라이드 1

슬라이드 1

Microsoft PowerPoint - web-part02-ch16-이벤트.pptx

PowerPoint Template

3D MAX + WEEK 9 Hansung Univ. Interior Design

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

쉽게 풀어쓴 C 프로그래밍

제11장 프로세스와 쓰레드

쉽게 풀어쓴 C 프로그래밍


Java ...

쉽게 풀어쓴 C 프로그래밍

Visual Basic 기본컨트롤

RVC Robot Vaccum Cleaner

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

03_queue

untitled

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 04-UDP Programming.ppt

<4D F736F F F696E74202D20C1A63036C0E520BCB1C5C3B0FA20B9DDBAB928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

두번째행에는사용자가작성한매크로를저장할파일이름을표시합니다. 다른저장된파일을읽어들이거나새로운파일로작성할때는 [ ] 버튼을눌러파일열기대화상자에서파일이름을선택하거나새로만들면됩니다. 만일새로운파일을열때는이전에작업중이던매크로는저장됩니다. 대화상자중앙에매크로목록이보이고매크로를기록하

지도상 유의점 m 학생들이 어려워하는 낱말이 있으므로 자세히 설명해주도록 한다. m 버튼을 무리하게 조작하면 고장이 날 위험이 있으므로 수업 시작 부분에서 주의를 준다. m 활동지를 보고 어려워하는 학생에게는 영상자료를 접속하도록 안내한다. 평가 평가 유형 자기 평가

쓰리 핸드(삼침) 요일 및 2405 요일 시간, 및 요일 설정 1. 용두를 2의 위치로 당기고 반시계방향으로 돌려 전날로 를 설정합니다. 2. 용두를 시계방향으로 돌려 전날로 요일을 설정합니다. 3. 용두를 3의 위치로 당기고 오늘 와 요일이 표시될 때까지 시계방향으로

제8장 자바 GUI 프로그래밍 II

MVVM 패턴의 이해

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

PowerPoint 프레젠테이션

SMV Vending Machine Implementation and Verification 김성민 정혁준 손영석

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

PowerPoint 프레젠테이션

슬라이드 1

윈도우즈프로그래밍(1)

Requirement Definition Wheel Motor 작동하는경우장애물인식후 - Ultrasonic Sensor 홀수번누를경우 +10 Touch Sensor 누를경우 TouchSensor 계속누르고있을경우 (0.5) +10 짝수번누를경우 -10 빛이어두워졌다다

Microsoft PowerPoint PythonGUI-network

슬라이드 1

Ver. DS-2012.T3.DWS.STR-1.0 System Test Report for Digital Watch System Test Cases Specification Test Summary Report Project Team 이동아 Latest update on

슬라이드 1

Microsoft PowerPoint - 05geometry.ppt

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

iOS5_1±³

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

설계란 무엇인가?

슬라이드 1

PowerPoint 프레젠테이션

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

UI TASK & KEY EVENT

Windows 8에서 BioStar 1 설치하기

오버라이딩 (Overriding)

vRealize Automation용 VMware Remote Console - VMware

4장.문장

PowerPoint Presentation

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Jwplayer 요즘 웹에서 동영상 재생을 목적으로 많이 쓰이는 jwplayer의 설치와 사용하기 입니다. jwplayer홈페이지 : 위의 홈페이지에 가시면 JWplayer를 다운 받으실 수 있습니다. 현재 5.1버전

(Microsoft PowerPoint - LZVNQBAJWGTC.ppt [\310\243\310\257 \270\360\265\345])

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

B _00_Ko_p1-p51.indd

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63138C0E520C0CCBAA5C6AE20C3B3B8AE28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

C. KHU-EE xmega Board 에서는 Button 을 2 개만사용하기때문에 GPIO_PUSH_BUTTON_2 과 GPIO_PUSH_BUTTON_3 define 을 Comment 처리 한다. D. AT45DBX 도사용하지않기때문에 Comment 처리한다. E.

PowerPoint Template

chap 5: Trees

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

Microsoft Word - PLC제어응용-2차시.doc

NTD36HD Manual

Contents Activity Define Real s Activity Define Reports UI, and Storyboards Activity Refine System Architecture Activity Defin

Transcription:

18 장. 새로운종류의입력 : 이벤트 IT 응용공학과 허석렬 syheo@pusan.ac.kr

이벤트 현실세계에서의 발생하는어떤일 과같이프로그램에서도 발생하는어떤일 마우스가움직이거나클릭됨 키가눌림 일정시간이경과함 지금까지의 ( 대부분의 ) 프로그램 ( 대표적으로 C) 은순차적실행 : 실행순서가어느정도예측가능 이벤트기반 (event-driven) 프로그램은이벤트가일어날때까지아무것도하지않고기다림 이벤트가발생하면해당이벤트를처리 (handle) 하는행동을취함

이벤트루프 이벤트기반프로그램에서이벤트가일어나는지확인하려면이벤트를계속확인하는과정이필요 이벤트확인은특정컴퓨터메모리를끊임없이검사함으로써컴퓨터 ( 내부또는외부 ) 에서이벤트가발생했음을확인할수있음 이벤트를끊임없이계속확인하는특별한반복문을이벤트루프 (event loop) 라고함 while 무한반복문을이용한이벤트루프

이벤트큐 컴퓨터에서발생하는이벤트 ( 마우스를움직이거나키를누르는것등 ) 는메모리의특정부분에저장 ( 기록 ) 기록됨 이벤트루프는메모리의특정부분을검사 이벤트가저장되는메모리의특정부분을이벤트큐 (event queue) 라고함 이벤트큐는발생한모든이벤트가발생한순서대로들어있는목록

이벤트처리자 (handler) 사용자가키를누르거나마우스를움직이는것과같은이벤트가발생하면이를처리하는부분이필요 프로그램에서이벤트를처리하는부분을작성 이벤트를처리하는프로그램의일부를이벤트처리자 (event handler) 라고함 모든이벤트가처리되지는않음 예 : 마우스를움직일때수백개의이벤트가발생 중요한이벤트에대해서만처리가필요 ( 예 : 마우스클릭 )

키보드이벤트 키보드의키를누를때마다이벤트가발생하게하려면 KEYDOWN 이벤트를사용 16 장 2D 예제 ( 아래예제프로그램다음에있음 ) 를방향키를눌렀을때아래위로움직이게수정 예제프로그램

전체프로그램코드 - 계속 프로그램설계및기법 move( ) 메서드가포함된 Ball 클래스

전체프로그램코드 - 계속 프로그램설계및기법 주실행코드 속도 위치 이벤트큐에서모든이벤트리스트를가져오는메서드 전체화면을다시그림

참조 : 16 장 2D 예제 프로그램설계및기법

키이벤트 화살표키를눌렀을때아래 / 위로움직이는이벤트처리자를추가 주실행코드의 pygame.event.get( ): 부분을수정 실행하면? 연속적인키입력이안됨

반복키 앞의예제는화살표키를계속누르고있어도한번만적용됨 프로그램에서계속키가눌러져있을때에대한대응이필요함 사용자가키를누르면 KEYDOWN 이벤트가하나만생성이되는데, pygame 에서는 KEYDOWN 이벤트를여러개만들어내는설정이있음 키반복 (key repeat) 을 while 반복문앞에설정

이벤트이름과키이름 이벤트와키는상당히많음 해당이벤트와키이름은파이게임에서확인가능 http://www.pygame.org/docs/ref/event.html http://www.pygame.org/docs/ref/key.html 자주사용하는이벤트 QUIT KEYDOWN KEYUP MOUSEMOTION MOUSEBUTTONUP MOUSEBUTTONDOWN

마우스이벤트 마우스이벤트를처리하는방법과마우스의위치정보를이용하는방법 마우스를움직일때마다비치볼이마우스를따라움직이게함 : ball 의 rect.center 속성을이용

마우스버튼이눌린상태에서공움직이기 마우스버튼이눌린상태에서만마우스를움직이는것을드래그 (dragging) 라고함 MOUSEDRAG 이벤트형식은없으므로기존의이벤트를이용해서원하는효과를만들어야함 마우스가드래그되는지를알려면마우스가눌린상태에서마우스가움직이는지를검사하면됨 MOUSEBUTTONDOWN: 눌린상태 MOUSEBUTTONUP: 놓은상태

마우스버튼이눌린상태에서공움직이기 - 코드

타이머이벤트 게임과시뮬레이션에유용한이벤트 타이머는알람시계처럼일정한간격으로이벤트를발생시킴 파이게임타이머는어떤주기로도설정이가능 타이머의시간이지나면이벤트루프에서감지할수있는이벤트가생성됨 사용자이벤트 (user event) 라는이벤트가생성됨 사용자정의 (user-defined) 이벤트 특정한목적으로따로확보해놓지않은이벤트 타이머도사용자정의이벤트의한종류임

파이게임에서타이머사용하기 : 예제 18.3 파이게임에서타이머설정 pygame.time.set_timer(event_number, interval) 변수는이벤트번호와타이머간격 ( 밀리초단위 ) EVENT_NUMBER 은사용중이아닌번호를사용해야함 >>> pygame.userevent 24 # 사용가능한이벤트번호인터랙티브모드 >>>pygame.numenevts 32 # 사용가능한이벤트최대번호 pygame.time.set_timer(24, 1000) 또는 pygame.time.set_timer(pygame.userevent, 1000) 프로그램모드

다른게임을해볼시간 : 파이퐁 (PyPong) Pong 게임을위해필요한것 튕기면서돌아다닐공 공과부딪힐패들 패들을조정하는방법 점수를기록하고창에해당점수를표시하는방법 생명 ( 남은기회에해당하는 ) 을관리하는방법

공 공에대한스프라이트를만들고그것의인스턴스를생성. myball = MyBallClass( wackyball.bmp, ball_speed, [50,50]) ballgroup = pygame.sprite.group(myball)

패들 패들을사각형으로생성하고검정색으로만듦 패들은이미지파일에서이미지를불러오지않고직접생성함. 대신 Surface.convert( ) 메서드를이용해표면을이미지로변환함 패들은좌우로만움직임. 마우스로패들을제어하기때문에 move( ) 메서드는필요하지않음

패들조종 MOUSEMOTION 이벤트를이용하여마우스로패들을조종 이벤트루프에서마우스패들조종 공과패들간의충돌감지 공과패들이충돌하면공의 y 좌표만반대방향으로수정

주실행코드 프로그램설계및기법

주실행코드 ( 계속 ) 프로그램설계및기법

점수기록및 pygame.font 를이용한점수표시 게임에서는두가지를관리해야함 생명의개수와점수 점수를표시할방법 파이게임에서는 font 라는모듈을이용 font 객체를만들고글꼴스타일과크기지정 글꼴객체에문자열을전달해텍스트를렌더링함. 그러면텍스트가그려진새로운표면 (surface) 이반환됨 이표면을화면표면으로블릿 ( 복사 ) 함

폰트사용하기 프로그램설계및기법 이벤트루프앞에다음코드삽입 이벤트루프안에는다음코드가필요 실행하면? NameError 발생

폰트사용하기 ( 계속 ) score = 0 초기화를 font 객체생성앞에삽입 이미공이창의위쪽끝에닿는경우를공 ( 객체 ) 의 move( ) 메서드안에서 ( 공을튕기기위해 ) 감지. 그곳에아래코드를추가함 score은지역변수? 전역변수?->move( ) 메서드에 global score, score_font, score_surf:

생명관리하기 플레이어에게기회를 3 번주기 : lives 변수에 3 lives = 3 아래코드를 while 문안에작성 공에는 myball.rect( ) 를 screen에는 get_rect( ) 를사용한이유 myball은스프라이트이며, 스프라이트에는 rect포함 screen은표면이며표면에는 rect가없음. get_rect( ) 를이용하면표면을감싸는 rect를구할수있음

생명카운터추가하기 플레이어에게생명을주는대부분의게임에는생명이얼마나남았는지를보여줌 손쉬운방법은남은생명의수만큼공의개수를보여주는것임. 다음코드를 while 문에삽입

게임종료 플레이어가남은생명을소진했을때 게임종료 메시지를보임 메시지와최종점수가포함된글꼴객체를몇개만들어렌더링한다음 screen 으로블릿 게임이끝난뒤에는더이상공이나타나지않도록해야함 게임이언제끝났는지를알려주는 done 변수를만듦

게임종료코드 프로그램설계및기법

최종파이퐁코드 프로그램설계및기법 # Listing_18-5.py # Copyright Warren & Carter Sande, 2013 # Released under MIT license http://www.opensource.org/licenses/mit-license.php # Version $version ---------------------------- # Final PyPong code import pygame, sys class MyBallClass(pygame.sprite.Sprite): def init (self, image_file, speed, location): pygame.sprite.sprite. init (self) #call Sprite initializer self.image = pygame.image.load(image_file) self.rect = self.image.get_rect() self.rect.left, self.rect.top = location self.speed = speed

파이퐁코드계속 프로그램설계및기법 def move(self): global score, score_surf, score_font self.rect = self.rect.move(self.speed) # bounce off the sides of the window if self.rect.left < 0 or self.rect.right > screen.get_width(): self.speed[0] = -self.speed[0] # bounce off the top of the window if self.rect.top <= 0 : self.speed[1] = -self.speed[1] score = score + 1 score_surf = score_font.render(str(score), 1, (0, 0, 0)) class MyPaddleClass(pygame.sprite.Sprite): def init (self, location): pygame.sprite.sprite. init (self) image_surface = pygame.surface.surface([100, 20]) image_surface.fill([0,0,0]) self.image = image_surface.convert() self.rect = self.image.get_rect() self.rect.left, self.rect.top = location

파이퐁코드계속 프로그램설계및기법 pygame.init() screen = pygame.display.set_mode([640,480]) clock = pygame.time.clock() myball = MyBallClass('wackyball.bmp', [10,5], [50, 50]) ballgroup = pygame.sprite.group(myball) paddle = MyPaddleClass([270, 400]) lives = 3 score = 0 score_font = pygame.font.font(none, 50) score_surf = score_font.render(str(score), 1, (0, 0, 0)) score_pos = [10, 10] done = False

파이퐁코드계속 프로그램설계및기법 running = True while running: clock.tick(30) screen.fill([255, 255, 255]) for event in pygame.event.get(): if event.type == pygame.quit: running = False elif event.type == pygame.mousemotion: paddle.rect.centerx = event.pos[0] if pygame.sprite.spritecollide(paddle, ballgroup, False): myball.speed[1] = -myball.speed[1] myball.move() if not done: screen.blit(myball.image, myball.rect) screen.blit(paddle.image, paddle.rect) screen.blit(score_surf, score_pos) for i in range (lives): width = screen.get_width() screen.blit(myball.image, [width - 40 * i, 20]) pygame.display.flip()

if myball.rect.top >= screen.get_rect().bottom: # lose a life if the ball hits the bottom lives = lives - 1 if lives == 0: final_text1 = "Game Over" final_text2 = "Your final score is: " + str(score) ft1_font = pygame.font.font(none, 70) ft1_surf = ft1_font.render(final_text1, 1, (0, 0, 0)) ft2_font = pygame.font.font(none, 50) ft2_surf = ft2_font.render(final_text2, 1, (0, 0, 0)) screen.blit(ft1_surf, [screen.get_width()/2 - \ ft1_surf.get_width()/2, 100]) screen.blit(ft2_surf, [screen.get_width()/2 - \ ft2_surf.get_width()/2, 200]) pygame.display.flip() done = True else: #wait 2 seconds, then start the next ball pygame.time.delay(2000) myball.rect.topleft = [50, 50] pygame.quit() 프로그램설계및기법