Форум сайта python.su
подстановка этого числа в координаты спрайта и перерисовка спрайта на новом месте
import os, sys
import pygame
from pygame.locals import *
import random
from helpers import *
pygame.init()
window = pygame.display.set_mode((640, 480))
pygame.display.flip()
pygame.key.set_repeat(300, 20)
randdig = random.randint(20, 50)
class Bpoint(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('bpoint.png', -1)
self.rect.move_ip(randdig, 240)
while 1:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN:
if event.key == K_UP:
bpoint = Bpoint()
bpoint_sprites = pygame.sprite.RenderPlain((bpoint))
bpoint_sprites.draw(window)
pygame.display.flip()
Отредактировано (Май 1, 2010 12:27:54)
Офлайн
Не удивительно:) Тут же все очевидно: randdig считается всего один раз в начале скрипта. Добавьте в конструктор Bpoint параметр-координаты, В ТЕЛЕ цикла считайте randdig = random.randint(20, 50) и передавайте в Bpoint. И все у вас зарисуется:)
Офлайн
Большое спасибо, вот так
import os, sys
import pygame
from pygame.locals import *
import random
from helpers import *
pygame.init()
window = pygame.display.set_mode((640, 480))
pygame.display.flip()
pygame.key.set_repeat(300, 20)
class Bpoint(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('bpoint.png', -1)
self.rect.move_ip(360, randdig)
while 1:
randdig = random.randint(20, 300)
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN:
if event.key == K_UP:
bpoint = Bpoint()
bpoint_sprites = pygame.sprite.RenderPlain((bpoint))
bpoint_sprites.draw(window)
pygame.display.flip()
Отредактировано (Май 3, 2010 14:57:35)
Офлайн
Что смущает, так это то что он в течении всего цикла выполненеия программы непрерывно генерирует случаные числа. Но это навернео не страшно )
Офлайн
rudmВсе верно, но: в программе вы создаете множество объектов Bpoint и каждый из них перемещаете. Соответственно, если вам надо перемещать один объект, то вот это
Хотя, я привык думать что rect.move_ip() передвигает уже имеющийся спрайт
self.image, self.rect = load_image('bpoint.png', -1)
self.rect.move_ip(360, randdig)
Офлайн
у меня вообще нет никакого уровня, потому что я читал только самоучитель по питону, с ООП не знаком тоже, а вам спасибо за ответ )
Офлайн
прошу прощения конечно )) может быть я чего то не понял, но оно не работает )))
import os, sys
import pygame
from pygame.locals import *
import random
from helpers import *
pygame.init()
window = pygame.display.set_mode((640, 480))
pygame.display.flip()
pygame.key.set_repeat(300, 20)
class Bpoint(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('bpoint.png', -1)
self.rect.move_ip(20, 20)
self.x_dist = 0
self.y_dist = 0
def move(self):
xMove = 0
yMove = 0
if event.type == KEYDOWN:
if event.key == K_UP:
xMove = self.x_dist
yMove = self.y_dist
self.rect.move_ip(xMove, yMove)
bpoint = Bpoint()
bpoint_sprites = pygame.sprite.RenderPlain((bpoint))
bpoint_sprites.draw(window)
pygame.display.flip()
while 1:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN:
if event.key == K_UP:
bpoint.x_dist = random.randint(10,50)
bpoint.y_dist = random.randint(10,50)
bpoint.move()
bpoint_sprites.draw(window)
pygame.display.update()
Отредактировано (Май 4, 2010 18:47:06)
Офлайн
Глянул я вот на эту ссылочку, и она мне очень понравилась:)
http://www.linuxjournal.com/article/7694
Я подробно не вчитывался, но автор предлагает в классе спрайта (там был Ship, у вас Bpoint) определить метод update(self), где и прописать сие перемещение. А уже в главном цикле у группы спрайтов (в вашем случае bpoint_sprites) вызывать метод update(), который в свою очередь сам вызовет метод update для всех спрайтов группы
Офлайн
Cпасибо, сейчас посмотрю.
Офлайн
А надо было добавить четыре строчки кода )) Но, кто же знал )))
Я подозревал что должна быть функция очищения экрана от спрайтов, и благодаря вам нашел ее. (Просто вызываю ее на каждое нажатие клавиши, перед рисование спрайта и она, соответственно стирает старый перед прорисовкой нового)
Вот, в таком виде все работает как задумано:
import os, sys
import pygame
from pygame.locals import *
import random
from helpers import *
pygame.init()
pygame.key.set_repeat(300, 20)
window = pygame.display.set_mode((640, 480))
pygame.display.flip()
bground = pygame.Surface(window.get_size())
bground = bground.convert()
bground.fill((0,0,0))
class Bpoint(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('bpoint.png', -1)
self.rect.move(20, 20)
self.x_dist = 0
self.y_dist = 0
def move(self):
xMove = 0
yMove = 0
if event.type == KEYDOWN:
if event.key == K_UP:
xMove = self.x_dist
yMove = self.y_dist
self.rect.move_ip(xMove, yMove)
bpoint = Bpoint()
bpoint_sprites = pygame.sprite.RenderPlain((bpoint))
bpoint_sprites.draw(window)
pygame.display.flip()
while 1:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if event.type == KEYDOWN:
if event.key == K_UP:
bpoint_sprites.clear(window, bground)
bpoint.x_dist = random.randint(10,50)
bpoint.y_dist = random.randint(10,50)
bpoint.move()
bpoint_sprites.draw(window)
pygame.display.update()
Офлайн