2016-04-14 10 views
1

imあなたに向かって来ている兵士がいるところでシンプルなゲームを作ろうとしていて、それらを「殺す」ためにそれらをクリックすると、 ..... ..... しかし、私はpygameマウスクリックイベントに問題があり、それはちょうど仕事をしません。これまでのところ HERESに私のコード:マウスの左ボタンをテストするためにPython:pygameマウスクリックで画像を削除して再度作成する

import pygame, math 
from random import randrange 

import sys, math, pygame 
from operator import itemgetter 

def getKey(customobj): 
    return customobj.getKey() 

class Point3D: 
    def __init__(self, imfiles, nfrm, x = 0, y = 0, z = 0): 
     self.x, self.y, self.z = float(x), float(y), float(z) 
     self.frms = [] 
     self.nfrm=nfrm 
     self.index=0 
     for k in range(0,nfrm): 
      im=pygame.image.load(imfiles+'_'+str(k+1)+'.png') 
      im.set_colorkey((0,0,0)) 
      self.frms.append(im)  

    def 

    project(self, win_width, win_height, fov, viewer_distance): 
    """ Transforms this 3D point to 2D using a perspective projection. """ 
    factor = fov/(viewer_distance + self.z) 
    x = self.x * factor + win_width/2 
    y = -self.y * factor + win_height/2 
    return Point3D(x, y, self.z) 

def draw3D(self, wsurface, fov, viewer_distance, max_depth): 
    win_width=wsurface.get_width() 
    win_height=wsurface.get_height() 
    factor = fov/(viewer_distance + self.z) 
    x = self.x * factor + win_width/2 
    y = -self.y * factor + win_height/2 
    size = int((1 - float(self.z)/max_depth) * 64) 
    im=pygame.transform.smoothscale(self.frms[self.index],(size,size)) 
    try: 
     wsurface.blit(im, (x, y)) 
    except: 
     print((x,y)) 
    self.index=self.index+1 
    if self.index >= self.nfrm: 
     self.index=0 

def getKey(self): 
    return -self.z 


class StartField: 
def __init__(self, num_stars, max_depth): 
    pygame.init() 

    myWin = pygame.display.set_mode((640, 450), 0, 32) 
    pygame.display.set_caption('Drawing') 

    self.screen = myWin.subsurface([0,0,640,400]); 
    self.txtwin = myWin.subsurface([0,400,640,50]); 
    pygame.display.set_caption("Task C") 

    self.clock = pygame.time.Clock() 
    self.num_stars = num_stars 
    self.max_depth = max_depth 

    self.init_stars() 

def init_stars(self): 
    """ Create the starfield """ 
    self.stars = [] 
    for i in range(self.num_stars): 
     # A star is represented as a list with this format: [X,Y,Z] 
     star = Point3D('im',8,randrange(-25,25), randrange(-25,25), randrange(1, self.max_depth)) 
     self.stars.append(star) 

def move_and_draw_stars(self): 
    """ Move and draw the stars """ 
    origin_x = self.screen.get_width()/2 
    origin_y = self.screen.get_height()/2 

    stars=sorted(self.stars,key = getKey) 

    for star in stars: 
     # The Z component is decreased on each frame. 
     star.z -= 0.05 

     # If the star has past the screen (I mean Z<=0) then we 
     # reposition it far away from the screen (Z=max_depth) 
     # with random X and Y coordinates. 
     if star.z <= 0: 
      star.x = randrange(-25,25) 
      star.y = randrange(-25,25) 
      star.z = self.max_depth 

     # Convert the 3D coordinates to 2D using perspective projection. 
     star.draw3D(self.screen, 128, 0, self.max_depth) 

def run(self): 
    """ Main Loop """   
    bgPicture = pygame.transform.smoothscale(pygame.image.load('Starfield.jpg'),(self.screen.get_width(),self.screen.get_height())) 
    font = pygame.font.Font(None, 36)  

    while 1: 
     # Lock the framerate at 50 FPS. 
     self.clock.tick(50) 

     # Handle events. 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       return 

     self.screen.blit(bgPicture, [0,0]) 
     self.move_and_draw_stars() 

     # Text window outputs 
     self.txtwin.fill([200,200,200]) 
     text = font.render("Total Score: ", 1, (10, 10, 10)) 
     self.txtwin.blit(text, [5, 5]) 

     pygame.display.update() 

    if __name__ == "__main__": 
    StartField(256, 24).run() 


     pygame.init() 
     pygame.mixer.init() 
     sounda= pygame.mixer.Sound("MuseUprising.mp3") 

     sounda.play() 
+1

"それは単に機能しません"とはどういう意味ですか? _does_何が起こるか?エラーメッセージが出ますか?彼らは何ですか?彼らはどのようなコード行を参照していますか? – Chris

+0

オブジェクトは遠くから画面に向かって来て、マウスの位置を取得するためにpygame.mouse.get_posを使って試してみたものをクリックしてから、pygame.mouse.get_pressed()をマウスが画像上にあるかどうかを確認するためにSpriteが使用されているかどうかを確認するclicked_sprites = [s.rect.collidepoint(pos)]の場合はスプライト内のsを指定し、Sprite.remove()を使用してイメージを削除し、再びsprite.add()を使用して –

答えて

0

if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]: 

兵士にpygame.Rectを与える場合は、のようなマウスポインタとの衝突を確認するためにそれを使用することができますこれは:

mouse_pos = pygame.mouse.get_pos() 
if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0] and self.rect.collidepoint(mouse_pos): 
+0

私はどのように兵士にパイゲームを与えますか?レクト?あなたが私に与えた他のコードは、私が心に持っていたものと似ているようです。 –

+0

遅れて申し訳ありません、仕事中です。私はあなたが兵士のためにpoint3Dクラスを使用していると仮定していますか?そこにrectを追加し、None:self.rect = Noneに設定します。 draw関数では、xとyとイメージサイズを使って実際のrect座標を設定します: 'self.rect = pygame.Rect(x、y、im.get_width()、im.get_height())' – marienbad

関連する問題