人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

pygameで2DRPG!マップ作成〜プレイヤー移動

今回は、pythonを使って2DのRPGドラゴ◯クエストっぽいものを作成しようと思ってググってみたら下記のブログで詳しく書いてありましたので参考にして作ってみました。

aidiary.hatenablog.com

 

 

目的

pygameでマップ作成〜プレイヤー移動

 

使用したもの

・python2.7

・pygame1.9.4

・キャラ素材

以下のサイトから無料でダウンロードしました。

pipoya.net

 

 

では、実験していきます。

 

ソースコード 

# coding: utf-8
# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
import os
SCR_RECT = Rect(0, 0, 640, 480)
ROW,COL = 15,20
GS = 32
map = [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
       [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]
def load_image(filename, colorkey=None):
    filename = os.path.join("data", filename)
    try:
        image = pygame.image.load(filename)
    except pygame.error, message:
        print "Cannot load image:", filename
        raise SystemExit, message
    image = image.convert()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image
def draw_map(screen):
    """マップを描画する"""
    for r in range(ROW):
        for c in range(COL):
            if map[r][c] == 0:
                screen.blit(grassImg, (c*GS,r*GS), (0,128,GS,GS))
            elif map[r][c] == 1:
                screen.blit(sabakuImg, (c*GS,r*GS), (0,128,GS,GS))
pygame.init()
screen = pygame.display.set_mode(SCR_RECT.size)
pygame.display.set_caption("PyRPG 03 プレイヤーの移動")
# イメージロード
playerImg = load_image("chara_tip/pipo-charachip005b.png", -1)  # プレイヤー
grassImg = load_image("pipo-map001/640x480/pipo-map001_at-tuti.png")
sabakuImg = load_image("pipo-map001/640x480/pipo-map001_at-sabaku.png")
x,y = 0,0  # プレイヤーの位置(単位:マス)
while True:
    draw_map(screen)  # マップ描画
    screen.blit(playerImg, (x*GS,y*GS), (0,0,GS,GS))  # プレイヤー描画
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            sys.exit()
        # プレイヤーの移動処理
        if event.type == KEYDOWN and event.key == K_DOWN:
            y += 1
        if event.type == KEYDOWN and event.key == K_LEFT:
            x -= 1
        if event.type == KEYDOWN and event.key == K_RIGHT:
            x += 1
        if event.type == KEYDOWN and event.key == K_UP:
            y -= 1

 

出力結果

f:id:hiro-htm877:20190219163251p:plain

 

 

元のコードからの変更点は

screen.blit(grassImg, (c*GS,r*GS), (0,128,GS,GS))

です。

screen.biltで画像の描画を行います。

grassImgの元の画像は32*160となっていますが、マップの1マスは32*32ですので32*32に切り抜かなければなりません。ただしpygameは便利な機能を持っており、screen.biltに引数を与えるとそこの部分だけ表示してくれます!

screen.blit(grassImg, (c*GS,r*GS), (0,128,GS,GS))

赤色の部分で指定します。切り出したい部分の(左上のx座標、左上y座標、width, heigjt)

f:id:hiro-htm877:20190219163540p:plain 

今回はとりあえずマップ作成とプレイヤー移動を行いました。

 

少しずつドラゴ◯クエストに近づけていきたいと思います!