OOP Платформа Pygame: управление и перемещение квадрата на экране - PullRequest
1 голос
/ 11 июля 2020
import pygame
import random
import math
import sys

screenWidth = 1200
screenHeight = 600

class Hero:
    def __init__(self, pos):
        self.pos = pos
        self.width = 30
        self.height = 30
        self.color = (0, 0, 0)
        self.dirX = 0
        self.dirY = 0

    def move(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.dirX = 1
                elif event.key == pygame.K_LEFT:
                    self.dirX = -1

    def draw(self, display):
        x = self.pos[0]
        y = self.pos[1]
        pygame.draw.rect(display, self.color, (x + self.dirX, y + self.dirY, self.width, self.height))
        print(self.pos, self.dirX, self.dirY)
    
    def jump(self):
        pass


    def die(self):
        pass


class Enemy:
    pass

class Background:
    pass

class Obstacles:
    pass

class Camera:
    pass

def score():
    pass

def create(w, h):
    display = pygame.display.set_mode((w, h))
    display.fill((255, 255, 255))
    #create background
    #create Obstacles
    #create Hero
    heroOne = Hero([150, 450])
    heroOne.move()
    heroOne.draw(display)
    #create Enemy
    pygame.display.update()

def main():
    pygame.init()

    clock = pygame.time.Clock()

    running = True
    while running:

        clock.tick(300)

        create(screenWidth, screenHeight)

main()

Привет, я делаю OOP игру с использованием Pygame, в которой квадрат будет управляться пользователем и двигаться по полу, перепрыгивать через препятствия и другие вражеские квадраты.

Путь Я хочу, чтобы он работал: когда я нажимаю K_LEFT, dirX = 1, он добавляется к x-координате pos, и, следовательно, x-позиция квадрата будет обновлена, и квадрат начнет двигаться вправо. Когда я нажимаю dir = -1, квадрат переместится влево.

Как это работает: Нет

Я думаю, что проблема в pos основного куба не кажется update, а dirX обновляется с 0 до 1 и возвращается к 0.

Я думаю, изменение значений переменных в функции __init__() выполняется, когда я это делаю или, возможно, это совершенно неверно.

Это какой-то способ заставить мой код работать так, как я пытаюсь это сделать, или это совершенно неправильный способ, и есть другой способ?

Я изучаю OOP и python, я буду очень признателен за любые дополнительные советы или ссылки относительно передовых методов, относящихся к этому коду.

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Прежде всего, вы должны вызвать move в основном приложении l oop:

def main():
    pygame.init()
    display = pygame.display.set_mode((screenWidth, screenHeight))
    clock = pygame.time.Clock()

    heroOne = Hero([150, 450])
    running = True
    while running:
        clock.tick(300)

        display.fill((255, 255, 255))
        heroOne.move()
        heroOne.draw(display)
        pygame.display.update()        

Вы должны изменить положение игрока на self.dirX и self.dirY, в каждом кадре:

class Hero:
    # [...]

    def move(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.dirX = 1
                elif event.key == pygame.K_LEFT:
                    self.dirX = -1

        new_x = self.pos[0] + self.dirX
        new_y = self.pos[1] + self.dirY
        self.pos = [new_x , new_y]

    def draw(self, display):
        pygame.draw.rect(display, self.color, (*self.pos, self.width, self.height))

Если вы хотите переместить прямоугольник сразу после нажатия клавиши, я рекомендую использовать pygame.key.get_pressed вместо события KEYDOWN:

class Hero:
    # [...]

    def move(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.pos[0] -= 1 
        if keys[pygame.K_RIGHT]:
            self.pos[0] += 1
        if keys[pygame.K_UP]:
            self.pos[1] -= 1 
        if keys[pygame.K_DOWN]:
            self.pos[1] += 1

Полный код:

import pygame
import random
import math
import sys

screenWidth = 1200
screenHeight = 600

class Hero:
    def __init__(self, pos):
        self.pos = pos
        self.width = 30
        self.height = 30
        self.color = (0, 0, 0)
        self.dirX = 0
        self.dirY = 0

    def move(self, events):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.pos[0] -= 1 
        if keys[pygame.K_RIGHT]:
            self.pos[0] += 1
        if keys[pygame.K_UP]:
            self.pos[1] -= 1 
        if keys[pygame.K_DOWN]:
            self.pos[1] += 1

    def draw(self, display):
        pygame.draw.rect(display, self.color, (*self.pos, self.width, self.height))
    
    def jump(self):
        pass


    def die(self):
        pass


class Enemy:
    pass

class Background:
    pass

class Obstacles:
    pass

class Camera:
    pass

def score():
    pass


def main():
    pygame.init()
    display = pygame.display.set_mode((screenWidth, screenHeight))
    clock = pygame.time.Clock()

    heroOne = Hero([150, 450])
    running = True
    while running:
        clock.tick(300)
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        heroOne.move(events)

        display.fill((255, 255, 255))
        heroOne.draw(display)
        pygame.display.update()   

main()
0 голосов
/ 11 июля 2020

В своей функции create вы создаете новый экземпляр Hero каждый раз, когда он вызывается.

Вместо этого инициализируйте heroOne в main и передайте его в качестве аргумента, чтобы вы могли используйте это:

def main():
    pygame.init()
    heroOne = Hero([150, 450])
    clock = pygame.time.Clock()

    running = True
    while running:

        clock.tick(30)

        create(screenWidth, screenHeight, heroOne)

Также добавьте приращение в методе move:

self.dirX += 1

и:

self.dirX -= 1

Теперь объект будет перемещаться by one при каждом нажатии клавиши.

И если вы хотите непрерывное движение, вы должны указать flag, например, если это True +=1 и «Ложь» -=1, и нажатие клавиш изменит flag состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...