Python Pygame Line увеличивается в размерах

Хорошо, я делаю игру, в которой персонаж перемещается по экрану и стреляет во врагов. Он пушечное ядро ​​над ним (линия;)), но здесь у меня проблема. В классе Cannon (ниже) я вращаю линию вокруг игрока, и это отлично работает. Проблема, с которой я сталкиваюсь, заключается в том, что длина строки как-то увеличивается:/ Не совсем понятно, почему любая помощь приветствуется. Он вращается, если вы позволяете ему вращаться многократно (звучит немного по-детски, но да)

PS (Извините за длинный код, подумал, что я все равно его включу. Все, что вам действительно нужно, находится под классом пушки. Спасибо)

import pygame, sys
from pygame.locals import *

# Classes

class Bullet(pygame.sprite.Sprite):

    def __init__(self, x, y, targetX, targetY):
        self.x = x
        self.y = y
        self.targetX = targetX
        self.targetY = targetY
        pygame.sprite.Sprite.__init__(self, bulletGroup) 

    def update(self):
        pygame.draw.rect(screen, (251, 231, 9), (self.x, self.y, 5, 5))

class Cannon(pygame.sprite.Sprite):

    def __init__(self):
        self.x = 0
        self.y = -30
        self.xSpeed = 10
        self.ySpeed = 10
        self.right = False
        self.left = False

    def update(self):
        if self.y >= 0:
            self.xSpeed =  self.xSpeed * -1
        print self.x
        if self.right:
            if self.x < 0:
                self.x += self.xSpeed
                self.y -= self.ySpeed
            else:
                self.x += self.xSpeed
                self.y += self.ySpeed

        if self.left:
            if self.x > 0:
                self.x -= self.xSpeed
                self.y -= self.ySpeed
            else:
                self.x -= self.xSpeed
                self.y += self.ySpeed

        self.xSpeed = 0.5
        self.ySpeed = 0.5

        pygame.draw.line(screen, red, player.center, ((player.x + 14) + self.x, (player.y + 14) + self.y), 2)





class Player(pygame.sprite.Sprite):

    def __init__(self, config):
        self.loadConfig(config)
        self.x = 250
        self.y = 250
        self.up = False
        self.down = False
        self.right = False
        self.left = False
        self.canShoot = True
        self.canShootTicks = 0
        self.shooting = False

    def loadConfig(self, config):
        loaded = 0
        for line in config:

            if "health - " in line:
                self.health = int(line[9:])
                loaded += 1

            elif "damage - " in line:
                self.damage = int(line[9:])
                loaded += 1

        if loaded < 2:
            loaded = 0
            config = open("config.txt", "w")
            config = open("config.txt", "r+")
            self.writeToConfig(config)

    def writeToConfig(self, config):
        config.write("health - 100\n")
        config.write("damage - 10\n")
        config.seek(0)
        self.loadConfig(config)

    def update(self):
        if self.canShootTicks > 2:
            self.canShoot = True
        self.shoot()
        if self.up and self.y > 20:
            self.y -= 5
        if self.right and self.x < 550:
            self.x += 5
        if self.left and self.x > 20:
            self.x -= 5
        if self.down and self.y < 550:
            self.y += 5
        self.canShootTicks += 1
        self.center = (self.x + 14, self.y + 15)
        screen.blit(playerImg, (self.x, self.y))

    def shoot(self):
        if player.canShoot:
            if player.shooting:
                bullet = Bullet(self.x, self.y, 10, 10)
                bulletGroup.add(bullet)
                self.canShootTicks = 0
                self.canShoot = False



# Functions


def getResources():

    wallImgTop = pygame.image.load("wallTop.png")
    wallImgSide = pygame.image.load("wallSide.png")
    wallImgCorner1 = pygame.image.load("wallCorner1.png")
    wallImgCorner2 = pygame.image.load("wallCorner2.png")
    wallImgCorner3 = pygame.image.load("wallCorner3.png")
    wallImgCorner4 = pygame.image.load("wallCorner4.png")
    playerImg = pygame.image.load("player.png")

    return (wallImgTop, wallImgSide, wallImgCorner1, wallImgCorner2, wallImgCorner3, wallImgCorner4, playerImg)


def drawWalls():
    for i in range (4):
        if i == 0 or i == 2:
            direction = 0
        else:
            direction = 580

        for n in range(20):
            if i < 2:
                screen.blit(wallImgTop, (n * 30, direction))
            else:
                screen.blit(wallImgSide, (direction, n * 30))

    screen.blit(wallImgCorner1, (-6, -1))
    screen.blit(wallImgCorner2, (567, -6))
    screen.blit(wallImgCorner3, (-1, 564))
    screen.blit(wallImgCorner4, (564, 567))


def loadSave():

    try:
        config = open("config.txt", "r+")
    except IOError:
        config = open("config.txt", "w")
        config = open("config.txt", "r+")

    player = Player(config)

    return player

# Starting out

pygame.init()

screen = pygame.display.set_mode((600, 600), 0, 32)
pygame.display.set_caption("Upgrady Shooter")
clock = pygame.time.Clock()

# Variables

FPS = 50

red = (255, 0, 0)
black = (0, 0, 0)




# Get goin'

wallImgTop, wallImgSide, wallImgCorner1, wallImgCorner2, wallImgCorner3, wallImgCorner4, playerImg = getResources()

bulletGroup = pygame.sprite.Group()
player = loadSave()
cannon = Cannon()


while True:

    screen.fill(black)
    drawWalls()

    bulletGroup.update()
    player.update()
    cannon.update()

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.KEYDOWN:

            if event.key == K_w:
                player.up = True

            elif event.key == K_d:
                player.right = True

            elif event.key == K_a:
                player.left = True

            elif event.key == K_s:
                player.down = True

            elif event.key == K_SPACE:
                player.shooting = True

            elif event.key == K_LEFT:
                cannon.left = True


            elif event.key == K_RIGHT:
                cannon.right = True

        elif event.type == pygame.KEYUP:

            if event.key == K_w:
                player.up = False

            elif event.key == K_d:
                player.right = False

            elif event.key == K_a:
                player.left = False

            elif event.key == K_s:
                player.down = False

            elif event.key == K_SPACE:
                player.shooting = False

            elif event.key == K_LEFT:
                cannon.left = False

            elif event.key == K_RIGHT:
                cannon.right = False

    pygame.display.update()

1 ответ

Решение

Независимые позиции

Скорость Player и скорость Cannon не то же самое, первое по существу 5 (например self.x += 5) и второе 10 начать (self.xSpeed = 10) но затем установите 0.5 (self.xSpeed = 0.5).

Затем, когда вы используете центр игрока в качестве начальной точки для линии, и включите пушку x а также y в качестве конечной точки линия меняет длину.

Более конкретно, ваша линия рисования пушки

pygame.draw.line(screen, red, player.center, ((player.x + 14) + self.x, (player.y + 14) + self.y), 2)

так что начальная точка линии player.centerв то время как конечная точка содержит self.x а также self.y...

Круговое движение

Для реализации кругового движения необходимо использовать что-то вроде

x = r * sin(2*PI*t/PERIOD),  
y = r * cos(2*PI*t/PERIOD)

или, более вероятно, они будут помещены в справочную таблицу (т. е. сгенерируют все значения x и y для 0–2 PI).

Другие уравнения также могут быть использованы

Другие вопросы по тегам