Отладка простой игры в пинг-понг? - PullRequest
0 голосов
/ 26 июня 2011

Я программировал простую игру в пинг-понг с использованием Pygame Python, которая запускалась через Livewires.Я разместил вопрос и похожий пример кода игры, который отлично работает, так как не все здесь будут разбираться в livewires и / или pygame.

Вот код с ошибками.Происходит следующее: открывается окно, объект «Шар» работает хорошо и падает на экран (как и должно быть, он не завершен), а объект «Плита» застревает там, где изначально находится мышь.Вот оно:

from livewires import games, color
games.init (screen_width = 640, screen_height = 480, fps = 50)

class Ball (games.Sprite):
    def iMove (self):
        self.dx = -self.dx
        self.dy = -self.dy

class Slab (games.Sprite):
    def mouse_moves (self):
        self.x = games.mouse.x
        self.y = games.mouse.y
        self.iCollide()

    def iCollide (self):
        for Ball in overlapping_sprites:
            Ball.iMove()

def main():
    #Backgrounds
    pingpongbackground = games.load_image ("pingpongbackground.jpg", transparent = False)
    games.screen.background = pingpongbackground
    #Ball: Initializing object and setting speed.
    ballimage = games.load_image ("pingpongball.jpg")
    theball = Ball (image = ballimage,
                    x = 320,
                    y = 240,
                    dx = 2,
                    dy = 2)
    games.screen.add(theball)
    #Paddle: Initializing ping pong object and setting initial poisition to the initial mouse position
    slabimage = games.load_image ("pingpongpaddle.jpg")
    theslab = Slab (image = slabimage,
                    x = games.mouse.x,
                    y = games.mouse.y)
    games.screen.add(theslab)
    games.mouse.is_visible = False
    games.screen.event_grab = True
    games.screen.mainloop()

main ()

И вот фрагмент похожего, функционирующего кода:

# Slippery Pizza Program
# Demonstrates testing for sprite collisions

from livewires import games
import random

games.init(screen_width = 640, screen_height = 480, fps = 50)


class Pan(games.Sprite):
    """" A pan controlled by the mouse. """
    def update(self):
        """ Move to mouse position. """
        self.x = games.mouse.x
        self.y = games.mouse.y
        self.check_collide()

    def check_collide(self):
        """ Check for collision with pizza. """
        for pizza in self.overlapping_sprites:
            pizza.handle_collide()


class Pizza(games.Sprite):
    """" A slippery pizza. """
    def handle_collide(self):
        """ Move to a random screen location. """
        self.x = random.randrange(games.screen.width)
        self.y = random.randrange(games.screen.height)


def main():
    wall_image = games.load_image("wall.jpg", transparent = False)
    games.screen.background = wall_image

    pizza_image = games.load_image("pizza.bmp")
    pizza_x = random.randrange(games.screen.width)
    pizza_y = random.randrange(games.screen.height)
    the_pizza = Pizza(image = pizza_image, x = pizza_x, y = pizza_y)
    games.screen.add(the_pizza)

    pan_image = games.load_image("pan.bmp")
    the_pan = Pan(image = pan_image,
                  x = games.mouse.x,
                  y = games.mouse.y)
    games.screen.add(the_pan)

    games.mouse.is_visible = False

    games.screen.event_grab = True

    games.screen.mainloop()

# kick it off!
main()

Любое понимание будет высоко ценится!

Ответы [ 2 ]

1 голос
/ 26 июня 2011

Я не знаю ваш фреймворк, но, чтобы плита не "застряла", вам нужно обновить ее местоположение при перемещении мыши.

Здесь вы инициализируете его:

 theslab = Slab (image = slabimage,
                    x = games.mouse.x,
                    y = games.mouse.y)

Тогда вот вы добавите его в игру:

games.screen.add(theslab)

Предположительно, игра будет вызывать эту функцию всякий раз, когда мышь двигается:

 def mouse_moves (self):
    self.x = games.mouse.x
    self.y = games.mouse.y
    self.iCollide()

Но этого либо не происходит, либо экран не обновляется.

Итак, вы должны узнать, выполнив следующее:

 def mouse_moves (self):
    print "mouse_moves: ", str(games.mouse.x), str(games.mouse.y) 
    self.x = games.mouse.x
    self.y = games.mouse.y
    self.iCollide()

Если вы видите, что вывод оператора print происходит при перемещении мыши, возможно, вы не обновляете экран, вам нужно проверить документацию по структуре. Но я не думаю, что это так. Я думаю, что вы не обновляете игру, когда мышь движется. Я бы предположил, что в фреймворке есть какое-то событие типа onMouseMove, к которому нужно подключиться, чтобы позволить вам обновлять состояние игры (то есть вызывать mouse_moves ()), когда происходит движение мыши. Затем при следующем обновлении экрана вы должны проверить наличие изменений (сделать объекты недействительными, пометить их как грязные), а если они грязные, обновить их часть экрана, а затем снова пометить их как чистые.

0 голосов
/ 05 марта 2018

Просто поместите этот метод обновления в класс slab:

def update(self):
    self.x=games.mouse.x
    self.y=games.mouse.y

Он будет запускаться автоматически каждые 50 секунд (ваша скорость обновления).В настоящее время вы просто запускаете плиту в позиции мыши и оставляете ее там.

...