我的精灵为什么不动?

时间:2014-07-11 02:31:40

标签: python background pygame sprite blit

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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)

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