我是编程和游戏开发的新手。 因此,我想使用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()
答案 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()