簡體   English   中英

我無法在pygame中移動精靈

[英]I can't move sprites in pygame

這是我第一次使用pygame創建游戲,但發現邏輯錯誤。 該游戲包含某種拼圖,您必須單擊該拼圖然后再單擊要移動的區域來玩。 當我嘗試運行代碼時,子畫面不會移動。 我試圖修改函數move(),但沒有做任何更改。 當我運行程序並選擇並移動游戲中的拼圖時,它們又在同一位置被計算機繪制。 它們沒有按照我在代碼中編寫的坐標移動。

import pygame
from pygame.locals import *
import sys
import os
width = 1100
hight = 700
square1 = (240, 45) 
square2 = (25, 55)
square3 = (25, 245)
square4 = (248, 245)
coords1 = [800, 50]
coords2 = [550, 50]
coords3 = [550, 250]
coords4 = [810, 250]

pygame.init()
screen = pygame.display.set_mode((width, hight))
pygame.display.set_caption('Hidden Boys')

background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))

class Puzzle_piece(pygame.sprite.Sprite):
  def __init__(self, image_file, location):
    pygame.sprite.Sprite.__init__(self)
    self.counter = 0
    self.image = pygame.image.load(image_file)
    self.rect = self.image.get_rect()
    self.rect.left, self.rect.top = location
    self.state = "still"
    self.area = screen.get_rect()
    self.angle = 0
    self.movepos = [0, 0]

  def updates(self, position):
    self.rect = position

  def move(self):
      screen.blit(self.image, self.rect)

  def rotate_right(self):
      self.angle += -90
      self.image = pg.transform.rotozoom(self.orig_image, self.angle, 1)
      self.rect = self.image.get_rect(center = self.rect.center)

class Frame(pygame.sprite.Sprite):
  def __init__(self, image_file = None, location = None, dim = screen, color = (250, 250, 250)):
    pygame.sprite.Sprite.__init__(self)  #call Sprite initializer
    if image_file and location != None :
      self.image = pygame.image.load(image_file)
      self.rect = self.image.get_rect()
      self.rect.left, self.rect.top = location
    self.frame = pygame.Surface(dim.get_size())
    self.frame = self.frame.convert()
    self.frame.fill(color)

def create_text(dim, blitted, color = (0, 0, 0), font = "", msg = "", position = (width, hight), alias = True):
    font = pygame.font.SysFont(font, dim)
    text = font.render(msg, alias, color)
    textpos = text.get_rect()
    textpos.center = position
    blitted.blit(text, textpos)


def create_frames(name = "frame0", dim = screen, color = (250, 250, 250), image ="" ):
  name = pygame.Surface(dim.get_size())
  name = name.convert()
  name.fill(color)
  return name, img

def blit_frames(frame, coords = (0, 0), image = None, image_rect = None):
  if image and image_rect != None :
    frame.blit(image, image_rect)
  screen.blit(frame, coords)
  pygame.display.update()
  pygame.display.flip()

def draw_sprites(sprites, frame, group):
  for x in range(len(sprites)):
    screen.blit(frame, sprites[x].rect, sprites[x].rect)
    sprites[x].image = pygame.transform.scale(sprites[x].image, (272, 272))
  group.update()
  group.draw(screen)
  pygame.display.flip()

background = Frame()
Frame1 = Frame("images\\field1.png", [-20, 0])
Piece1 = Puzzle_piece("images\\piece11.png", coords1)
Piece2 = Puzzle_piece("images\\piece21.png", coords2)
Piece3 = Puzzle_piece("images\\piece31.png", coords3)
Piece4 = Puzzle_piece("images\\piece41.png", coords4)
sprites_group = [Piece1, Piece2, Piece3, Piece4]
Piece_sprites = pygame.sprite.RenderPlain(sprites_group)

create_text(font = "squared_display", dim = 120, msg = "HIDDEN BOYS", position = (width/2, hight/4), blitted = background.frame)
create_text(font = "squared_display", dim = 50, msg = "Click to start", position = (width/2, hight/2), blitted = background.frame)

def move_pieces(piece):
  for event in pygame.event.get():
    if pygame.mouse.get_pos() in square1:
      piece.updates(square1)
      piece.move()
    if pygame.mouse.get_pos() in square2:
      piece.updates(square2)
      piece.move()
    if pygame.mouse.get_pos() in square3:
      piece.updates(square3)
      piece.move()
    if pygame.mouse.get_pos() in square4:
      piece.updates(square4)
      piece.move()


screen.blit(background.frame, (0, 0))
pygame.display.flip()

def main():
  clock = pygame.time.Clock()

  while True:
    frame = 0
    counter = 0
    clock.tick(60)
    for event in pygame.event.get():
      if event.type == QUIT:
        return

      if event.type == pygame.MOUSEBUTTONDOWN:
        if frame == 0:
          blit_frames(Frame1.frame, Frame1.rect, image = Frame1.image, image_rect = Frame1.rect)
          draw_sprites(sprites_group, Frame1.frame, Piece_sprites)
          frame += 1
        elif frame == 1:
          if pygame.mouse.get_pos() in coords1:
            Piece1.state = "selected"
            Piece1.counter += 1
            move_pieces(Piece1)

          if pygame.mouse.get_pos() in coords2:
            Piece2.state = "selected"
            Piece2.counter += 1
            move_pieces(Piece2)

          if pygame.mouse.get_pos() in coords3:
            Piece3.state = "selected"
            Piece3.counter += 1
            move_pieces(Piece3)

          if pygame.mouse.get_pos() in coords4:
            Piece4.state = "selected"
            Piece4.counter += 1
            move_pieces(Piece4)

      if event.type == pygame.MOUSEBUTTONUP:
        if pygame.mouse.get_pos() in coords1 or coords2 or coords3 or coords4:
          if Piece1.counter % 2 != 0:
            Piece1.state = "unselected"
          if Piece2.counter % 2 != 0:
            Piece2.state = "unselected"
          if Piece3.counter % 2 != 0:
            Piece3.state = "unselected"
          if Piece4.counter % 2 != 0:
            Piece4.state = "unselected"
      pygame.display.update()
      pygame.display.flip()

if __name__ == '__main__': main()

您的updates方法將元組position分配給rect對象。 相反,請嘗試:

def updates(self, position):
    self.rect.x, self.rect.y = position

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM