在Pygame中移动矩形

5

我正在制作一款游戏时遇到了问题... 我无法移动矩形,也没有任何错误代码?.. 我认为问题是它在 while 循环中一遍又一遍地创建矩形... 但我不知道如何解决这个问题。

#! /usr/bin/env python

import os
import random
import pygame
import math
import sys

os.environ["SDL_VIDEO_CENTERED"] = "1"

screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("LEVEL 2 = Find the Correct Square!")

clock = pygame.time.Clock()

class Player(object):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, (0, 0, 128), (64, 54, 16, 16))

    def handle_keys(self):
        key = pygame.key.get_pressed()
        dist = 1
        if key[pygame.K_LEFT]:
           self.rect.move(-1, 0)
        if key[pygame.K_RIGHT]:
           self.rect.move(1, 0)
        if key[pygame.K_UP]:
           self.rect.move(0, -1)
        if key[pygame.K_DOWN]:
           self.rect.move(0, 1)

    def draw(self, surface):
        pygame.draw.rect(screen, (0, 0, 128), (64, 54, 16, 16))

pygame.init()

player = Player()
clock = pygame.time.Clock()

running = True       
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            break
            running = False

        screen.fill((255, 255, 255))

        player.draw(screen)
        player.handle_keys()
        pygame.display.update()

        clock.tick(40)

1
self.rect = pygame.Rect(start_x, start_y, width, height) - Malik Brahimi
4个回答

8

您需要对Player类进行一些更改。您需要重新分配self.rectself.rect.move()的结果,或者使用就地变体self.rect.move_ip()

class Player(object):
    def __init__(self):
        self.rect = pygame.rect.Rect((64, 54, 16, 16))

    def handle_keys(self):
        key = pygame.key.get_pressed()
        dist = 1
        if key[pygame.K_LEFT]:
           self.rect.move_ip(-1, 0)
        if key[pygame.K_RIGHT]:
           self.rect.move_ip(1, 0)
        if key[pygame.K_UP]:
           self.rect.move_ip(0, -1)
        if key[pygame.K_DOWN]:
           self.rect.move_ip(0, 1)

    def draw(self, surface):
        pygame.draw.rect(surface, (0, 0, 128), self.rect)

每按下一次键,矩形就会移动一次。如果你希望在按下键时继续移动,你需要将主循环的部分取消缩进。

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            break
            running = False

    screen.fill((255, 255, 255))

    player.draw(screen)
    player.handle_keys()
    pygame.display.update()

    clock.tick(40)

1

move 只是返回一个新的矩形而不改变变量,因此请使用 move_ip 进行原地移动。

pygame.draw.rect(surface, (0, 0, 128), self.rect) # draw the rect at a variable location

0
我修改了你的代码,使得它能够正常工作(这是必要的! :)),并且可以通过按下[Esc]和QUIT退出脚本,而不会被卡住(这也是必要的!)我还让你的“dist”变量(未使用)有了生命,以设置10像素的位移。然而,仍然有重要的事情需要添加,例如检查和防止小矩形跑出窗口等。
import os
import random
import pygame
from pygame.locals import * # Constants
import math
import sys

os.environ["SDL_VIDEO_CENTERED"] = "1"

screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("LEVEL 2 = Find the Correct Square!")

clock = pygame.time.Clock()

class Player(object):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, (0, 0, 128), (64, 54, 16, 16))
        self.dist = 10

    def handle_keys(self):
        for e in pygame.event.get():
            if e.type == QUIT:
                pygame.quit(); exit()
            elif e.type == KEYDOWN:
                key = e.key
                if key == K_LEFT:
                    self.draw_rect(-1, 0)
                elif key == K_RIGHT:
                    self.draw_rect(1, 0)
                elif key == K_UP:
                    self.draw_rect(0, -1)
                elif key == K_DOWN:
                    self.draw_rect(0, 1)
                elif key == K_ESCAPE:
                    pygame.quit(); exit()

    def draw_rect(self,x,y):
        screen.fill((255, 255, 255))
        self.rect = self.rect.move(x*self.dist, y*self.dist); pygame.draw.rect(screen, (0, 0, 128), self.rect)
        pygame.display.update()

    def draw(self, surface):
        pygame.draw.rect(screen, (0, 0, 128), (64, 54, 16, 16))

pygame.init()

player = Player()
#clock = pygame.time.Clock()
screen.fill((255, 255, 255))
player.draw(screen)
pygame.display.update()

while True:
  player.handle_keys()

-1
import os
import random
import pygame
import math
import sys

os.environ["SDL_VIDEO_CENTERED"] = "1"

screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("LEVEL 2 = Find the Correct Square!")

clock = pygame.time.Clock()

class Player(object):
    def __init__(self):
        self.rect = pygame.draw.rect(screen, (0, 0, 128), (64, 54, 16, 16))

    def handle_keys(self):
        key = pygame.key.get_pressed()
        dist = 1
        if key[pygame.K_LEFT]:
           self.rect.move(-1, 0)
        if key[pygame.K_RIGHT]:
           self.rect.move(1, 0)
        if key[pygame.K_UP]:
           self.rect.move(0, -1)
        if key[pygame.K_DOWN]:
           self.rect.move(0, 1)

    def draw(self, surface):
        pygame.draw.rect(screen, (0, 0, 128), (64, 54, 16, 16))

pygame.init()

player = Player()
clock = pygame.time.Clock()

running = True       
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            break
            running = False

        screen.fill((255, 255, 255))

        player.draw(screen)
        player.handle_keys()
        pygame.display.update()

        clock.tick(40)import os

似乎是一个简单问题的相当长的答案。请将答案限制在所问的问题上。 - MikeJRamsey56

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接