7. Posúvanie a približovanie

from pygame import *

WIDTH = 1280
HEIGHT = 800
screen = display.set_mode([WIDTH, HEIGHT])

BLACK = Color(0, 0, 0)
WHITE = Color(255, 255, 255)
RED = Color(255, 0, 0)

OffsetX = -WIDTH / 2
OffsetY = -HEIGHT / 2

StartPanX = 0
StartPaxY = 0

ScaleX = 1
ScaleY = 1

held = False

selectCellX = 0
selectCellY = 0

def WorldToScreen(WorldX, WorldY):
    return int((WorldX - OffsetX) * ScaleX), int((WorldY - OffsetY) * ScaleY)

def ScreenToWorld(ScreenX, ScreenY):
    return (ScreenX / ScaleX + OffsetX), (ScreenY / ScaleX + OffsetY)

while True:
    for ev in event.get():
        if ev.type == MOUSEBUTTONDOWN:
            if ev.button == 1:
                held = True
                StartPanX, StartPanY = ev.pos
            elif ev.button == 3:
                selectCellX, selectCellY = map(int, ScreenToWorld(*ev.pos))
            elif ev.button == 4 or ev.button == 5:
                mxWorld, myWorld = ScreenToWorld(*ev.pos)
                if ev.button == 4:
                    ScaleX *= 1.05
                    ScaleY *= 1.05
                elif ev.button == 5:
                    ScaleX *= 0.95
                    ScaleY *= 0.95
                mxWorldAfter, myWorldAfter = ScreenToWorld(*ev.pos)
                OffsetX += (mxWorld - mxWorldAfter)
                OffsetY += (myWorld - myWorldAfter)
        elif ev.type == MOUSEBUTTONUP and ev.button == 1:
            held = False
        elif ev.type == MOUSEMOTION and held:
            mx, my = ev.pos
            OffsetX -= (mx - StartPanX)
            OffsetY -= (my - StartPanY)
            StartPanX = mx
            StartPanY = my
        elif ev.type == QUIT:
            quit()

    # Draw ---------
    screen.fill(BLACK)
    # Clip Screen
    worldLeft, worldTop = ScreenToWorld(0, 0)
    worldRight, worldBottom = ScreenToWorld(WIDTH, HEIGHT)

    for y in range(11):
        if worldTop <= y <= worldBottom:
            draw.line(screen, WHITE, WorldToScreen(0, y), WorldToScreen(10, y))
    for x in range(11):
        if worldLeft <= x <= worldRight:
            draw.line(screen, WHITE, WorldToScreen(x, 0), WorldToScreen(x, 10))

    draw.circle(screen, RED, WorldToScreen(selectCellX + 0.5, selectCellY + 0.5), int(0.3 * ScaleX))

    display.update()
    time.delay(30)