Уведомления

Группа в Telegram: @pythonsu

#1 Май 1, 2010 12:27:00

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

подстановка этого числа в координаты спрайта и перерисовка спрайта на новом месте

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)

Офлайн

#2 Май 2, 2010 13:34:52

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

Не удивительно:) Тут же все очевидно: randdig считается всего один раз в начале скрипта. Добавьте в конструктор Bpoint параметр-координаты, В ТЕЛЕ цикла считайте randdig = random.randint(20, 50) и передавайте в Bpoint. И все у вас зарисуется:)



Офлайн

#3 Май 3, 2010 14:56:58

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

Большое спасибо, вот так

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() передвигает уже имеющийся спрайт, а не рисует еще один вдобавок к старому
Просто сейчас рисуется второй, третий, четвертый спрайт и т.д.



Отредактировано (Май 3, 2010 14:57:35)

Офлайн

#4 Май 3, 2010 15:46:37

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

Что смущает, так это то что он в течении всего цикла выполненеия программы непрерывно генерирует случаные числа. Но это навернео не страшно )



Офлайн

#5 Май 3, 2010 17:03:14

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

rudm
Хотя, я привык думать что rect.move_ip() передвигает уже имеющийся спрайт
Все верно, но: в программе вы создаете множество объектов Bpoint и каждый из них перемещаете. Соответственно, если вам надо перемещать один объект, то вот это
        self.image, self.rect = load_image('bpoint.png', -1)
self.rect.move_ip(360, randdig)
надо запихать в отдельный метод, объект создавать до цикла, а метод вызывать в теле цикла с новыми значениями.
ЗЫ И че я такой добрый?
ЗЫЫ Книжки какие читали? С ООП знакомы? А то уровень навыков программирования (без обид) оставляет желать лучшего



Офлайн

#6 Май 4, 2010 15:24:10

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

у меня вообще нет никакого уровня, потому что я читал только самоучитель по питону, с ООП не знаком тоже, а вам спасибо за ответ )



Офлайн

#7 Май 4, 2010 18:43:15

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

прошу прощения конечно )) может быть я чего то не понял, но оно не работает )))

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)

Офлайн

#8 Май 5, 2010 08:39:32

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

Глянул я вот на эту ссылочку, и она мне очень понравилась:)
http://www.linuxjournal.com/article/7694
Я подробно не вчитывался, но автор предлагает в классе спрайта (там был Ship, у вас Bpoint) определить метод update(self), где и прописать сие перемещение. А уже в главном цикле у группы спрайтов (в вашем случае bpoint_sprites) вызывать метод update(), который в свою очередь сам вызовет метод update для всех спрайтов группы



Офлайн

#9 Май 12, 2010 18:20:11

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

Cпасибо, сейчас посмотрю.



Офлайн

#10 Май 12, 2010 19:10:26

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Генерирование случайного числа при каждом нажатии на клавишу и (+)

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

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()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version