Найти - Пользователи
Полная версия: Генерирование случайного числа при каждом нажатии на клавишу и (+)
Начало » Python для новичков » Генерирование случайного числа при каждом нажатии на клавишу и (+)
1
rudm
подстановка этого числа в координаты спрайта и перерисовка спрайта на новом месте
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()
Не могу понять почему не работает. По идее страйт должен рисоватся каждый раз на новом месте, но ничего не происходит.
dartNNN
Не удивительно:) Тут же все очевидно: randdig считается всего один раз в начале скрипта. Добавьте в конструктор Bpoint параметр-координаты, В ТЕЛЕ цикла считайте randdig = random.randint(20, 50) и передавайте в Bpoint. И все у вас зарисуется:)
rudm
Большое спасибо, вот так
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()
Заработало. Хотя, я привык думать что rect.move_ip() передвигает уже имеющийся спрайт, а не рисует еще один вдобавок к старому
Просто сейчас рисуется второй, третий, четвертый спрайт и т.д.
rudm
Что смущает, так это то что он в течении всего цикла выполненеия программы непрерывно генерирует случаные числа. Но это навернео не страшно )
dartNNN
rudm
Хотя, я привык думать что rect.move_ip() передвигает уже имеющийся спрайт
Все верно, но: в программе вы создаете множество объектов Bpoint и каждый из них перемещаете. Соответственно, если вам надо перемещать один объект, то вот это
        self.image, self.rect = load_image('bpoint.png', -1)
self.rect.move_ip(360, randdig)
надо запихать в отдельный метод, объект создавать до цикла, а метод вызывать в теле цикла с новыми значениями.
ЗЫ И че я такой добрый?
ЗЫЫ Книжки какие читали? С ООП знакомы? А то уровень навыков программирования (без обид) оставляет желать лучшего
rudm
у меня вообще нет никакого уровня, потому что я читал только самоучитель по питону, с ООП не знаком тоже, а вам спасибо за ответ )
rudm
прошу прощения конечно )) может быть я чего то не понял, но оно не работает )))
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()
В итоге имеем тоже самое - рисование нескольких спрайтов. Может быть я конечно чего то непонимаю ))
dartNNN
Глянул я вот на эту ссылочку, и она мне очень понравилась:)
http://www.linuxjournal.com/article/7694
Я подробно не вчитывался, но автор предлагает в классе спрайта (там был Ship, у вас Bpoint) определить метод update(self), где и прописать сие перемещение. А уже в главном цикле у группы спрайтов (в вашем случае bpoint_sprites) вызывать метод update(), который в свою очередь сам вызовет метод update для всех спрайтов группы
rudm
Cпасибо, сейчас посмотрю.
rudm
А надо было добавить четыре строчки кода )) Но, кто же знал )))
Я подозревал что должна быть функция очищения экрана от спрайтов, и благодаря вам нашел ее. (Просто вызываю ее на каждое нажатие клавиши, перед рисование спрайта и она, соответственно стирает старый перед прорисовкой нового)
Вот, в таком виде все работает как задумано:
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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB