女神転生風ゲームのソースを入手
瀬戸内寂聴 疲れたとき、この人の話し聞いてると和んでくる。
疲れが取れない。
養命酒やピップエレキバンなどジジババ臭いものに頼り始めている。
お酒を辞めたい。
辞められない。
よね。
・・・・・・・・
・・・・・・・・
運良く、一昨日、昨日と早く帰れる日だったので、帰った。
それでも、時間ギリギリまで布団に体がくっついている。
どうしちゃったんだろう、自分。
早朝はクリエイティブな時間帯だったのに。
イマイチ、周囲では人気が無いんだけど、個人的には思い入れのあるFF9。
召喚獣一覧。
・・・・・・・・
3Dのアクショングラフィックはアマグラマーでは不可能なのだろうか。
・・・・・・・・
RPGはフィールドマップとテキストスクリプトの量が半端ない。
偶然、女神転生風3DダンジョンRPGのゲームソースを発見した。
引用元:http://www2s.biglobe.ne.jp/~kaz_h/Tech/engineer.html#dungeon
Javaのソースです。
これで、自作女神転生ができるぞ。
女神転生2 名曲
package dungeon;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.lang.*;
import java.util.List;
import data.IntegerMap;
import dungeon.event.DungeonEvent;
import dungeon.event.ElevatorEvent;
import dungeon.event.ItemEvent;
import dungeon.event.MoveEvent;
import dungeon.graphic.Draw2D;
import dungeon.graphic.Draw3D;
import dungeon.item.Key;
//--------------------------------------------------------------------//
/**
* ダンジョンデータモデルクラス
*/
public class DungeonDataModel{
/** 北を表す int 型 */
public static final int NORTH=0;
/** 東を表す int 型 */
public static final int EAST=1;
/** 南を表す int 型 */
public static final int SOUTH=2;
/** 西を表す int 型 */
public static final int WEST=3;
/** イベントが無いことを表す int 型 */
public static final int NOEVENT=0;
/** 壁を表す int 型 */
public static final int WALL=1;
/** 扉を表す int 型 */
public static final int DOOR=2;
/** 方位を表す文字列 */
public static final String DIR_TITLE[]={" N"," E"," S"," W"};
/** タイトル用フォント */
public static final Font TITLE_FONT=new Font("Serif",Font.BOLD,18);
/** メッセージ用フォント */
public static final Font MESSAGE_FONT=new Font("Serif",Font.BOLD,20);
/** タイトル */
protected String title;
/** 3D表示オブジェクト */
protected Draw3D d3d;
/** 階層データを格納した配列 **/
protected Floor floor[];
/** イベントを格納した配列 **/
protected DungeonEvent event[];
/** エレベーターを格納した配列 **/
protected Elevator elevator[];
/** 鍵を格納した配列 */
protected Key key[];
/** 鍵番号を格納したマップ */
protected IntegerMap keyMap;
/** 現在の位置を表すポインタ */
protected Pointer pp;
/** 現在向いている方角を表す int 型 */
protected int direc;
/** イベントメッセージの表示範囲を格納した配列 */
protected Rectangle msgBounds[];
/**
* ダンジョンデータモデルオブジェクトを構築する
*/
public DungeonDataModel(){
title="";
pp=new Pointer(0,0);
direc=NORTH;
}
//--------------------------------------------------------------------//
/**
* タイトルを設定する
* @param title 設定するタイトル
*/
public void setTitle(String title){
this.title=title;
}
//--------------------------------------------------------------------//
/**
* 階層データを設定する
* @param floor 階層データを格納した配列
*/
public void setFloors(Floor floor[]){
this.floor=new Floor[floor.length];
System.arraycopy(floor,0,this.floor,0,floor.length);
}
//--------------------------------------------------------------------//
/**
* 現在位置のポインタを設定する
* @param pp 設定するポインタ
*/
public void setPointer(Pointer pp){
this.pp=pp;
}
//--------------------------------------------------------------------//
/**
* イベントを設定する
* @param eventList イベントを格納したリスト
*/
public void setEvents(List eventList){
int eventCount=eventList.size();
event=new DungeonEvent[eventCount];
for(int i=0;i
}
}
//--------------------------------------------------------------------//
/**
* エレベーターを設定する
* @param elevatorList エレベーターを格納したリスト
*/
public void setElevators(List elevatorList){
int elevatorCount=elevatorList.size();
elevator=new Elevator[elevatorCount];
for(int i=0;i
}
}
//--------------------------------------------------------------------//
/**
* 鍵データを設定する
* @param size 鍵を格納した配列のサイズ
* @param key 鍵を格納した配列
* @param keyMap 鍵番号を格納したマップ
*/
public void setKeys(int size,Key key[],IntegerMap keyMap){
this.key=new Key[size];
System.arraycopy(key,0,this.key,0,size);
this.keyMap=keyMap;
}
//--------------------------------------------------------------------//
/**
* 位置のポインタを返す
* @param floorLabel 階層ラベル
* @param x 階層位置の x 座標
* @param y 階層位置の y 座標
* @return 指定された位置のポインタ
*/
public Pointer pointer(int floorLabel,int x,int y){
for(int i=0;i
return new Pointer(i,floor[i].pointer(x-1,y-1));
}
}
return new Pointer(0,0);
}
//--------------------------------------------------------------------//
/**
* マップマス目を返す
* @param pointer 位置を表すポインタ
* @return 指定された位置のマス目
*/
public MapGrid getGrid(Pointer pointer){
return getGrid(pointer.floor,pointer.point);
}
//--------------------------------------------------------------------//
/**
* マップマス目を返す
* @param floorIndex 階層のインデックス
* @param point 階層内位置のポインタ
* @return 指定された位置のマス目
*/
public MapGrid getGrid(int floorIndex,int point){
return floor[floorIndex].getGrid(point);
}
//--------------------------------------------------------------------//
/**
* 北側の壁データを返す
* @param pointer 位置を表すポインタ
* @return 指定された位置のマス目の北側の壁データ
*/
protected int getNorthWall(Pointer pointer){
return floor[pointer.floor].getNorthWall(pointer.point);
}
//--------------------------------------------------------------------//
/**
* 南側の壁データを返す
* @param pointer 位置を表すポインタ
* @return 指定された位置のマス目の南側の壁データ
*/
protected int getSouthWall(Pointer pointer){
return floor[pointer.floor].getSouthWall(pointer.point);
}
//--------------------------------------------------------------------//
/**
* 東側の壁データを返す
* @param pointer 位置を表すポインタ
* @return 指定された位置のマス目の東側の壁データ
*/
protected int getEastWall(Pointer pointer){
return floor[pointer.floor].getEastWall(pointer.point);
}
//--------------------------------------------------------------------//
/**
* 西側の壁データを返す
* @param pointer 位置を表すポインタ
* @return 指定された位置のマス目の西側の壁データ
*/
protected int getWestWall(Pointer pointer){
return floor[pointer.floor].getWestWall(pointer.point);
}
//--------------------------------------------------------------------//
/**
* イベントを返す
* @param ev イベントのインデックス
* @return 指定された位置のイベント
*/
public DungeonEvent getEvent(int ev){
return event[ev];
}
//--------------------------------------------------------------------//
/**
* 3D 地図のマス目を設定する
* @param width 画面幅
* @param height 画面高さ
* @param depth 表示深さ
*/
public void set3DMesh(int width,int height,int depth){
d3d=new Draw3D(width,height,depth);
}
//--------------------------------------------------------------------//
/**
* 2D メッシュサイズを設定する
* @param g 描画するグラフィックスコンテキスト
* @param width 画面幅
* @param height 画面高さ
*/
public void set2DMesh(Graphics2D g,int width,int height){
for(int i=0;i
floor[i].setFont(floorFont(g,floor[i]));
floor[i].setFontPoint(floorFontPoint(g,floor[i]));
}
}
//--------------------------------------------------------------------//
/**
* 2次元地図の階層表示フォントを返す
* @param g 描画するグラフィックスコンテキスト
* @param floor 階層データ
*/
public static Font floorFont(Graphics2D g,Floor floor){
int fontSize=floor.getMeshSize();
int fontHeight=0;
int height=fontSize-2;
Font font=new Font("Serif",Font.PLAIN,fontSize);
do{
fontSize--;
font=new Font("Serif",Font.PLAIN,fontSize);
g.setFont(font);
FontMetrics fm=g.getFontMetrics();
fontHeight=fm.getHeight();
}while((fontHeight>=height) && (fontSize>1));
return font;
}
//--------------------------------------------------------------------//
/**
* 2次元地図の階層表示フォントの表示位置を返す
* @param g 描画するグラフィックスコンテキスト
* @param floor 階層データ
*/
public static Point floorFontPoint(Graphics2D g,Floor floor){
FontMetrics fm=g.getFontMetrics();
int sx=(floor.getMeshSize()-fm.stringWidth("A"))/2;
int sy=fm.getAscent()+1;
return new Point(sx,sy);
}
//--------------------------------------------------------------------//
/**
* 前に移動する
*/
public int goAhead(){
int nn1=floor[pp.floor].getColumnCount();
int nn2=floor[pp.floor].getRowCount();
switch(direc){
case NORTH: // 北に移動
if(canThrough(getNorthWall(pp))){
if(getGrid(pp).y==0) pp.move(nn1*(nn2-1));
else pp.move(-nn1);
}
break;
case EAST: // 東に移動
if(canThrough(getEastWall(pp))){
if(getGrid(pp).x==nn1-1) pp.move(-nn1+1);
else pp.move(1);
}
break;
case SOUTH: // 南に移動
if(canThrough(getSouthWall(pp))){
if(getGrid(pp).y==nn2-1) pp.move(-nn1*(nn2-1));
else pp.move(nn1);
}
break;
case WEST: // 西に移動
if(canThrough(getWestWall(pp))){
if(getGrid(pp).x==0) pp.move(nn1-1);
else pp.move(-1);
}
}
getGrid(pp).through();
return getGrid(pp).getEvent();
}
//--------------------------------------------------------------------//
/**
* 右を向く
*/
public void turnRight(){
direc=(direc+1)%4;
}
//--------------------------------------------------------------------//
/**
* 左を向く
*/
public void turnLeft(){
direc=(direc+3)%4;
}
//--------------------------------------------------------------------//
/**
* 後を向く
*/
public void turnBack(){
direc=(direc+2)%4;
}
//--------------------------------------------------------------------//
/**
* 通過可能かどうか判定する
* @param wall 判定対象の壁データ
* @return 通過可能な場合は true
*/
public boolean canThrough(int wall){
if(wall==WALL){
return false;
}
else if(wall<0){
int index=keyMap.getInt(Math.abs(wall));
if(index>=0) return key[index].hasKey();
}
return true;
}
//--------------------------------------------------------------------//
/**
* イベントで選択する
* @param ev イベントのインデックス
* @param mousePoint マウス位置を表す
Point
* @return 選択結果を表す int 型
*/
public int eventSelect(int ev,Point mousePoint){
return eventSelect(ev,mousePoint.x,mousePoint.y);
}
//--------------------------------------------------------------------//
/**
* イベントで選択する
* @param ev イベントのインデックス
* @param mx マウス位置の x 座標
* @param my マウス位置の y 座標
* @return 選択結果を表す int 型
*/
public int eventSelect(int ev,int mx,int my){
if(event[ev]==null){
return 0;
}
else if(event[ev].yesNoOption()==DungeonEvent.NON_SELECT){
if(msgBounds[0].contains(mx,my)) return 1;
}
else if(event[ev].yesNoOption()==DungeonEvent.SELECT_2WAY){
if(msgBounds[0].contains(mx,my)) return 1;
else if(msgBounds[1].contains(mx,my)) return 0;
}
else if(event[ev] instanceof ElevatorEvent){
for(int i=0;i
}
}
return 0;
}
//--------------------------------------------------------------------//
/**
* イベントを実行する
* @param ev イベントのインデックス
*/
public void eventAction(int ev){
// 移動イベント (上り階段・下り階段・片道ワープ・双方向ワープ)
if(event[ev] instanceof MoveEvent){
pp=((MoveEvent)event[ev]).getMovePointer();
getGrid(pp).through();
}
// 鍵獲得
else if(event[ev] instanceof ItemEvent){
int index=((ItemEvent)event[ev]).getItem();
key[index].getKey();
event[ev]=null;
getGrid(pp).setEvent(NOEVENT);
}
}
//--------------------------------------------------------------------//
/**
* エレベーターで移動する
* @param ev イベントのインデックス
* @param floor 移動する階層のインデックス
*/
public void eventElevator(int ev,int floor){
DungeonEvent dev=event[ev];
if(dev instanceof ElevatorEvent){
int pelev=((ElevatorEvent)dev).elevator();
pp=elevator[pelev].getPointer(floor);
getGrid(pp).through();
}
}
//--------------------------------------------------------------------//
/**
* マップタイトルを表示する
* @param g 描画するグラフィックスコンテキスト
* @param width 画面幅
*/
public void drawTitle(Graphics2D g,int width){
drawTitle(g,floor[pp.floor].getFloorColor(),
floor[pp.floor].getWallColor(),width);
}
//--------------------------------------------------------------------//
/**
* マップタイトルを表示する
* @param g 描画するグラフィックスコンテキスト
* @param boadColor 文字背景色
* @param textColor 文字色
* @param width 画面幅
*/
protected void drawTitle(Graphics2D g,Color boadColor,Color textColor,
int width){
StringBuffer titleBar=new StringBuffer();
if(!title.equals("null")){
titleBar.append(title);
}
if(!floor[pp.floor].getTitle().equals("null")){
titleBar.append(" ");
titleBar.append(floor[pp.floor].getTitle());
}
titleBar.append(DIR_TITLE[direc]);
// フォント設定
g.setFont(TITLE_FONT);
FontMetrics fm=g.getFontMetrics();
int fontWidth=fm.stringWidth(titleBar.toString());
int fontHeight=fm.getHeight();
int gx=(width-fontWidth)/2-5;
int gy=2;
// 文字背景・文字表示
g.setColor(boadColor);
g.fillRect(gx,gy,fontWidth+10,fontHeight+4);
g.setColor(textColor);
g.drawString(titleBar.toString(),gx+5,gy+fontHeight);
}
//--------------------------------------------------------------------//
/**
* 3次元地図を表示する
* @param g 描画するグラフィックスコンテキスト
* @param x 表示位置の x 座標
* @param y 表示位置の y 座標
* @param width 画面幅
* @param height 画面高さ
* @param depth 表示深さ
*/
public void draw3DMap(Graphics2D g,int x,int y,int width,int height,
int depth){
draw3DMap(g,floor[pp.floor],x,y,width,height,depth);
}
//--------------------------------------------------------------------//
/**
* 3次元地図を表示する
* @param g 描画するグラフィックスコンテキスト
* @param floor 階層データ
* @param x 表示位置の x 座標
* @param y 表示位置の y 座標
* @param width 画面幅
* @param height 画面高さ
* @param depth 表示深さ
*/
protected void draw3DMap(Graphics2D g,Floor floor,int x,int y,
int width,int height,int depth){
int ww[]=new int[4];
Color lineColor=floor.getFloorColor();
d3d.init3DMap(g,x,y,floor.getCeilColor(),floor.getFloorColor());
for(int i=depth;i>0;i--){
int jmax=d3d.getWallCount(i);
for(int j=jmax;j>=0;j--){
Pointer pt1=viewPointer(floor,pp,direc,i-1,-j);
Pointer pt2=viewPointer(floor,pp,direc,i-1,j);
switch(direc){
case NORTH:
ww[0]=getNorthWall(pt1);
ww[1]=getNorthWall(pt2);
ww[2]=getWestWall(pt1);
ww[3]=getEastWall(pt2);
break;
case EAST:
ww[0]=getEastWall(pt1);
ww[1]=getEastWall(pt2);
ww[2]=getNorthWall(pt1);
ww[3]=getSouthWall(pt2);
break;
case SOUTH:
ww[0]=getSouthWall(pt1);
ww[1]=getSouthWall(pt2);
ww[2]=getEastWall(pt1);
ww[3]=getWestWall(pt2);
break;
case WEST:
ww[0]=getWestWall(pt1);
ww[1]=getWestWall(pt2);
ww[2]=getSouthWall(pt1);
ww[3]=getNorthWall(pt2);
}
d3d.draw3DMap(g,x,y,i,j,ww,lineColor,floor.getWallColor(),
floor.getSideWallColor(),floor.getDoorColor(),
floor.getKeyDoorColor());
}
}
}
//--------------------------------------------------------------------//
/**
* 相対位置から絶対位置を求める
* @param pt 相対位置の基準位置ポインタ
* @param floor 相対位置を求める階層データ
* @param direc 向いている方角を表す int 型
* @param depth 前後方向相対位置
* @param side 横方向相対位置
* @return 絶対位置を表すポインタ
*/
protected static Pointer viewPointer(Floor floor,Pointer pt,int direc,
int depth,int side){
int px=floor.getGrid(pt.point).x;
int py=floor.getGrid(pt.point).y;
switch(direc){
case NORTH: // 北向き
px+=side;
py-=depth;
break;
case EAST: // 東向き
px+=depth;
py+=side;
break;
case SOUTH: // 南向き
px-=side;
py+=depth;
break;
case WEST: // 西向き
px-=depth;
py-=side;
}
px=(px+floor.getColumnCount())%floor.getColumnCount();
py=(py+floor.getRowCount())%floor.getRowCount();
return new Pointer(pt.floor,floor.pointer(px,py));
}
//--------------------------------------------------------------------//
/**
* 2次元地図を表示する
* @param g 描画するグラフィックスコンテキスト
* @param x 表示位置の x 座標
* @param y 表示位置の y 座標
*/
public void draw2DMap(Graphics2D g,int x,int y){
int n12=floor[pp.floor].getGridCount();
int meshSize=floor[pp.floor].getMeshSize();
for(int i=0;i
int xx=x+meshSize*getGrid(pp.floor,i).x;
int yy=y+meshSize*getGrid(pp.floor,i).y;
Draw2D.draw2DMesh(g,xx,yy,event,floor[pp.floor],i);
}
}
int xx=x+meshSize*getGrid(pp).x;
int yy=y+meshSize*getGrid(pp).y;
Draw2D.drawMe2D(g,xx,yy,direc,floor[pp.floor]);
}
//--------------------------------------------------------------------//
/**
* イベントメッセージを表示する
* @param g 描画するグラフィックスコンテキスト
* @param ev イベントのインデックス
* @param x 表示位置の x 座標
* @param y 表示位置の y 座標
* @param width 画面幅
* @param height 画面高さ
*/
public void drawMessage(Graphics2D g,int ev,int x,int y,
int width,int height){
if(event[ev]==null) return;
// フォント設定
g.setFont(MESSAGE_FONT);
FontMetrics fm=g.getFontMetrics();
String message=event[ev].getMessage();
int fontWidth=fm.stringWidth(message)+2;
int fontHeight=fm.getHeight()+2;
int fontAscent=fm.getAscent()+1;
int msgx=x+(width-fontWidth)/2;
int msgy=y;
if(event[ev] instanceof ElevatorEvent){
msgy+=2*fontHeight;
}
else{
msgy+=(height-fontHeight)/2;
}
// 文字背景・文字表示
g.setColor(Color.white);
g.fillRect(msgx,msgy,fontWidth,fontHeight);
g.setColor(Color.black);
g.drawRect(msgx,msgy,fontWidth,fontHeight);
g.drawString(message,msgx+1,msgy+fontAscent);
if(event[ev].yesNoOption()==DungeonEvent.SELECT_2WAY){
msgBounds=new Rectangle[2];
fontWidth=fm.stringWidth("Yes / No")+2;
msgx=x+(width-fontWidth)/2;
msgy+=fontHeight;
g.setColor(Color.white);
g.fillRect(msgx,msgy,fontWidth,fontHeight);
g.setColor(Color.black);
g.drawRect(msgx,msgy,fontWidth,fontHeight);
g.drawString("Yes / No",msgx+1,msgy+fontAscent);
int dmsgx=fm.stringWidth("Yes ")+2;
msgBounds[0]=new Rectangle(msgx,msgy,dmsgx,fontHeight);
msgBounds[1]=new Rectangle(msgx+dmsgx,msgy,fontWidth-dmsgx,
fontHeight);
}
else if(event[ev] instanceof ElevatorEvent){
int pelev=((ElevatorEvent)event[ev]).elevator();
int floorCount=elevator[pelev].getFloorCount();
msgBounds=new Rectangle[floorCount];
for(int i=0;i
String label=floor[floorIndex].getLabelString();
fontWidth=fm.stringWidth(label)+2;
msgx=x+(width-fontWidth)/2;
msgy+=fontHeight;
msgBounds[i]=new Rectangle(msgx,msgy,fontWidth,fontHeight);
g.setColor(Color.white);
g.fill(msgBounds[i]);
g.setColor(Color.black);
g.draw(msgBounds[i]);
g.drawString(label,msgx+1,msgy+fontAscent);
}
}
else{
msgBounds=new Rectangle[1];
msgBounds[0]=new Rectangle(msgx,msgy,fontWidth,fontHeight);
}
}
}
引用終
・・・・・・・・・・・
・・・・・・・・・・・
・・・・・・・・・・・
日
疲れが癒されない
英
Tiredness is not relieved.
韓
피로가 풀어지지 않는다
ピロガ プロジジ アンヌンダ
中
疲劳不被治疗
pi2 lao2 bu4 bei4 zhi4 liao2
スポンサーサイト