Pygame rect.move_ip 不起作用

问题描述 投票:0回答:2

所以我尝试在 Pygame 中编写我的第一个真正的游戏(不使用精灵),但是用 pygame.rect 制作的碰撞检测不起作用,所以我试图找到问题所在,结果发现 rect.mouve ip 没有工作了。 源代码如下:

import pygame
from splayer import *
pygame.init()
window = pygame.display.set_mode((800,600))
pygame.display.set_caption('Mein erstes Spiel')
white = (255,255,255)
clock = pygame.time.Clock()
gravity = 1
player = Spieler(10,100)
g1 = pygame.image.load('gunter1.png')
g2 = pygame.image.load('gunter.png')
b1 = pygame.image.load('block.png')
gameLoop=True
y2 = 400
while gameLoop:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            gameLoop=False
    window.fill(white)
    window.blit(b1, (10,y2))
    block1 = pygame.Rect(10, y2, 100, 100)
    window.blit(b1, (100,y2))
    block2 = pygame.Rect(100, y2, 100, 100)
    window.blit(b1, (200,y2))
    block3 = pygame.Rect(200, y2, 100, 100)
    window.blit(b1, (300,y2))
    block4 = pygame.Rect(300, y2, 100, 100)
    window.blit(b1, (400,y2))
    block5 = pygame.Rect(400, y2, 100, 100)
    rplayer = pygame.Rect(player.x, player.y, 100, 100)
    rplayer.move_ip(player.x, player.y)
    if rplayer.colliderect(block1) == True:
        gravity = 0
    player.update(gravit)
    player.render(window, g1)
    key = pygame.key.get_pressed()
    if key[pygame.K_SPACE]:
        window.blit(g2, (player.x,player.y))
    if key[pygame.K_d]:
        player.x += 20
    if key[pygame.K_a]:
        player.x -= 20
    if key[pygame.K_w]:
        player.y -= 20
    pygame.display.flip()
    clock.tick(10)
pygame.quit()

这是我自己编写的玩家类“splayer.py”

class Spieler:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.v = 0
        self.rplayer = pygame.Rect(self.x, self.y, 100, 100)
    def update(self, gravity):
        self.v+=gravity
        self.y+=self.v
    def render(self, window, g1):
        window.blit(g1, (self.x,self.y))

但是造成问题的部分显然是这部分:

rplayer = pygame.Rect(player.x, player.y, 100, 100)
rplayer.move_ip(player.x, player.y)
if rplayer.colliderect(block1) == True:
    gravity = 0

希望你能找到问题所在


我在实现代码时仍然遇到一些问题:

import pygame
from splayer3 import *
pygame.init()
window = pygame.display.set_mode((800,600))
pygame.display.set_caption('Mein erstes Spiel')
white = (255,255,255)
clock = pygame.time.Clock()
gravity = 1
player = Spieler
g1 = pygame.image.load('gunter1.png')
g2 = pygame.image.load('gunter.png')
b1 = pygame.image.load('block.png')
gameLoop=True
y2 = 400
while gameLoop:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            gameLoop=False
    window.fill(white)

    window.blit(b1, (10,y2))
    block1 = pygame.Rect(10, y2, 100, 100)
    window.blit(b1, (100,y2))
    block2 = pygame.Rect(100, y2, 100, 100)
    window.blit(b1, (200,y2))
    block3 = pygame.Rect(200, y2, 100, 100)
    window.blit(b1, (300,y2))
    block4 = pygame.Rect(300, y2, 100, 100)
    window.blit(b1, (400,y2))
    block5 = pygame.Rect(400, y2, 100, 100)

    x, y = player.getPosition()
    player.move(x, y)
    #player.rplayer.move_ip(player.x, player.y)
    if player.rplayer.colliderect(block1) == True:
        gravity = 0
    player.update(gravity,)
    player.render(window, g1)
    key = pygame.key.get_pressed()
    if key[pygame.K_SPACE]:
        window.blit(g2, (player.x,player.y))
    if key[pygame.K_d]:
        player.x += 20
    if key[pygame.K_a]:
        player.x -= 20
    if key[pygame.K_w]:
        player.y -= 20
    pygame.display.flip()
    clock.tick(10)
pygame.quit()

又是斯皮勒课:

import pygame
class Spieler:
    def __init__(self):
        self.v = 0
        self.rplayer = pygame.Rect(10, 100, 100, 100)

    def getPosition(self):
        return self.rplayer.x, self.rplayer.y

    def update(self, gravity):
        self.v+=gravity
        self.y+=self.v

    def render(self, window, g1):
        window.blit(g1, (self.x,self.y))

    def move(self, x, y):
        self.rplayer.move_ip(x, y)

我收到错误:

文件“spiel3.py”,第 32 行,位于 x, y = 玩家.getPosition() 类型错误:必须使用 Spieler 实例作为第一个参数来调用未绑定方法 getPosition()(什么也没得到)

python pygame rect
2个回答
1
投票

每次开始循环时,您都会创建一个 rPlayer 矩形。稍后您移动它,但矩形永远不会保存 - 您在下一次迭代时使用旧值创建一个新矩形。

您应该选择一个并坚持使用,而不是在 Spiele 类中使用 x、y 和 rect 值。我认为最好有一个矩形,并创建一个函数来返回坐标(如果我们需要的话)。

def getPosition(self):
    return self.rplayer.x, self.rplayer.y

self.x
类中删除
self.y
Spiele

为了更清楚,我们可以为

Spieler
创建一个移动函数,如下所示:

def move(x,y):
    self.rplayer.move_ip(x,y)

最后,您想要更改下面的移动代码以调用 move(),而不是修改

player.x
player.y


-2
投票

耶耶耶斯基比迪

lkfdsasdfghjkkjhgfdefghjklkjhgf

© www.soinside.com 2019 - 2024. All rights reserved.