• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zaprogramować kamerę w grze 2D?

Object Storage Arubacloud
0 głosów
244 wizyt
pytanie zadane 28 marca 2018 w Python przez Okto Nowicjusz (120 p.)

Witam, programuje grę 2D w pythonie za pomocą pygame, chcę stworzyć kamerę która podążałaby za postacią, nie mam żadnego pojęcia jak się za to zabrać i nie potrafię znaleźć w internecie poradnika za którego pomocą mógłbym stworzyć kamerę.

import pygame
from pygame.sprite import Group
from settings import Settings
from player import Player
import game_functions as gf



def run_game():
    #Inicjalizacja gry i utworzenie ekranu.
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Prawilne Walki beta v0.1")

    #Utworzenie gracza.
    player = Player(ai_settings, screen)
    bullets = Group()

    #Pętla główna gry.
    while True:
        #Sprawdzanie reakcji na naciśnięcie klawiszy.
        gf.check_events(ai_settings, screen, player, bullets)
        player.update()
        gf.update_bullets(bullets)
        gf.update_screen(ai_settings, screen, player, bullets)

run_game()
class Settings():
    """Klasa przechowywania ustawień gry."""

    def __init__(self):
        """Inicjalizacja ustawień gry."""
        #Ustawienia ekranu.
        self.screen_width = 1000
        self.screen_height = 700
        self.bg_color = (50, 230, 0)

        #Ustawienia dotyczące gracza.
        self.player_speed_factor = 0.6

        # Ustawienia dotyczące pocisku.
        self.bullet_speed = 0.4
        self.bullet_speed_factor_Y = -0.5
        self.bullet_speed_factor_X = 0.1
        self.bullet_width = 15
        self.bullet_height = 15
        self.bullet_color = 250, 60, 60
        self.bullets_allowed = 10
import pygame
class Player():

    def __init__(self, ai_settings, screen):
        """Inicjalizacja gracza i jego położenie początkowe."""
        self.screen = screen
        self.ai_settings = ai_settings

         #Wczytywanie obrazu gracza i pobranie jego prostokąta.
        self.image = pygame.image.load('images/player.png')
        self.rect = self.image.get_rect()
        self.screen_rect = screen.get_rect()

        #każdy nowy gracz pojawia się na dole ekranu.
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom

        #Przechowywanie pozycji zmiennoprzecinkowej gracza.
        self.centerx = float(self.rect.centerx)
        self.centery = float(self.rect.centery)

        #Opcje wskazujące na poruszanie się gracza.
        self.moving_right = False
        self.moving_left = False
        self.moving_up = False
        self.moving_down = False

    def update(self):
        """Uaktualnienie połozenia gracza na podstawie opcji wskazującej na jego ruch."""
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.centerx += self.ai_settings.player_speed_factor
        if self.moving_left and self.rect.left > 0:
            self.centerx -= self.ai_settings.player_speed_factor
        if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
            self.centery += self.ai_settings.player_speed_factor
        if self.moving_up and self.rect.top > self.screen_rect.top:
            self.centery -= self.ai_settings.player_speed_factor

        #Uaktualnienie obiektu rect na podstawie wartości self.center.
        if self.moving_up or self.moving_down:
            self.rect.centery = self.centery
        if self.moving_left or self.moving_right:
            self.rect.centerx = self.centerx

    def blitme(self):
        """Wyświetlenie gracza w jego aktualnym położeniu."""
        self.screen.blit(self.image, self.rect)
    def bullet_direction(self):
        mousex, mousey = pygame.mouse.get_pos()
        print(mousex, mousey)

import sys
import pygame
from bullet import Bullet
import bulletdir
import settings as ai_settings

def update_bullets(bullets):
    """Uaktualnienie położenia pocisków i usunięcie tych niewidocznych na ekranie."""
    #Uaktualnienie położenia pocisków.
    bullets.update()

    #Usunięcie pocisków, które znajdują się poza ekranem.
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
        elif bullet.rect.top >= 700:
            bullets.remove(bullet)
        elif bullet.x <= 0:
            bullets.remove(bullet)
        elif bullet.x >= 1000:
            bullets.remove(bullet)

def check_keydown_events(event, ai_settings, screen, player, bullets):
    """Reakcja na naciśnięcie klawisza."""
    if event.key == pygame.K_q:
        ai_settings.bullet_speed -= 0.1
        #bulletdir.bullet_direction_X(player)
    elif event.key == pygame.K_e:
        ai_settings.bullet_speed += 0.1
    elif event.key == pygame.K_d:
        player.moving_right = True
        #print("d")
    elif event.key == pygame.K_a:
        player.moving_left = True
        #print("a")
    elif event.key == pygame.K_w:
        player.moving_up = True
        #print("w")
    elif event.key == pygame.K_s:
        player.moving_down = True
        #print("s")
    elif event.key == pygame.K_SPACE:
        fire_bullet(ai_settings, screen, player, bullets)


def fire_bullet(ai_settings, screen, player, bullets):
    """Wystrzelenie pocisku,"""
    #Utworzenie nowego pocisku i dodanie go do grupy pocisków.
    if len(bullets) < ai_settings.bullets_allowed:
        new_bullet = Bullet(ai_settings, screen, player)
        bullets.add(new_bullet)

def check_keyup_events(event, player):
    if event.key == pygame.K_d:
        player.moving_right = False
        #print("d false")
    elif event.key == pygame.K_a:
        player.moving_left = False
        #print("a false")
    elif event.key == pygame.K_w:
        player.moving_up = False
        #print("w false")
    elif event.key == pygame.K_s:
        player.moving_down = False
        #print("s false")

def check_events(ai_settings, screen, player, bullets):
    """Reakcja na klawisze."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event, ai_settings, screen, player, bullets)
        elif event.type == pygame.KEYUP:
            check_keyup_events(event, player)

def update_screen(ai_settings, screen, player, bullets):
    """Uaktualnienie obrazów na ekranie i przejście do nowego ekranu."""
    # Odświeżenie ekranu w trakcie każdej literacji pętli.
    screen.fill(ai_settings.bg_color)

    # Ponowne wyświetlenie wszystkich pocisków pod warstwami statku kosmicznego i obcych.
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    player.blitme()

    # Wyświetlenie ostatnio zmodyfikowanego ekranu.
    pygame.display.flip()
import pygame
from pygame.sprite import Sprite
import bulletdir as BD
class Bullet(Sprite):
    """Klasa przeznaczona do zarządzania pociskami wystrzeliwanymi przez gracza."""

    def __init__(self, ai_settings, screen, player):
        """Utworzenie obiektu pocisku w aktualnym położeniu gracza."""
        super().__init__()
        self.screen = screen

        #Utworzenie prostokąta pocisku w punkcie (0, 0), a następnie zdefiniowanie dla niego odpowiedniego położenia.
        self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)
        self.rect.centerx = player.rect.centerx
        self.rect.centery = player.rect.centery

        #Położenie pocisku jest zdefiniowane za pomocą wartości zmienoprzecinkowej.
        self.y = float(self.rect.y)
        self.x = float(self.rect.x)

        self.color = ai_settings.bullet_color
        self.speed_factor_Y = BD.speed_Y(player) * ai_settings.bullet_speed
        self.speed_factor_X = BD.speed_X(player) * ai_settings.bullet_speed

    def update(self):
        """Poruszanie pociskiem po ekranie."""
        #Uaktualnienie położenia pocisku.
        self.y += self.speed_factor_Y
        self.x += self.speed_factor_X
        #Uaktualnienie położenia prostokąta pocisku.
        self.rect.y = self.y
        self.rect.x = self.x

    def draw_bullet(self):
        """Wyświetlenie pocisku na ekranie."""
        pygame.draw.rect(self.screen, self.color, self.rect)
import pygame
import settings as ai_settings
Xspeed = 1
Yspeed = 1

def bullet_direction_X(player):
        global Xspeed
        global Yspeed
        mousex, mousey = pygame.mouse.get_pos()
        X = mousex - player.rect.centerx
        Y = mousey - player.rect.centery
        if mousex > player.rect.centerx and mousey < player.rect.centery:
            Xspeed = 1
            Yspeed = Y / X
            #print("Y=", Yspeed, "X=", Xspeed)
            ai_settings.bullet_speed_factor_X = Xspeed
            ai_settings.bullet_speed_factor_Y = Yspeed
        if mousex > player.rect.centerx and mousey > player.rect.centery:
            if X > Y:
                Yspeed = Y / X
                Xspeed = 1
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
            if Y > X:
                Yspeed = 1
                Xspeed = X / Y
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
        if mousex < player.rect.centerx and mousey < player.rect.centery:
            if X > Y:
                Yspeed = (Y / X) * -1
                Xspeed = -1
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
            if Y > X:
                Yspeed = -1
                Xspeed = (X / Y) * -1
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
        if mousex < player.rect.centerx and mousey > player.rect.centery:
            Xspeed = X / Y
            Yspeed = 1
            #print("Y=", Yspeed, "X=", Xspeed)
            ai_settings.bullet_speed_factor_X = Xspeed
            ai_settings.bullet_speed_factor_Y = Yspeed
        return (Xspeed)

def bullet_direction_Y(player):
        global Xspeed
        global Yspeed
        mousex, mousey = pygame.mouse.get_pos()
        X = mousex - player.rect.centerx
        Y = mousey - player.rect.centery
        if mousex > player.rect.centerx and mousey < player.rect.centery:
            Xspeed = 1
            Yspeed = Y / X
            #print("Y=", Yspeed, "X=", Xspeed)
            ai_settings.bullet_speed_factor_X = Xspeed
            ai_settings.bullet_speed_factor_Y = Yspeed
        if mousex > player.rect.centerx and mousey > player.rect.centery:
            if X > Y:
                Yspeed = Y / X
                Xspeed = 1
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
            if Y > X:
                Yspeed = 1
                Xspeed = X / Y
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
        if mousex < player.rect.centerx and mousey < player.rect.centery:
            if X > Y:
                Yspeed = (Y / X) * -1
                Xspeed = -1
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
            if Y > X:
                Yspeed = -1
                Xspeed = (X / Y) * -1
                #print("Y=", Yspeed, "X=", Xspeed)
                ai_settings.bullet_speed_factor_X = Xspeed
                ai_settings.bullet_speed_factor_Y = Yspeed
        if mousex < player.rect.centerx and mousey > player.rect.centery:
            Xspeed = X / Y
            Yspeed = 1
            #print("Y=", Yspeed, "X=", Xspeed)
            ai_settings.bullet_speed_factor_X = Xspeed
            ai_settings.bullet_speed_factor_Y = Yspeed
        return (Yspeed)

def speed_X(player):
    x = bullet_direction_X(player)
    y = bullet_direction_Y(player)

    if x > 0 and y > 0:
        #X i Y większe od 0.
        if x > y:
            dir_Y = y / x
            dir_X = 1
        elif x < y:
            dir_X = x / y
            dir_Y = 1

    elif x < 0 and y < 0:
        #X i Y mniejsze od 0.
        if x > y:
            dir_Y = -1
            dir_X = (x / y) * -1
        elif x < y:
            dir_X = -1
            dir_Y = (y / x) * -1

    elif x > 0 and y < 0:
        #X większe od 0, a Y mniejsze.
        copy_Y = y * -1
        #Zmienna stworzona dla porównania Y i X.
        if x > copy_Y:
            dir_Y = y / x
            dir_X = 1
        elif x < copy_Y:
            dir_X = (x / y) * -1
            dir_Y = -1

    elif x < 0 and y > 0:
        #Y większe od 0, a X mniejsze.
        copy_X = x * -1
        #Zmienna stworzona dla porównania Y i X.
        if y > copy_X:
            dir_X = x / y
            dir_Y = 1
        elif y < copy_X:
            dir_Y = (y / x) * -1
            dir_X = -1
    #print("X=", dir_X, "Y=", dir_Y)
    return (dir_X)

def speed_Y(player):
    x = bullet_direction_X(player)
    y = bullet_direction_Y(player)

    if x > 0 and y > 0:
        # X i Y większe od 0.
        if x > y:
            dir_Y = y / x
            dir_X = 1
        elif x < y:
            dir_X = x / y
            dir_Y = 1

    elif x < 0 and y < 0:
        # X i Y mniejsze od 0.
        if x > y:
            dir_Y = -1
            dir_X = (x / y) * -1
        elif x < y:
            dir_X = -1
            dir_Y = (y / x) * -1

    elif x > 0 and y < 0:
        # X większe od 0, a Y mniejsze.
        copy_Y = y * -1
        # Zmienna stworzona dla porównania Y i X.
        if x > copy_Y:
            dir_Y = y / x
            dir_X = 1
        elif x < copy_Y:
            dir_X = (x / y) * -1
            dir_Y = -1

    elif x < 0 and y > 0:
        # Y większe od 0, a X mniejsze.
        copy_X = x * -1
        # Zmienna stworzona dla porównania Y i X.
        if y > copy_X:
            dir_X = x / y
            dir_Y = 1
        elif y < copy_X:
            dir_Y = (y / x) * -1
            dir_X = -1

    return (dir_Y)

 

1 odpowiedź

0 głosów
odpowiedź 5 kwietnia 2018 przez Bartek hdd Początkujący (420 p.)
Z tego co się orientuję, w pygame nie ma wbudowanego modułu odpowiedzialnego za kamerę. Możesz ją zasymulować przesuwając wszystkie obiekty znajdujące się w oknie.

Podobne pytania

+1 głos
0 odpowiedzi 138 wizyt
pytanie zadane 22 czerwca 2022 w Python przez Karp.exe Początkujący (340 p.)
0 głosów
2 odpowiedzi 172 wizyt
pytanie zadane 6 października 2022 w Python przez Podlasianin Początkujący (400 p.)
0 głosów
0 odpowiedzi 226 wizyt
pytanie zadane 7 lipca 2022 w Python przez Karp.exe Początkujący (340 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...