2012-05-05 12 views
5

Po pierwsze, przeszukałem strony internetowe i tę stronę, szukając rozwiązań, a te, które próbowałem, nie działają, więc zdecydowałem się zamieścić moje indywidualne pytanie i kod. Ten program został utworzony przy użyciu Python 3.2.2 i odpowiedniej kompatybilnej wersji pygame. Zdaję sobie również sprawę, że bardziej skuteczną metodą byłoby używanie ikonek, grup sprite'owych i "dirty rect" aktualizujących, ale nie jestem w stanie przekonwertować programu i tak będę kontynuował bez dodatkowych korzyści z takich funkcji.Projektowanie i rozwój oprogramowania Major: Pygame Smudge Trails

Problem: śladowe smugi, w których poruszają się "asteroidy", pozostają.
Hipoteza: tło zostaje pobrudzone na ekranie, ale asteroidy są pobrudzone na tło.

Proszę odpowiedzieć - btw ja jestem highschooler z AUS: D

import pygame 
import random 
import math 
pygame.init() 

height = 550 
width = 750 
screen = pygame.display.set_mode((width, height)) 
background = pygame.image.load("Planet.jpg") 
Clock = pygame.time.Clock() 


class asteroid(pygame.sprite.Sprite): 
    def __init__(self, x, y, size): 
     pygame.sprite.Sprite.__init__(self) 
     self.x = x 
     self.y = y 
     self.size = 15 
     self.speed = 0.0 
     self.angle = 0 
     self.colour = (171, 130, 255) 
     self.thickness = 0 

def display(self): 
    pygame.draw.circle(background, self.colour, (int(self.x),int(self.y)), self.size, self.thickness) 

    pygame.draw.circle(background, (255, 255, 255), (int(self.x),int(self.y)), self.size, 1) 

def move(self): 
    self.x += math.sin(self.angle) * self.speed 
    self.y -= math.cos(self.angle) * self.speed 

def boundaries(self): 
    if self.x > width - self.size: 
     self.x = 0 + self.size 
    elif self.x < self.size: 
     self.x = width - self.size 
    if self.y > height - self.size: 
     self.y = 0 + self.size 
    elif self.y <self.size: 
     self.y = height - self.size 




num_target = 5 
my_particles = [] 
num_particles = len(my_particles) 
while num_particles < 5: 
    for n in range(num_target): 
     size = 20 
     x = random.randint(size, height - size) 
     y = random.randint(size, width - size) 
     target = asteroid(x, y, size) 
     target.speed = random.uniform(1.0, 1.0) 
     target.angle = random.uniform(0, math.pi*2) 
     my_particles.append(target) 
     num_particles = num_particles + 1 


def main(): 
    pygame.display.set_caption("Anyu's Game") 
    screen.blit(background, (0,0)) 
    pygame.display.update() 
    score = (pygame.time.get_ticks()/1000) 
    print (score) 


while True: 
    pygame.display.update() 
    screen.blit(background, (0,0)) 
    MouseP = pygame.mouse.get_pos() 
    frames = Clock.get_fps 
    pygame.mouse.set_visible 
    score = (pygame.time.get_ticks()/1000) 
    print (score) 
    print (MouseP) 
    for target in my_particles: 
     target.move() 
     target.boundaries() 
     target.display() 
     pygame.display.update() 


    for event in pygame.event.get(): 

     if event.type == pygame.QUIT: 
      pygame.quit(); 

if __name__=='__main__': 
    main() 
+2

+1 do pracy na tych rzeczy w liceum –

Odpowiedz

4

Zasadniczo masz rację! Kręgi są rysowane bezpośrednio na tle, a za każdym razem nowe kręgi są rysowane, stare kręgi pozostają. W wyniku smugi/szlaki.

Możesz po prostu zmienić background na screen w swojej metodzie draw. Naprawi to.

Ale naprawdę warto korzystać z klas Sprite zgodnie z przeznaczeniem. Wprowadziłem kilka zmian w kodzie, aby go dla Ciebie przełączyć. Z tych zmian to działa bez szlaków :)

Oto zmian i uściśleń:

Dodaj tę pobliżu góry:

#Create a new `pygame.Surface`, and draw a circle on it, then set transparency: 
circle = pygame.Surface((30,30)) 
circle = circle.convert() 
pygame.draw.circle(circle, (171, 130, 255), (int(15),int(15)), 15, 0) 
circle.set_colorkey(circle.get_at((0, 0)), pygame.RLEACCEL) 

dodać to do sposobu asteroid, __init__:

#Sets the asteroid image, and then the asteroids co-ords (these are in `rect`) 
     self.image = circle 
     self.rect = self.image.get_rect() 

Dodaj to do końca def move(self):

 self.rect[0] = self.x 
     self.rect[1] = self.y 

zmiana:

my_particles = [] 

do:

#This is a special pygame container class, it has a draw() method that tracks changed areas of the screen. 
my_particles = pygame.sprite.RenderUpdates() 

zmiana:

my_particles.append(target) 

do:

my_particles.add(target) 

zmiana:

while True: 
    pygame.display.update() 
    screen.blit(background, (0,0)) 
    MouseP = pygame.mouse.get_pos() 
    frames = Clock.get_fps 
    pygame.mouse.set_visible 
    score = (pygame.time.get_ticks()/1000) 
    print (score) 
    print (MouseP) 
    for target in my_particles: 
     target.move() 
     target.boundaries() 
     target.display() 
     pygame.display.update() 

do:

#initial screen draw: 
screen.blit(background, (0,0)) 
pygame.display.update() 
while True: 
    #remove previous drawn sprites and replaces with background: 
    my_particles.clear(screen, background) 
    MouseP = pygame.mouse.get_pos() 
    frames = Clock.get_fps 
    pygame.mouse.set_visible 
    score = (pygame.time.get_ticks()/1000) 
    print (score) 
    print (MouseP) 
    for target in my_particles: 
     target.move() 
     target.boundaries() 
    #draws changed sprites to the screen: 
    pygame.display.update(my_particles.draw(screen)) 

Usuń metodę display ponieważ nie jest już potrzebna.

To będzie działać dużo szybciej niż poprzedni kod, ponieważ czas potrzebny do narysowania czegoś jest proporcjonalny do rozmiaru obszaru rysowania, a poprzednio rysował całe tło za każdym razem - teraz rysuje tylko sprite'y i zmiany w tle!

Nadzieja to pomaga :)

+0

Dziękuję bardzo, jesteś ratownik. Takie szczegółowe odpowiedzi nigdy nie oczekiwały tak miłej społeczności. Również gdzie znajduje się grupa sprite, którą umieściłeś w kodzie, nie jestem pewien, czy jest to "my_particles.add (target)" lub "my_particles = pygame.sprite.RenderUpdates()". Muszę to rozgryźć, abym mógł przejść na kolizje. @fraxel – AnjewGS

+1

@AnjewGS - dzięki :). Jeśli poprawnie zrozumiem twoje pytanie, ... Zmieniłem twoją listę: 'my_particles' na klasę pygame:' ​​pygame.sprite.RenderUpdates() ', która jest w rzeczywistości zbiorem ikonek, które mogą być potrzebne do przerysowania każdej iteracji. Linia 'my_particles.add (target)' dodaje twoje asteroidy do tego zestawu (ponieważ zaczyna się pusta, 'add', jest trochę jak' append', ale dla zestawów - jeśli nie wiesz, jakie zestawy powinieneś sprawdzić je na zewnątrz ..). – fraxel

+0

ok, dzięki, jeszcze raz. Mogę użyć tego "pygame.sprite.groupcollide", prawda? – AnjewGS