1

I'm a beginner at python and pygame. What would be a good condensed way to have a camera move with the play? (With the player being in the middle of the screen always) I've tried multiple things but they just don't work the way I want them to. Again I'm new so if it's a dumb question, let me know. Thanks in advance to anyone who bothers answering at all.

import pygame
import random
import time

pygame.init()

display_width = 1200
display_height = 1000

black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)


player_width = 24
player_height = 42

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Random RPG')
clock = pygame.time.Clock()
PMF = ("PlayerModel_Forward.png")

playerSprt = pygame.image.load(PMF)

def player(x,y):
    gameDisplay.blit(playerSprt,(x,y))

def enemy1(enemy1x, enemy1y, enemy1w, enemy1h, color):
    pygame.draw.rect(gameDisplay, color, [enemy1x, enemy1y, enemy1w, enemy1h])

def death():
    message_display('Game Over')

    def text_objects(text, font):
        textSurface = font.render(text,
                              True, black)
    return textSurface, textSurface.get_rect()

def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf', 115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width/2), (display_height/2))
    gameDisplay.blit(TextSurf, TextRect)

    pygame.display.update()
    time.sleep(2)
    pygame.display.update()
    game_loop()

def frames(fps):
    font = pygame.font.SysFont(None, 25)
    text = font.render(str(fps), True, black)
    gameDisplay.blit(text,(0,0))

def xcoord(x_coord):
    font = pygame.font.SysFont(None, 25)
    text = font.render((str(x_coord)), True, black)
    gameDisplay.blit(text,(display_width/2,0))

def ycoord(y_coord):
    font = pygame.font.SysFont(None, 25)
    text = font.render((str(y_coord)), True, black)
    gameDisplay.blit(text,(display_width/2,25))

def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def game_loop():
    x = (display_width/2)
    y = (display_height/2)

    x_change = 0
    y_change = 0

    enemy1_startx = random.randrange(0, display_width)
    enemy1_starty = random.randrange (0, display_height)
    enemy1_x_change = random.randrange (-5,5)
    enemy1_y_change = random.randrange (-5,5)
    enemy1_width = 100
    enemy1_height = 100



    gameExit = False
    while not gameExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x_change = -5
                elif event.key == pygame.K_RIGHT:
                    x_change = 5
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change = 0

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_DOWN:
                    y_change = 5
                elif event.key == pygame.K_UP:
                    y_change = -5
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_DOWN or event.key == pygame.K_UP:
                    y_change = 0

        x+= x_change
        y+= y_change

        Fps = 30

        #Logic
        if gameExit == True:
            pygame.quit()
            quit()

        if x > display_width - player_width or x < 0:
            death()

        if y > enemy1_starty and y < enemy1_starty + enemy1_width or y+player_width > enemy1_starty and y + player_width < enemy1_starty + enemy1_width:

            if x > enemy1_startx and x < enemy1_startx + enemy1_width or x+player_width > enemy1_startx and x + player_width < enemy1_startx + enemy1_width:

                death()
                time.sleep(2)
                game_loop()


        if enemy1_starty > display_height or enemy1_starty < 0 or enemy1_startx > display_width or enemy1_startx < 0:
            enemy1_starty = random.randrange (0, display_height)
            enemy1_startx = random.randrange(0, display_width)
            enemy1_x_change = random.randrange (-5,5)

            enemy1_y_change = random.randrange (-5,5)




        #Drawing:
        gameDisplay.fill(black)
        player(x,y)
        enemy1 (enemy1_startx, enemy1_starty, enemy1_width, enemy1_height, red)
        enemy1_starty += enemy1_y_change
        enemy1_startx += enemy1_x_change
        frames((Fps))
        xcoord (x)
        ycoord (y)

        pygame.display.update()
        clock.tick(Fps)

game_loop()
pygame.quit()
quit()
J. Doe
  • 17
  • 6
  • In my multiple attempts I've given up early on, I've treated the camera as its own class, so you have `camera.x` and `camera.y`. The code to display stuff is based on the camera offset, so if the camera is at `(20, 0)`, then something at `(0, 0)` is drawn at `(-20, 0)`. – Peter Sep 28 '17 at 22:59

1 Answers1

0

You're doing really well! I think you may have taken the wrong approach, because instead of an actual camera moving ( which is insanely difficult to implement), the same effect can be reached, by moving every other element on the screen. So when the user presses right, instead of the player moving right, move the enemy left!: relevant code:

while not gameExit:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameExit = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                enemy1_startx = enemy1_startx+10
            elif event.key == pygame.K_RIGHT:
                enemy1_startx = enemy1_startx-10
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                x_change = 0

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                enemy1_starty = enemy1_starty - 10
            elif event.key == pygame.K_UP:
                enemy1_starty = enemy1_starty + 10
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_DOWN or event.key == pygame.K_UP:
                y_change = 0
eshanrh
  • 348
  • 3
  • 14