ホーム>source

ローグライクなゲームを作っていますが、コーディングに関しては初心者です。私はすでにキャラクターの移動、壁と床のスプライトを持っていますが、キャラクターが壁を移動できるようにするコードにエラーがあります。

私は block_path を使いました床と壁のタイルのどちらかを選択し、それを使って壁を認識しようとしましたが、実際には機能しませんでした。

次に、私のコードを見ることができます:

<前>ウィズウィズ

`

<前>ウィズウィズ 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")
あなたの答え
  • 解決した方法 # 1

    createmap() の変更  このような関数を使用すると、マップのボーダーに5ピクセルのバッファが作成されます。 5ピクセルにしたのは、それがキャラクターの動きだからです。

    速度に関係なく範囲外かどうかをテストするために、実際のキャラクターの衝突を入れることをお勧めします。

    編集:私が行った変更は、表示するとわかりやすくなるため、完全なコードを含めました。

    私はあなたがそれらをそのように呼ぶのがより簡単であるので、あなたの画像リストをリストの口述に変えました。リクエストしたグリッドは30x30です。 32x32のセル幅を表示したので、マップを960 x 960に変更しました。

    衝突をチェックして移動する前に移動できるかどうかを確認するように、moveメソッドを拡張しました。私もあなたの redraw() を削除しました  単に再描画を下に移動する方が簡単だったので、機能します。必要に応じて再度追加できますが、この例では削除しました。

    <前>ウィズウィズ 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 if gamemap[self.x + dx][self.y + dy].block_path == False: self.x += dx self.y += dy return True else: return False 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 for x in range(0, mapWidth): for y in range(0, mapHeight): if y < cellHeight or y + (cellHeight * 2) > mapHeight: newmap[x][y].block_path = True elif x < cellWidth or x + (cellWidth * 2) > 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)) pygame.init() mapHeight = 960 mapWidth = 960 cellWidth = 32 cellHeight = 32 screen = pygame.display.set_mode((mapWidth, mapHeight)) gamemap = createmap() 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')

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ javascript - documentgetElementByIdを使用して複数の(異なる)Div IDを参照します