プレイヤーの移動
マップにプレイヤーを乗せてキーボードの上下左右キーで移動できるようにしてみます。
サンプルスクリプト
#!/usr/bin/env python # -*- 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,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,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,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)) elif map[r][c] == 1: screen.blit(waterImg, (c*GS,r*GS)) pygame.init() screen = pygame.display.set_mode(SCR_RECT.size) pygame.display.set_caption(u"PyRPG 03 プレイヤーの移動") # イメージロード playerImg = load_image("player1.png", -1) # プレイヤー grassImg = load_image("grass.png") # 草地 waterImg = load_image("water.png") # 水 x,y = 0,0 # プレイヤーの位置(単位:マス) while True: draw_map(screen) # マップ描画 screen.blit(playerImg, (x*GS,y*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
プレイヤーをキーボードで動かす
プレイヤーがマップ上のどの位置にいるかを表す変数 (x,y) を用意して勇者の位置を (0,0) に初期化します。これは、マップの0行0列(左上のマス)にプレイヤーがいることを表しています。
x,y = 0,0 # プレイヤーの位置(単位:マス)
プレイヤーの移動はキーボードで行います。キーボードの基本的な使い方はキーイベント(2008/5/10)を見てください。スクリプトでは、イベントハンドラのところにプレイヤーの移動処理を追加しています。
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
キーを押してプレイヤーを上下左右へ移動させたとき、(x,y) を変化させます。(x,y) をどう変化させればよいかは下図を参考にしてください。8方向の変化量を描いていますが、実際の移動は上下左右の4方向へ制限しています。
これでプレイヤーを動かせるようになりました。でもドラクエなどの移動と比べるとかなり違いますよね。ドラクエの移動はマップスクロールという方法を使っているからです。マップスクロール処理については後で取り上げます。あと今のままだと海とか移動不可の場所にも移動できてしまいますね。海に移動できない処理は次回取り上げます。