Python OO-Pygame Cannon.Невозможно заставить пушечное ядро ​​двигаться - PullRequest
0 голосов
/ 05 октября 2011

В настоящее время я пытаюсь выполнить домашнее задание для своего класса программной инженерии.Мы создаем объектно-ориентированную пушечную игру.Нам просто нужно создать пушку и выстрелить из пушечного ядра.

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

    import pygame
    from colors import color

class Cannonball(object):
'''
classdocs
'''
    _x = 135
    _y = 310

    def __init__(self):
        '''
        Constructor for cannonball. Initiates x and y at initial values
        of x == 135 and y == 310. at 30 FPS 
        '''
        self._x = Cannonball._x
        self._y = Cannonball._y
        clock = pygame.time.Clock()
        time_passed = clock.tick(30)
        time_passed_seconds = time_passed / 1000.0


    def draw(self, screen):  
        '''
        Draws the cannonball
        '''      
        sprite = pygame.draw.circle(screen, color["red"], (self._x,self._y), 5)
        return sprite

    def move(self, screen, time_passed):
        '''
        initiates the cannonball to move until its past the screen
        '''
        speed = 50
        self._x += speed+time_passed
        self._y -= speed+time_passed    
        pygame.display.flip()

Вот мой класс по пушечному ядру

    import pygame
    import sys
    from cannon import Cannon
    from cannonball import Cannonball
    from colors import color

    pygame.init()
    '''create the GUI window'''
    screen = pygame.display.set_mode((640,480))
    pygame.display.set_caption("Cannon Game")       
    background = screen.fill(color["white"])

    clock = pygame.time.Clock()
    '''draw the Cannon onto the window'''
    aCannon = Cannon
    aCannon.draw(aCannon, screen)
    pygame.display.flip()

    while True: 
        '''handle keydown and quit events for Cannon Game. Space bar
        fires the cannonball
        '''
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.KEYDOWN:
                 if event.key == pygame.K_SPACE: 
                 aCannonball = aCannon.fire(screen)
                 cannon_ball = True
            if cannon_ball == True:
                 aCannonball.draw(screen)
                 aCannonball.move(screen, time_passed)
                 pygame.display.flip()

Это мой водитель.Попытка сохранить это простым в настоящее время, поскольку это помогло мне создать вещи до сих пор.

    import pygame
    from colors import color
    from cannonball import Cannonball

    class Cannon (object):
        '''
        classdocs
        '''

    def __init__(self):
            '''
            Constructor
            '''


        def draw(self, screen):
            pygame.draw.circle(screen, color["black"], (40,400), 20)
            pygame.draw.polygon(screen, color["black"], ([30,400], [135, 300], [150,          320], [50,400]), 0)

        def fire (self, screen):   
            print("Fire") //used this as a tester to make sure the fire call worked before attempting to have a cannonball created and move. 
            aCannonball = Cannonball()
            aCannonball.draw(screen)
            aCannonball.move(screen)

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

Я все еще пытаюсь выяснить, что я мог сделать неправильно, но любая помощь будет с благодарностью оценена.

РЕДАКТИРОВАТЬ: Я обнаружил проблему с кодом, в котором мое пушечное ядро ​​не будет двигаться.Я умножал скорость на прошедшее время, а не прибавлял.Он сорвался бы с экрана почти сразу, прежде чем его можно было увидеть.

Спасибо за помощь!Может быть, я смогу пройти мимо этого в огонь дуги.

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Есть пара проблем с фреймворком, который вы разместили здесь:

  1. Методы и переменные не имеют отступа для класса CannonBall и, следовательно, являются частью глобальной области, а не самого класса.

  2. Метод move не должен иметь цикл while, вместо этого попробуйте структурировать свою игру, как показано в следующем коде.

  3. pygame.display, который находится в вашем классе пушечного ядра, не совпадает с pygame.display, который запускается в вашей основной программе, поэтому основной дисплей не будет обновляться, чтобы делать то, что вы делаете, вам нужно передайте дисплей в основной программе классу пушечного ядра, чтобы обновить его.

  4. Вместо использования Cannon и CannonBall вам нужно использовать Cannon() и CannonBall() для инициализации конструкторов этих классов.

Каркас игры:

while True: #main loop  
    handle input  
    update spritee 
    draw to screen

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

Id рекомендует изменить ход (написано в псевдокоде):

def move(self, screen, time_passed):
    x += speed*time_passed;
    y += speed*time_passed;
    if(x out of screen remove sprite);
    if(y out of screen remove sprite);
0 голосов
/ 16 октября 2011

Я написал аналогичный класс для игры, которую мне пришлось создать.Может быть, это поможет:

'''
Created on Oct 2, 2011

@author: Mac Spinks
'''
import math
import pygame

class Cannonball(object):

    RADIUS = 4

    def __init__(self, initial_x, initial_y, launch_angle, launch_velocity, time_interval):
        self.x = initial_x
        self.y = initial_y
        self.time_interval = time_interval
        self.angle = launch_angle
        self.x_velocity = launch_velocity*math.cos(self.angle)
        self.y_velocity = launch_velocity*math.sin(self.angle)
        self.is_flying = True
        self.x_delta = self.time_interval * self.x_velocity

    def move(self):

        prev_y_velocity = self.y_velocity
        self.y_velocity = self.y_velocity - (9.8 * self.time_interval)
        self.y = (self.y + (self.time_interval * 
                             ((prev_y_velocity + self.y_velocity)/ 2)))
        self.y = max(self.y, 0)
        self.x += (self.x_delta)
        self.container = pygame.Rect(self.x - self.RADIUS, self.y - self.RADIUS, self.RADIUS*2, self.RADIUS*2)
        self.is_flying = (self.y > 0)
        self.hit_ground = (self.y <= 0)
0 голосов
/ 05 октября 2011

Вы фактически не создали экземпляр Cannonball - ваша переменная aCannonball является просто ссылкой на класс.Вам нужно вызвать класс, чтобы создать его экземпляр.Сделав это, вы можете удалить дубликаты ссылок на Cannonball в вызовах методов.

...