Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame墙精灵碰撞_Python_Python 3.x_Pygame_Collision_Roguelike - Fatal编程技术网

Python Pygame墙精灵碰撞

Python Pygame墙精灵碰撞,python,python-3.x,pygame,collision,roguelike,Python,Python 3.x,Pygame,Collision,Roguelike,我正在做一个类似流氓的游戏,但在编码方面我是初学者。我已经有我的角色移动,我的墙和地板精灵,但我的代码中有一些错误,允许角色通过墙移动 screenWidth = 800 screenHeight = 600 mapHeight = 30 mapWidth = 30 cellWidth = 32 cellHeight = 32 screen = pygame.display.set_mode((screenWidth, screenHeight)) walkRight = [pygame.im

我正在做一个类似流氓的游戏,但在编码方面我是初学者。我已经有我的角色移动,我的墙和地板精灵,但我的代码中有一些错误,允许角色通过墙移动

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
我使用
block_路径
在地板和墙砖之间进行选择,然后我尝试使用它来识别墙壁,但没有真正起作用

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
接下来,您可以看到我的代码:

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
`

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
class struc\u Tile():
定义初始化(自身,块路径):
self.block\u path=block\u path`
类播放器(对象):
定义初始值(自、x、y、宽度、高度):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.vel=5
self.left=False
self.right=False
self.up=False
self.down=False
self.walkCount=0
def提取(自身,屏幕):
如果self.walkCount+1>=18:
self.walkCount=0
elif self.left:
blit(walkleet[self.walkCount//3],(self.x,self.y))
self.walkCount+=1
elif self.right:
blit(walkRight[self.walkCount//3],(self.x,self.y))
self.walkCount+=1
elif self.up:
blit(walkUp[self.walkCount//3],(self.x,self.y))
self.walkCount+=1
elif self.down:
blit(walkDown[self.walkCount//3],(self.x,self.y))
self.walkCount+=1
其他:
blit(站立[self.walkCount//3],(self.x,self.y))
self.walkCount=0
def移动(自身、dx、dy):
如果游戏地图[self.x+dx][self.y+dy].block_path==False:
self.x+=dx
self.y+=dy
def createmap():
newmap=[[y在范围(0,mapHeight)中的struc_Tile(False)]在范围(0,mapWidth)中的x中的struc_Tile(False)]
newmap[10][10]。block_path=True
newmap[10][15]。block_path=True
返回新地图
def绘图地图(maptodraw):
对于范围内的x(0,贴图宽度):
对于范围(0,贴图高度)内的y:
如果maptodraw[x][y]。块路径==True:
屏幕。blit(墙右,(x*单元宽度,y*单元高度))
其他:
屏幕。blit(地板,(x*单元宽度,y*单元高度)
def重画游戏窗口():
屏幕光点(背景,(0,0))
绘图地图(游戏地图)
字符绘制(屏幕)
pygame.display.update()
pygame.init()
gamemap=createmap()
clock=pygame.time.clock()
角色=玩家(0,0,32,32)
运行=真
运行时:
时钟滴答(18)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
keys=pygame.key.get_pressed()
如果键[pygame.K_LEFT]和character.x>character.vel:
character.x-=character.vel
character.left=True
character.right=False
character.up=False
character.down=False
character.standing=False
elif键[pygame.K_RIGHT]和character.x<800-character.width-character.vel:
character.x+=character.vel
character.left=False
character.right=True
character.up=False
character.down=False
character.standing=False
elif键[pygame.K_UP]和character.y>character.vel:
character.y-=character.vel
character.left=False
character.right=False
character.up=True
character.down=False
character.standing=False
elif键[pygame.K_DOWN]和character.y<600-character.height-character.vel:
character.y+=character.vel
character.left=False
character.right=False
character.up=False
character.down=True
character.standing=False
其他:
character.right=False
character.left=False
character.up=False
character.down=False
character.standing=True
重画游戏窗口()

createmap()
函数更改为类似的函数将在地图的钻孔器上创建一个5像素的缓冲区。我之所以将其设置为5像素,是因为角色移动就是这样

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
我建议加入一些实际的角色碰撞来测试你是否超出了边界,不管速度如何

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
编辑:我已经包含了完整的代码,因为如果我显示它们,我所做的更改更容易理解

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
我已将您的图像列表更改为dict of list,因为这样更容易调用。您要求的网格为30x30。由于您显示的单元格宽度为32x32,我将贴图更改为960 x 960

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
我扩展了你的移动方法来检查冲突,看看它是否能在移动之前移动。我还删除了你的
redraw()
函数,因为它更容易向下移动你的redraw。如果你愿意,你可以将它添加回,但在本例中,我删除了它

screenWidth = 800
screenHeight = 600
mapHeight = 30
mapWidth = 30
cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((screenWidth, screenHeight))
walkRight = [pygame.image.load('model/r1.png'), pygame.image.load('model/r2.png'), pygame.image.load('model/r3.png'), pygame.image.load('model/r4.png'), pygame.image.load('model/r5.png'), pygame.image.load('model/r6.png')]
walkLeft = [pygame.image.load('model/l1.png'), pygame.image.load('model/l2.png'), pygame.image.load('model/l3.png'), pygame.image.load('model/l4.png'), pygame.image.load('model/l5.png'), pygame.image.load('model/l6.png')]
walkUp = [pygame.image.load('model/u1.png'), pygame.image.load('model/u2.png'), pygame.image.load('model/u3.png'), pygame.image.load('model/u4.png'), pygame.image.load('model/u5.png'), pygame.image.load('model/u6.png')]
Floor = pygame.image.load("map/floor.jpg")
wallRight = pygame.image.load("map/rightwall.png")
import pygame

# Based on the paths in your image
# This should work for your image paths
image = pygame.image.load('model/standing1.png')
Standing = pygame.transform.scale(image, (32, 32))
image = pygame.image.load('map/floor.jpg')
Floor = pygame.transform.scale(image, (32, 32))
image = pygame.image.load('map/rightwall.png')
wallRight = pygame.transform.scale(image, (32, 32))

walkLeft = []
walkRight = []
walkUp = []
walkDown = []

for i in range(1, 19):
    image = pygame.image.load('model/r' + str(i) + '.png')
    walkRight.append(pygame.transform.scale(image, (32, 32)))

    image = pygame.image.load('model/l' + str(i) + '.png')
    walkLeft.append(pygame.transform.scale(image, (32, 32)))

    image = pygame.image.load('model/u' + str(i) + '.png')
    walkUp.append(pygame.transform.scale(image, (32, 32)))

    image = pygame.image.load('model/d' + str(i) + '.png')
    walkDown.append(pygame.transform.scale(image, (32, 32)))

class struc_Tile():
    def __init__(self, block_path):
        self.block_path = block_path

class player(object):
    def __init__(self,x,y,width,height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.walkCount = 0

        # do something like this with your images
        # if you keep your lists in a dict you can avoid
        # all your boolean direction variables and 
        # the lengthy if else statement
        self.images = {}
        self.images['walkleft'] = walkLeft[:]
        self.images['walkright'] = walkRight[:]
        self.images['walkup'] = walkUp[:]
        self.images['walkdown'] = walkDown[:]


    def draw(self, screen, direction):
        if self.walkCount + 1 >= 18:
            self.walkCount = 0

        # since standing is not in your dict check for that first
        if direction == 'standing':
            screen.blit(Standing, (self.x,self.y))
            self.walkCount = 0
        else:
            screen.blit(self.images[direction][self.walkCount], (self.x,self.y))
            self.walkCount += 1


    def can_move(self, dx, dy):
        # with the buffer created around the border of the map
        # you shouldn't have issues with
        # index out of bounds exceptions
        # EDIT: added better collision
        new_x = self.x + dx
        new_y = self.y + dy
        if gamemap[new_x][new_y].block_path == False:
            if gamemap[new_x + cellWidth][new_y].block_path == False:
                if gamemap[new_x][new_y + cellHeight].block_path == False:
                    if gamemap[new_x + cellWidth][new_y + cellHeight].block_path == False:
                        self.x += dx
                        self.y += dy
                        return True

def createmap():
    newmap = [[struc_Tile(False) for y in range(0, mapHeight)] for x in range (0,mapWidth)]

    # give our upper/left borders a cell width buffer
    # and our bottom/right borders a 2 cell width buffer
    # since blit uses the upper left corner this should account
    # for the sprite width
    # EDIT: Fixed this to accommodate the better collision
    for x in range(0, mapWidth):
        for y in range (0, mapHeight):
            if y < 32 or y + cellWidth >= mapHeight:
                newmap[x][y].block_path = True
            elif x < 32 or x + cellWidth >= mapWidth:
                newmap[x][y].block_path = True


    return newmap

def drawmap(maptodraw):
    # only blit at cellwidth and height intervals
    for x in range(0, mapWidth, cellWidth):
        for y in range(0, mapHeight, cellHeight):
            if maptodraw[x][y].block_path == True:
                screen.blit(wallRight, (x, y))
            else:
                screen.blit(Floor, (x, y))

# Added this function which lets you block or unblock a cell
# simply call like gamemap = block_element(5, 10, gamemap)
# this will block the 6th cell on the x axis and 11th on the y axis
# to unblock a cell call it with block=False
def block_element(x, y, maptoblock, block=True):
    x_cells = int(mapWidth / cellWidth)
    y_cells = int(mapHeight / cellHeight)

    start_x = int(x * cellWidth)
    start_y = int(y * cellHeight)

    end_x = start_x + cellWidth
    end_y = start_y + cellHeight

    print(start_x, end_x)

    if x >= 0 and x < x_cells:
        if y >= 0 and y < y_cells:
            for x in range(start_x, end_x):
                for y in range(start_y, end_y):
                    maptoblock[x][y].block_path = block

    return maptoblock   

pygame.init()

mapHeight = 960
mapWidth = 960

cellWidth = 32
cellHeight = 32

screen = pygame.display.set_mode((mapWidth, mapHeight))

gamemap = createmap()
# blocking/unblocking example
gamemap = block_element(5, 10, gamemap)
gamemap = block_element(0, 8, gamemap, block=False)
gamemap = block_element(0, 9, gamemap, block=False)

clock = pygame.time.Clock()
character = player(64, 64, 32, 32)

run = True
while run:
    clock.tick(18)
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:

            run = False
    # I just used fill since I didn't have a bg image handy
    screen.fill((0, 0, 0))
    drawmap(gamemap)

    # handle the keypresses
    # first check if the character can move that much
    # then draw the movement
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and character.can_move(0 - character.vel, 0):
        character.draw(screen, 'walkleft')
    elif keys[pygame.K_RIGHT] and character.can_move(character.vel, 0):
        character.draw(screen, 'walkright')
    elif keys[pygame.K_UP] and character.can_move(0, 0 - character.vel):
        character.draw(screen, 'walkup')
    elif keys[pygame.K_DOWN] and character.can_move(0, character.vel):
        character.draw(screen, 'walkdown')
    else:
        character.draw(screen, 'standing')

导入pygame
#基于图像中的路径
#这应该适用于您的图像路径
image=pygame.image.load('model/standing1.png')
站立=pygame.transform.scale(图像,(32,32))
image=pygame.image.load('map/floor.jpg'))
Floor=pygame.transform.scale(图像,(32,32))
image=pygame.image.load('map/rightwall.png')
wallRight=pygame.transform.scale(图像,(32,32))
walkLeft=[]
walkRight=[]
walkUp=[]
巡检=[]
对于范围(1,19)内的i:
image=pygame.image.load('model/r'+str(i)+'.png')
append(pygame.transform.scale(图像,(32,32)))
image=pygame.image.load('model/l'+str(i)+'.png')
append(pygame.transform.scale(图像,(32,32)))
image=pygame.image.load('model/u'+str(i)+'.png')
append(pygame.transform.scale(图像,(32,32)))
image=pygame.image.load('model/d'+str(i)+'.png')
walkDown.append(pygame.transform.scale(图像,(32,32)))
类struc_Tile():
定义初始化(自身,块路径):
self.block\u path=block\u path
类播放器(对象):
定义初始值(自、x、y、宽度、高度):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.vel=5
self.walkCount=0
#用你的图像做一些类似的事情
#如果你把你的清单保存在一张纸上,你可以