2014-07-11 74 views
0

我是Pygame的新手,我试图将我的精灵移动到我的背景图片上。 移动后我的精灵不再出现?有任何想法吗? 这是没有一些屏幕的大部分程序。 我一直试图让这几个小时的工作,为什么我的精灵不移动?

#dependencies 
import pygame as P 
import random as R 

def welcome(screen): 
    #load background 
    bg = P.image.load("space-wallpaper.jpg") 
    screen.blit(bg,[0,0]) 

    #set fonts etc 
    font = P.font.Font("Space_Age.ttf",60) 
    width, height = screen.get_size() 

    #play button 
    message = "PLAY " 
    text = font.render(message,1,[255 , 0, 0]) 
    rect = text.get_rect() 
    x, y = text.get_size() 
    rect = rect.move((width - x)/2, (height - y)/2) 
    screen.blit(text,rect) 

    #high_score button 
    message = "HIGH SCORE " 
    text = font.render(message,1,[255 , 0, 0]) 
    rect = text.get_rect() 
    x, y = text.get_size() 
    rect = rect.move((width - x)/2, (height - y)/2 +100) 
    screen.blit(text,rect) 

def play_button(screen): 
    """launch welcome screen. 

    """ 
    #welcome screen play button 
    font = P.font.Font("Space_Age.ttf",60) 
    message = "PLAY " 
    play_x,play_y = font.size(message) 
    play_text = font.render(message,1,[255 , 0, 0]) 
    width, height = 800,600 
    screen.blit(play_text,[(width - play_x)/2, (height - play_y)/2]) 
    play_rect = play_text.get_rect().move((width - play_x)/2, (height - play_y)/2) 
    P.display.flip() 
    return(play_rect) 

def welcome_background(screen): 
    # Welcome screen background 
    bg = P.image.load("space-wallpaper.jpg") 
    screen.blit(bg,[0,0]) 
    P.display.update() 


def high_score_screen(screen): 


"""opens the highscore screen""" 
    high_score_bg = P.image.load("bg_game.jpg") 
    screen.blit(high_score_bg,[0,0]) 
    P.display.update() 

def splash_screen(screen): 
    """loads the first screen in the game with a 3 sec wait""" 
    splash_image = P.image.load('splash.jpg') 
    screen.blit(splash_image,[0,0]) 
    P.display.update() 
    P.time.wait(2001) 

def play_game(screen): 
    """loads the play game screen""" 
    game_bg = P.image.load("bg_game.jpg") 
    screen.blit(game_bg,[0,0]) 
    P.display.update() 

def move_right(screen,x_cord,flagship): 

    dist = 20 
    play_game(screen) 
    x_cord = x_cord + dist 
    print(x_cord) 
    screen.blit(flagship,[x_cord]) 
    P.display.update() 

def key_detection(screen,flagship,x_cord): 


    key = P.key.get_pressed() 
    if key[P.K_RIGHT]: 
     move_right(screen,x_cord,flagship) 
     #move_right() 



    elif key[P.K_LEFT]: 
     print("left") 






class Sprite(): 
    def __init__(self,screen): 
     """ The constructor of the class """ 
     self.flagship = P.image.load("sprite2.png") 

     self.x = 0 
     self.y = 0 

    def display(self,screen): 
     #screen.blit(self.sprite,[self.x,self.y]) changed by geoff 
     screen.blit(self.flagship,[self.x,self.y]) 
     P.display.update() 





_init_ 

# dependencies 
from mods import * 
import pygame as P 

#initialise pygame 
P.init() 


def main(): 
    # parameters to control pygame basics 
    screen_size = width, height = 800,600 #sixe of playing screen 
    P.display.set_caption('Space Smasher!') 
    screen = P.display.set_mode(screen_size) 
    clock = P.time.Clock() # timer used to control rate of looping 
    loop_rate = 20 #number of times per second does loop 
    play = True #control the playing of the actual game 
    splash_screen(screen) 
    welcome(screen) 
    P.display.flip() 
    rect_play = play_button(screen) 
    flagship = Sprite(screen) 
    while play: 
     key_detection(screen,flagship.image,flagship.x) 
#  for event in P.event.poll(): changed by geoff 
     event = P.event.poll() #did the player do something? 
     if event.type == P.QUIT: 
      play = False 


     if event.type == P.MOUSEBUTTONDOWN: 
      player_position = P.mouse.get_pos() 
      if rect_play.collidepoint(player_position): 
       play_game(screen) 
       flagship.display(screen) 



    P.quit() 


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

这就是你的全部? 'mainloop'在哪里?你必须在每个循环的主循环中使用精灵。 – furas

+0

你好Thankyou抽出时间来帮助我,这是高度赞赏。我会在整个程序中更新它。 – Allanco

+1

您可以通过代码提供外部链接。 – furas

回答

0

你是不是要求或者你的函数或者类的任何地方。你需要一个while循环的结构类似于此:

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    #Do your movements 

在顶部以下的进口:

import pygame, sys 
from pygame.locals import * 

这里是键移动对象的例子:

import pygame, sys 
from pygame.locals import * 
pygame.init() 
WIDTH=1439 
HEIGHT=791 
DISPLAYSURF = pygame.display.set_mode((WIDTH, HEIGHT)) 
pygame.display.set_caption('Hello Pygame World!') 
pygame.key.set_repeat(1, 10) 
circx, circy = 200, 150 
CIRWIDTH=20 
while True: # main game loop 
    if pygame.key.get_pressed()[pygame.K_UP]: 
     circy-=5 
    if pygame.key.get_pressed()[pygame.K_DOWN]: 
     circy+=5 
    if pygame.key.get_pressed()[pygame.K_RIGHT]: 
     circx+=5 
    if pygame.key.get_pressed()[pygame.K_LEFT]: 
     circx-=5 
    try: 
      for event in pygame.event.get(): 
       if event.type == QUIT or event.key == pygame.K_ESCAPE or event.key == pygame.K_q: 
        pygame.quit() 
        sys.exit() 
    except AttributeError: 
      pass 
    DISPLAYSURF.fill((0, 0, 0)) 
    pygame.draw.circle(DISPLAYSURF, (158, 219, 222), (circx, circy), CIRWIDTH) 
    pygame.display.flip() 
0

主回路应类似于:

while True: 

    # events - check keyboad and mouse and change player direction or speed 

    # move - move sprite with speed and direction 

    # check collison 

    # draw background, all objects and all sprites 

    # clock - to keep constant speed - FPS (Frames Per Seconds) 

所以你必须在每个循环中移动精灵并绘制它们。

+0

所以即时通讯并不是将新的精灵画到背景上? – Allanco

+0

你有这么多的'display.update()',所以很难识别哪一个被执行,哪一个覆盖旗舰。 – furas

+0

'move_right'只能改变'cord_x'。 'blit(旗舰,...)'和'display.update()'只能在主循环中使用一次。 – furas