계속 손에 안잡히고 시작 못해서

간단하게 파이게임 진행해보려고함.

 

 

 

 

파이게임 단순 화면띄우기 예제

import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
pygame.display.set_caption("just window")

def main():
    while True:
        SURFACE.fill((255, 255, 255))

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

if __name__ == "__main__":
    main()

 

 

이벤트

- 이벤트 큐에 저장

- 큐 맨앞에 이벤트 꺼내 처리

 

 

 

간단한 글자 띄우기

import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))

def main():
    sysfont = pygame.font.SysFont(None, 36)
    counter = 0
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        counter += 1
        SURFACE.fill((0, 0, 0))
        count_image = sysfont.render("count is {}".format(counter), True, (255, 255, 255))
        SURFACE.blit(count_image, (50, 50))
        pygame.display.update()

if __name__ == "__main__":
    main()

 

 

fps 설정 1

- pygame.time.Clock() tick(10) 1초에 10번 루프

 

import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
FPSCLOCK = pygame.time.Clock()


def main():
    sysfont = pygame.font.SysFont(None, 36)
    counter = 0
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        counter += 1
        SURFACE.fill((0, 0, 0))
        count_image = sysfont.render("count is {}".format(counter), True, (255, 255, 255))
        SURFACE.blit(count_image, (50, 50))
        pygame.display.update()

        FPSCLOCK.tick(10)

if __name__ == "__main__":
    main()

 

 

 

상자 그리기

 

import sys
import pygame
from pygame.locals import QUIT, Rect

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
FPSCLOCK = pygame.time.Clock()


def main():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit
        SURFACE.fill((255, 255, 255))

        pygame.draw.rect(SURFACE, (255, 0, 0), (10, 20, 100, 50))
        pygame.draw.rect(SURFACE, (255, 0, 0), (150, 10, 100, 30), 3)
        pygame.draw.rect(SURFACE, (0, 255, 0), ((100, 80), (80, 50)))

        rect0 = Rect((200, 60), (140, 80))
        pygame.draw.rect(SURFACE, (0, 0, 255), rect0)
        rect1 = Rect((30, 160), (100, 50))
        pygame.draw.rect(SURFACE, (255, 255, 0), rect1)

        pygame.display.update()
        FPSCLOCK.tick(3)

if __name__ == "__main__":
    main()

 

 

import sys
import pygame
from pygame.locals import QUIT, Rect, Circle

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
FPSCLOCK = pygame.time.Clock()


def main():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit
        SURFACE.fill((255, 255, 255))

        pygame.draw.circle(SURFACE, (255, 0, 0), (50, 50), 20)
        pygame.draw.circle(SURFACE, (255, 0, 0), (150, 50), 20, 10)


        pygame.draw.circle(SURFACE, (0, 255, 0), (50, 150), 10)
        pygame.draw.circle(SURFACE, (0, 255, 0), (150, 150), 20)
        pygame.draw.circle(SURFACE, (0, 255, 0), (250, 150), 30)

        pygame.draw.ellipse(SURFACE, (255, 0, 0), (50, 50, 140, 60))
        pygame.draw.ellipse(SURFACE, (255, 0, 0), (250, 30, 90, 90))

        pygame.display.update()
        FPSCLOCK.tick(3)

if __name__ == "__main__":
    main()

 

 

 

원, 타원 그리기

import sys
import pygame
from pygame.locals import QUIT, Rect

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
FPSCLOCK = pygame.time.Clock()


def main():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit
        SURFACE.fill((255, 255, 255))

        pygame.draw.circle(SURFACE, (255, 0, 0), (50, 50), 20)
        pygame.draw.circle(SURFACE, (255, 0, 0), (150, 50), 20, 10)


        pygame.draw.circle(SURFACE, (0, 255, 0), (50, 150), 10)
        pygame.draw.circle(SURFACE, (0, 255, 0), (150, 150), 20)
        pygame.draw.circle(SURFACE, (0, 255, 0), (250, 150), 30)

        pygame.draw.ellipse(SURFACE, (255, 0, 0), (50, 50, 140, 60))
        pygame.draw.ellipse(SURFACE, (255, 0, 0), (250, 30, 90, 90))

        pygame.display.update()
        FPSCLOCK.tick(3)

if __name__ == "__main__":
    main()

 

선긋기

 

import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 220))
FPSCLOCK = pygame.time.Clock()

def main():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        
        SURFACE.fill((255, 255, 255))
        pygame.draw.line(SURFACE, (255, 0, 0), (10, 80), (200, 80))
        pygame.draw.line(SURFACE, (255, 0, 0), (10, 150), (200, 150), 15)
        pygame.draw.line(SURFACE, (0, 255, 0), (250, 30), (250, 200))

        start_pos = (300, 30)
        end_pos = (380, 200)
        pygame.draw.line(SURFACE, (0, 0, 255), start_pos, end_pos, 10)

        pygame.display.update()
        FPSCLOCK.tick(3)

if __name__ == "__main__":
    main()

 

 

 

 

그리드 만들기

 

import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
FPSCLOCK = pygame.time.Clock()

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

        SURFACE.fill((0, 0, 0))

        for xpos in range(0, 400, 25):
            pygame.draw.line(SURFACE, 0xFFFFFF, (xpos, 0), (xpos,300))
        for ypos in range(0, 300, 25):
            pygame.draw.line(SURFACE, 0xFFFFFF, (0, ypos), (400, ypos))
        pygame.display.update()
        FPSCLOCK.tick(3)
    

if __name__ == "__main__":
    main()

 

 

 

 

 

 

이은선

 

import sys
import random
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
FPSCLOCK = pygame.time.Clock()

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

        SURFACE.fill((0, 0, 0))

        pointlist = []
        for _ in range(10):
            xpos = random.randint(0, 400)
            ypos = random.randint(0, 300)
            pointlist.append((xpos, ypos))
        
        pygame.draw.lines(SURFACE, (255, 255, 255), True, pointlist, 5)
        pygame.display.update()
        FPSCLOCK.tick(3)

if __name__ == "__main__":
    main()

 

 

 

텍스트 쓰기

import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 200))
FPSCLOCK = pygame.time.Clock()

def main():
    sysfont = pygame.font.SysFont(None, 72)
    msg = sysfont.render("hello python", True, (0, 128, 128))
    msg_rect = msg.get_rect()
    msg_rect.center = (200, 100)


    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        SURFACE.fill((255, 255, 255))
        SURFACE.blit(msg, msg_rect)
        pygame.display.update()
        FPSCLOCK.tick(3)

if __name__ == "__main__":
    main()

 

 

 

 

 

 

텍스트 줌 회전

import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 200))
FPSCLOCK = pygame.time.Clock()

def main():
    sysfont = pygame.font.SysFont(None, 72)
    msg = sysfont.render("hello python", True, (0, 128, 128))
    msg_rect = msg.get_rect()
    theta = 0
    scale = 1


    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        SURFACE.fill((255, 255, 255))

        theta += 5
        scale = (theta % 360) / 180
        tmp_msg = pygame.transform.rotozoom(msg, theta, scale)
        tmp_rect = tmp_msg.get_rect()
        tmp_rect.center = (200,150)


        SURFACE.blit(tmp_msg, tmp_rect)
        pygame.display.update()
        FPSCLOCK.tick(30)

if __name__ == "__main__":
    main()

 

 

 

마우스 클릭 이벤트

import sys
import pygame
from pygame.locals import QUIT, MOUSEBUTTONDOWN

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))
FPSCLOCK = pygame.time.Clock()

def main():
    mousepos = []
    while True:
        SURFACE.fill((255, 255, 255))
        
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                mousepos.append(event.pos)
        
        for pos in mousepos:
            pygame.draw.circle(SURFACE, (0, 255, 0), pos, 5)
        
        pygame.display.update()
        FPSCLOCK.tick(10)

if __name__ == "__main__":
    main()

 

이 책같은 경우에는

평소 그림 연출 같은게 궁금했던 편이라 

개발 서적만 보면 재미도 없어서 보게됨

내용 자체가 만화로 구성되어 있어서 가볍게 읽을수 있엇고

 

컴퓨터 쪽만 다루다가

만화 작가 입장에서 어떻게 만화 세상을 만들고 사람들에게 보여줄지 고민한 흔적들을 보는게 꽤 재밋게 볼수 있었음.

 

 

이 책 중간에 기술 체득에 대해 언급한 부분이 가장 인상적이었음.

"기술을 익힌다는 것은 어떤 것인가? 기술의 체득이란 비유하자면 뇌에 고속도로를 뚫는 것과 같다."

"처음 고속도로 뚫을 때는 노력과 수고가 많이든다. 하지만 서서히 개통 구간이 늘어나고 어느 시점에 도달하면 그 이후로는 몸이 알아서 기술을 발휘해 주게 된다. 이 도로는 뚫기 힘들지만 한번 뚤으면 어지간해선 쇠퇴하지 않습니다."

"다만 이 고속도로는 까다로운 성질이 있는데, 하루에 개통 가능한 한도가 정해져 있다는 것이다."

이 책을 왜 봤더라..

 

평소 가끔 널널한 개발자님유튜브 영상 보곤하는데

 

대부분의 프로그래밍 책들이 기본서 이상의 내용이 부실해서 아쉽게 생각하는편이라

그 중에서 그나마 기본서가 다루지 않는 부분도 긁어주는 책이라 보게되었음.

 

이 책 머릿말에서 부터 이 부분을 언급하고 시작한다.

 

 

 

" 언어 입문서 대부분이 함수 포인터를 비롯한 소위 '고급 이론,들은 대부분 언급하지 않습니다. 다 이유가 있겠지만 이런 고급 이론들이 생략된 채로 C 언어 책들이 만들어지는 것은 정말 아쉬운 일입니다. 실무자에게는 너무도 중요한 이론들이기 때문입니다. 정확히 말해서 모르고는 제대로 살아남기 어려운 이론들이라 해야 할 것입니다. 많은 개발자가 10년 이내에 조기 은퇴하는 이유도 꼭 알아야 할 것들을 제대로 배운 적이 없기 때문이 아닐까 조심스럽 게 추측해봅니다."

 

"어려운 이론들을 늘어놓을수록 대중성과 멀어진다는 사실을 알고 있습니다. 하지만 적당히 타협해서 책을 쓰고 싶지는 않았습니다. 아쉬움이 없다고 할 수는 없지만. C 언어를 이용하는 실무 프로그래머 라면 반드시 알아야 할 이론들을 충분히 담았다고 자부합니다."

 

 

해외 번역서로 넘어가거나 잘 찾아보면 C 언어 고급 내용도 포함된 책도 찾아볼수야 있긴한데,

나처럼 머리가 굳은 사람 입장에서는 잘 이해하기가 힘들어서 보기 부담스러울때가 많다.

하지만 지금도 유튜브를 운영하시면서 오랫동안 고민하고 강의해오신 분 답게

기본서 이상 내용을 가장 깔끔하게 설명해준 책이라 생각된다.

 

국내 프로그래밍 기본서 중에

직접 메모리, 어셈블리를 보여주거나

스택 프레임을 그려준다거나

유니코드

형한정어

전처리기(조건부, 빌드모드)

최적화, 함수규칙 등을

 

이렇게 쉽게 설명해주는 책을 거의 보지 못했는데 

보통 기본서 땐 시점에서 오픈소스 살펴보면

전처리나 최적화, 라이브러리 등 내용이 부실해서 이해하기힘드나

 

다 긁어주니 좋더라.

특히 VS 쓰면서 빌드 에러날떼 cdecl이니 fastcall이니 뭔가 뜨는데 귀찬아서 제대로 안보던게

함수 규칙인걸 이제서야 처음알았다.

 

처음 개발 공부하는 입장에서는 힘든 책일지는 몰라도

어중간한 기본서보고 헛발질하느니 첫 C언어 기본서로서는 최고인듯.

https://www.yes24.com/Product/Goods/18732021

 

독하게 시작하는 C 프로그래밍 - 예스24

아프리카 TV에서 생방송 강의 진행!!!기초 문법은 물론 실무 활용 코딩 기법까지 코드 한 줄 한 줄을 독하게 파고든다!C는 정말 독하게 마음먹지 않고서는 숙달하기 어려운 프로그래밍 언어이다.

www.yes24.com

 

+ Recent posts