2016-01-03 2 views
0

Я довольно новичок в pygame, так что простите меня, если я буду выглядеть глупым, но у меня возникают проблемы с попыткой получить систему с прокруткой по границе - то есть, которая останавливается, когда край фона достигнут вместо постоянного прокрутки.Нужно использовать механизм скроллинга в pygame

Это то, что у меня есть:

import pygame 
import math 
import sys 
import random 
from pygame.locals import * 

pygame.init() 
clock = pygame.time.Clock() 
screen = pygame.display.set_mode((1024, 728),0,0) 
pygame.display.set_caption("Modern Politics") 
b1 = "Blank.png" 
back = pygame.image.load(b1).convert() 
back1 = pygame.image.load(b1).convert() 
x=0 
y=0 
screenWidth = 1024 
screenHeight = 728 

while True: 
    screen.blit(back, (x,y)) 
    screen.blit(back1, (x-screenWidth,y-screenHeight)) 

    for event in pygame.event.get(): 
     if not hasattr(event, "key"): continue 
     if event.key == K_RIGHT: 
      x=x-10 
     elif event.key == K_LEFT: 
      x=x+10 
     elif event.key == K_UP: 
      y=y+10 
     elif event.key == K_DOWN: 
      y=y-510 
     elif event.key == K_ESCAPE: 
      sys.exit(0) 

    if x == screenWidth: 
     x=0 

    if y == screenHeight: 
     y=0 

    msElapsed = clock.tick(100) 
    pygame.display.flip() 

Но это просто приходит с целой кучей проблем, как показано в этом GIF:

https://gyazo.com/f734c9955d52b0fed1e89766013f4122

The (незаконченный) картина I я пытаюсь прокрутить это изображение 1920x1080:

https://www.dropbox.com/s/fh2e99nw5jh7eqc/Blank.png?dl=1

Как я могу сделать это так, чтобы изображение перестало прокручиваться и не прокручивалось, когда достигнут конец изображения? Он должен работать как по вертикали, так и по горизонтали.

(Кстати, я использую Python 3.4)

ответ

0

Я думаю, что он похож на "following camera", чтобы вы могли использовать camera offset, если у вас есть несколько объектов на экране, но здесь я использую что-то другое.

Вам нужно сравнить слева, справа, сверху, нижняя граница изображения с левой, правой, верхней, нижней границы экрана, чтобы остановить прокрутку

# left borders 
if x > 0: 
    x = 0 

# top borders 
if y > 0: 
    y = 0 

# right borders 
if x+image_width < screen_width: 
    x = screen_width 

# bottom borders 
if y+image_height < screen_height: 
    y = screen_height 

я использую pygame.Rect использовать rect.left вместо x и rect.right вместо x+widthrect.top вместо y и rect.bottom вместо y+height)

#!/usr/bin/env python3 

# pygame (simple) template 

import pygame 

# === CONSTANTS === (UPPER_CASE names) 

SCREEN_WIDTH = 1024 
SCREEN_HEIGHT = 728 

# === CLASSES === (CamelCase names) 

    # empty 

# === FUNCTIONS === (lower_case names) 

    # empty 

# === MAIN === 

# --- init --- 

pygame.init() 

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) 
screen_rect = screen.get_rect() 

pygame.display.set_caption("Modern Politics") 

# --- objects --- 

image_name = "Blank.png" 

image = pygame.image.load(image_name).convert() 
image_rect = image.get_rect() 

speed = 20 

change_x = 0 
change_y = 0 

# --- mainloop --- 

clock = pygame.time.Clock() 

running = True 

while running: 

    # --- events --- 

    for event in pygame.event.get(): 

     # --- global events --- 

     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       running = False 

     # --- player events --- 

     # KEYDOWN/KEYUP event occurs when key is going down/up (short-time event), 
     # not when key is held down/up (long-time event) 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_RIGHT: 
       change_x -= speed 
      elif event.key == pygame.K_LEFT: 
       change_x += speed 
      elif event.key == pygame.K_DOWN: 
       change_y -= speed 
      elif event.key == pygame.K_UP: 
       change_y += speed 

     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_RIGHT: 
       change_x += speed 
      elif event.key == pygame.K_LEFT: 
       change_x -= speed 
      elif event.key == pygame.K_DOWN: 
       change_y += speed 
      elif event.key == pygame.K_UP: 
       change_y -= speed 

    # --- updates (without draws) --- 

    # move object 
    image_rect.x += change_x 
    image_rect.y += change_y 

    # check borders 

    # right borders (SCREEN_WIDTH) 
    if image_rect.right < screen_rect.right: 
     image_rect.right = screen_rect.right 

    # left borders (0) 
    if image_rect.left > screen_rect.left: 
     image_rect.left = screen_rect.left 

    # bottom borders (SCREEN_HEIGTH) 
    if image_rect.bottom < screen_rect.bottom: 
     image_rect.bottom = screen_rect.bottom 

    # left borders (0) 
    if image_rect.top > screen_rect.top: 
     image_rect.top = screen_rect.top 

    # --- draws (without updates) --- 

    screen.blit(image, image_rect) 

    # human eyes need at least 25FPS to see animation, 
    # monitors mostly refresh screen with 60Hz - it means 60FPS. 
    clock.tick(30) 

    pygame.display.flip() 

# --- the end --- 

pygame.quit() 
+0

Это решило мою проблему совершенно, т Хватает вас так много. –