用Python在背景上移动相机

时间:2018-08-12 19:01:32

标签: python pygame

我是编程和游戏开发的新手。 因此,我想使用Python和pygame创建非常简单的2D RTS,而我遇到的第一个问题是相机。我需要在背景下创建复杂的相机。它应该能够放大/缩小并在键盘按键周围移动。我发现所有课程,没有正常的解释,都会改变背景或做一些不寻常的事情。

我完全可以在pygame中创建此相机吗?如何? 如何在背景下移动相机? (我打算稍后将对象添加到背景中)如何实现缩放?

现在我有一个简单的代码可以加载背景图像。

import math, random, sys
from PyQt5.QtWidgets import QDesktopWidget,QApplication
import pygame
app = QApplication(sys.argv)
q = QDesktopWidget().availableGeometry()

pygame.init()

clock = pygame.time.Clock()
FPS = 60
pygame.display.set_caption("New Game")
win = pygame.display.set_mode((q.width(), q.height())) #Creating window like size of screen


bg = pygame.image.load('C:\Py\Game\Image\Kordon3.jpg').convert() #Loading background image
run = True

H = 0
W = 0

while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

    #This keys move background

    if keys[pygame.K_LEFT]:
        W += 5
    elif keys[pygame.K_RIGHT]:
        W -= 5
    elif keys[pygame.K_DOWN]:
        H -= 5
    elif keys[pygame.K_UP]:
        H += 5
    win.blit(bg, (W, H)) #Add/update coordinats of background
    pygame.display.update()
    clock.tick(FPS)
pygame.quit()

1 个答案:

答案 0 :(得分:3)

这很简单,我看到您已经了解运动部分。如果pygame使用正常的坐标系,则缩放将很容易,因为然后我们只需将x和y乘以缩放因子即可,但事实并非如此,因此我们将其转换为正常的坐标,进行缩放,然后再转换回去。我为矩形制作了图片,但也为图形中的图片制作了图片

screen.blit(bg,(topLeftX,topLeftY))

并为背景设置一个starterX和starterY,您可以将它们默认设置为0,0

控件:WASD用于上下移动箭头进行缩放

import pygame 
x = 0
y = 0
running = True
width = 800
height = 600
zoom = 1
allRects = []

screen = pygame.display.set_mode((width,height))

class Shape:
    def __init__(self,x,y,w,h):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
def graphics(deltaX,deltaY):
    screen.fill((255,255,255))
    for rectangle in allRects:
        toDraw = True
        normalX =zoom*(-(width/2)+(rectangle.x - deltaX))
        normalY =zoom*((height/2) -(rectangle.y-deltaY))
        topLeftX = width/2+normalX
        topLeftY = height/2 - normalY
        if topLeftX + rectangle.w < 0 or topLeftX>width:
            toDraw= False
        elif topLeftY> height or topLeftY+rectangle.h<0:
            toDraw= False
        else:
            pygame.draw.rect(screen,(0,0,0),pygame.Rect(topLeftX,topLeftY,zoom*rectangle.w,zoom*rectangle.h))

allRects.append(Shape(100,30,142,14))
allRects.append(Shape(100,120,20,14))
allRects.append(Shape(0,30,14,174))
allRects.append(Shape(40,340,114,14))

while running:
    graphics(x,y)
    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
    key = pygame.key.get_pressed()
    if key[pygame.K_UP]:
        zoom = zoom*1.01
    if key[pygame.K_DOWN]:
        zoom = zoom*0.99
    if zoom<0:
        zoom = 0

    if key[pygame.K_w]:
        y-=1/zoom * 2
    if key[pygame.K_s]:
        y+=1/zoom * 2
    if key[pygame.K_a]:
        x-=1/zoom * 2
    if key[pygame.K_d]:
        x+=1/zoom * 2       

    pygame.display.update()