2012-05-05 26 views
5

Trước hết, tôi đã tìm kiếm trực tuyến và trang web này để tìm giải pháp và những thứ tôi đã thử không hoạt động nên tôi quyết định đăng câu hỏi và mã riêng của mình. Chương trình này được tạo bằng Python 3.2.2 và phiên bản tương ứng của pygame. Tôi cũng nhận ra một phương pháp hiệu quả hơn là sử dụng sprites, sprite groups và 'dirty rect' cập nhật nhưng tôi không thể chuyển đổi chương trình và vì vậy tôi sẽ tiếp tục mà không có thêm lợi ích của các chức năng như vậy.Thiết kế và phát triển phần mềm Major: Pygame Smudge Trails

Sự cố: Làm mờ các đường nhỏ nơi các 'tiểu hành tinh' đang di chuyển bị bỏ lại phía sau.
Giả thuyết: Bối cảnh được chiếu lên màn hình tuy nhiên các tiểu hành tinh được chiếu lên nền.

Vui lòng trả lời - btw tôi là một highschooler từ 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 để làm việc trên công cụ này ở trường trung học –

Trả lời

4

Về cơ bản, bạn là đúng! Các vòng tròn được vẽ trực tiếp lên nền và mọi vòng tròn mới được vẽ, các vòng tròn cũ vẫn còn. Kết quả trong các vết ố/đường mòn.

Bạn chỉ có thể thay đổi background thành screen trong phương thức draw của mình. Điều này sẽ khắc phục.

Nhưng nó thực sự đáng giá khi sử dụng các lớp Sprite như dự định. Tôi đã thực hiện một vài thay đổi đối với mã của bạn để chuyển đổi mã cho bạn. Với những thay đổi này nó chạy mà không cần những con đường mòn :)

Dưới đây là những thay đổi và sự giải thích:

Thêm này gần đầu:

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

Thêm phần này vào asteroid, __init__ phương pháp:

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

Thêm số này vào cuối def move(self):

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

thay đổi:

my_particles = [] 

tới:

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

thay đổi:

my_particles.append(target) 

tới:

my_particles.add(target) 

thay đổi:

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

tới:

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

Tháo phương pháp display vì nó không còn là cần thiết.

Điều này cũng sẽ chạy nhanh hơn rất nhiều so với mã trước đó của bạn, vì thời gian thực hiện để vẽ một cái gì đó tỉ lệ với kích thước của vùng vẽ, và trước đây nó vẽ toàn bộ nền. và thay đổi nền!

Hy vọng điều này sẽ giúp ích:

+0

Cảm ơn bạn rất nhiều, bạn là một phao cứu sinh. Những câu trả lời chi tiết như vậy tôi chưa bao giờ mong đợi một cộng đồng tốt đẹp như vậy. Ngoài ra, nơi là nhóm sprite bạn đã đặt trong mã, tôi không chắc chắn đó là "my_particles.add (target)" hoặc "my_particles = pygame.sprite.RenderUpdates()". Tôi cần phải tìm ra nó để tôi có thể di chuyển vào va chạm. @fraxel – AnjewGS

+1

@AnjewGS - cảm ơn :). Nếu tôi hiểu câu hỏi của bạn một cách chính xác, .. Tôi đã thay đổi danh sách của bạn: 'my_particles' thành một lớp pygame:' ​​pygame.sprite.RenderUpdates() 'là một tập các sprites có hiệu quả mà chúng ta có thể cần vẽ lại mỗi lần lặp. Dòng 'my_particles.add (target)' thêm các tiểu hành tinh của bạn vào tập hợp này (khi nó bắt đầu rỗng, 'add', hơi giống' append' nhưng đối với các bộ - nếu bạn không biết những bộ nào bạn nên kiểm tra chúng ra ..). – fraxel

+0

ok tuyệt, cảm ơn lần nữa. Tôi có thể sử dụng "pygame.sprite.groupcollide" này đúng không? – AnjewGS

Các vấn đề liên quan