fc2ブログ

女神転生風ゲームのソースを入手


瀬戸内寂聴 疲れたとき、この人の話し聞いてると和んでくる。

疲れが取れない。

養命酒やピップエレキバンなどジジババ臭いものに頼り始めている。

お酒を辞めたい。
辞められない。
よね。

・・・・・・・・
・・・・・・・・

運良く、一昨日、昨日と早く帰れる日だったので、帰った。
それでも、時間ギリギリまで布団に体がくっついている。

どうしちゃったんだろう、自分。
早朝はクリエイティブな時間帯だったのに。


イマイチ、周囲では人気が無いんだけど、個人的には思い入れのある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 event[i]=(DungeonEvent)eventList.get(i);
}
}

//--------------------------------------------------------------------//
/**
* エレベーターを設定する
* @param elevatorList エレベーターを格納したリスト
*/
public void setElevators(List elevatorList){
int elevatorCount=elevatorList.size();
elevator=new Elevator[elevatorCount];
for(int i=0;i elevator[i]=(Elevator)elevatorList.get(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 if(floor[i].getLabel()==floorLabel){
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].setMeshSize(width,height);
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 if(msgBounds[i].contains(mx,my)) return i+2;
}
}
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 if(getGrid(pp.floor,i).isThrough()){
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 int floorIndex=elevator[pelev].getPointer(i).floor;
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
スポンサーサイト



ドラクエ的ゲームのソース(オープンソース)を公開/ハングル検定4級は伊達じゃない


女神転生2
こんなゲームを作りたい。

とにかく、いろいろなゲームを作りたいという欲求はフツフツとしている。
とくに、自分はグラフィックを描くのが得意なので、それを活かしてたくさんのキャラが登場するRPGなんかを作りたいわけです。
ポケモン、女神転生、ドラクエ、FF

自分のプログラミングの能力は、・・・発展途上、で、色々なソースを読み込むことで力が付くのだと信じている。規則、原則はどれも同じ、ただ長いから理解できないだけ、でも、複雑で長いコードも基礎基本の組み合わせでしかない。

yuusha
ドラクエ的なゲームをJavaで作りたいと思っていた。
以前、Javascript版はあったので、Javaに移植すればよかったんだけど、でも、まさに、ドンピシャのが某サイトにあったので、そのソースを見て勉強することにしました。

以下、ドラクエ的ゲームのソースです。

長いので、興味の無い人は読み飛ばしてください。

書いたのはどっかのプログラマです。


以下引用元サイト
http://www.harukitchen.com/rpg_programming/18/18.htm
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.URL;
import java.util.Random;

public class FirstRpg extends Applet implements Runnable,KeyListener{
Image buffer;//イメージバッファ
Graphics bufferg;//バックバッファ
Random rand = new Random();//乱数

volatile Thread th;//スレッド

final int CHIP_SIZE=32;//チップサイズ
final int MAX_EVENT_TABLE=100;//イベントテーブルの最大個数
final int KAKUHO_NO=99;//確保イベントNO(キャラが次に着く位置)
final int WORLD_MAP=50;//世界マップの番号

final int CMAX=3;//パーティ人数

float FrameTime;//1フレームあたりの時間(秒)
long waitTime;//現在時刻保存用

Image chara_image;//キャラチップ画像

MyClass My = new MyClass(0);//自分クラス宣言(チップNO 0)
//仲間クラス宣言
PartyClass party[] = {
new PartyClass(9),
new PartyClass(68),
new PartyClass(69),
new PartyClass(70),
};

//方向テーブル(上下左右不動の順)
int dir_x[] = {0,0,-1,+1,0};
int dir_y[] = {-1,+1,0,0,0};

//キーの状態(離している=0、押し続けている=1、押した瞬間=2)
int key_states[] = new int[6];//4方向(上=0,下=1,左=2,右=3)+Zキー=4、Xキー=5

//マップデータ
int now_map_no;//現在のマップNO
short map_data[][] = new short[256][256];//256×256
int map_width,map_height;//マップの横幅、高さ(チップ数)
Image map_image;//マップチップ画像
ClassLoader classLoader = this.getClass().getClassLoader();

//イベントデータ
int event_data[][] = new int[256][256];
//イベントテーブル
Event eventtbl[] = new Event[MAX_EVENT_TABLE];
int event_num;//そのマップでのイベントの個数

// イベントファイル用バッファ
char gl_event_file_buffer[] = new char[ 4096 ];

//ゲーム進行スイッチ
boolean game_switch[] = new boolean[128];

//------------ゲーム管理フラグ-------------
//0=マップ移動(黒幕下がる)
//1=マップ移動(黒幕上がる)
//2=イベント中
//3=会話イベント
//4=文字が流れている途中
//7=デバッグフラグ
//8=テーブル更新予約フラグ
//9=ダイアログ中
//10=スクリプトスキップ中
//11=イベント強制移動中
//12=主人公強制移動中
//13=ゲーム終了スタート
//14=画面中央にENDの文字
//15=ゲーム完全終了
boolean game_flags[] = new boolean[16];

//------------ゲーム管理ウェイト(floatバッファにも使う)-----------
//0=黒い幕の昇降ウェイト
//1=会話の流れる文字ウェイト
float game_waits[] = new float[8];

//------------ゲーム管理バッファ-----------
//0=現在のイベントNO
//1=読み込むマップNO
//2=移動先X座標
//3=移動先Y座標
//4=移動後向き
//5=現在のスクリプトの行
//6=会話中の文字の位置。
//7=現在選択中選択肢
//8=選択肢の数
int game_buffer[] = new int[16];

//------------ゲーム管理文字列-----------
//0=現在のスクリプトファイル名
//1=現在の会話内容
//2=分岐1
//3=分岐2
//4=分岐3
String game_strings[] = new String[8];
char game_talks[] = new char[256];//会話内容char配列

//当たり判定用のセルテーブル(マップ)
MapCell celltbl[] = {
new MapCell(0,true), //平原
new MapCell(1,true), //芝1
new MapCell(2,true), //芝2
new MapCell(3,true), //家
new MapCell(4,false), //木1
new MapCell(5,false), //木2
new MapCell(6,true), //城
new MapCell(7,false), //海
new MapCell(8,true), //塔(上)
new MapCell(9,true), //塔(下)
new MapCell(10,true), //洞窟
new MapCell(11,false), //岩山
new MapCell(12,true), //宇宙1
new MapCell(13,true), //宇宙2
new MapCell(14,false), //クリスタル
new MapCell(15,true), //宇宙の城
new MapCell(16,true), //真っ黒
new MapCell(17,true), //茶色
new MapCell(18,false), //灰色
new MapCell(19,false), //ツボ
new MapCell(20,true), //空
new MapCell(21,true), //地面2
new MapCell(22,true), //宝箱
new MapCell(23,true), //青壁
new MapCell(24,true), //黒
new MapCell(25,false), //机
new MapCell(26,false), //川1
new MapCell(27,false), //川2
new MapCell(28,false), //洞窟岩
new MapCell(29,true), //洞窟地面
new MapCell(30,true), //草原1
new MapCell(31,true), //草原2
new MapCell(32,true), //雪地面
new MapCell(33,true), //雪芝1
new MapCell(34,true), //雪芝2
new MapCell(35,true), //雪家
new MapCell(36,false), //雪木
new MapCell(37,true), //雪城
new MapCell(38,false), //雪池
new MapCell(39,true), //雪洞窟
new MapCell(40,true), //雪木
new MapCell(41,true), //雪芝3
new MapCell(42,true), //木の壁
new MapCell(43,true), //橋
new MapCell(44,true), //階段1
new MapCell(45,true), //階段2
};

//当たり判定用のセルテーブル(キャラ)
CharaCell charatbl[] = new CharaCell[256];

//マップデータ構造
MapFile mapfiles[] = {
new MapFile(1,"フィールド1",20,12),
new MapFile(2,"別荘の庭",20,12),
new MapFile(3,"別荘",20,12),
new MapFile(4,"二階",20,12),
new MapFile(5,"一階",20,12),

new MapFile(6,"学校フィールド",20,12),
new MapFile(7,"学校1階",20,24),
new MapFile(8,"学校2階",20,12),
new MapFile(9,"理科室",20,12),
new MapFile(10,"運動場",20,12),

new MapFile(11,"謎の世界",80,36),
new MapFile(12,"洞窟1",20,12),
new MapFile(13,"洞窟2",20,12),
new MapFile(14,"洞窟3",20,12),
new MapFile(15,"洞窟4",20,12),

new MapFile(16,"おちかた村",40,24),
new MapFile(17,"カワニシの塔1",20,12),
new MapFile(18,"カワニシの塔2",20,12),
new MapFile(19,"カワニシの塔3",20,12),
new MapFile(20,"カワニシの塔4",20,12),

new MapFile(21,"イクノ城1",20,48),
new MapFile(22,"イクノ城2",20,24),
new MapFile(23,"イクノ城3",20,12),
new MapFile(24,"魔王の間",20,12),
};
final int MAXMAPNUM = 24;//マップの個数

//初期化
public void init(){
System.out.println("init()");

int i;

Dimension d = getSize();
MediaTracker mediaT = new MediaTracker(this);

//キャラチップ画像ロード
// getImage(URL)
// chara_image = getImage( getDocumentBase(),"chara_chip.gif");
chara_image = getImage( classLoader.getResource("chara_chip.gif") );
mediaT.addImage(chara_image,0);

//マップチップ画像ロード
//map_image = getImage(getDocumentBase(),"map_chip.gif");
map_image = getImage( classLoader.getResource("map_chip.gif") );
mediaT.addImage(map_image,0);

//ロード待ち
try{
mediaT.waitForAll();
}catch(InterruptedException e){}

//透明色指定
chara_image = Harulib.getAlphaImage(chara_image,new Color(0,255,0));

//イベントテーブル初期化
for(i=0;i eventtbl[i] = new Event(i);
}

//キャラのセルテーブル初期化(大抵当たり判定を付ける)
for(i=0;i<256;i++){
//階段、回復、255のみ除去
if(i==88 || i==89 || i==111 || i==255){
charatbl[i] = new CharaCell(i,true);
}else{
charatbl[i] = new CharaCell(i,false);
}
}

if( true ){
//主人公の初期座標
//パラメータを取得
game_buffer[2] = Integer.parseInt( getParameter("x") );
game_buffer[3] = Integer.parseInt( getParameter("y") );

//マップデータロード
readMapData( Integer.parseInt( getParameter("map") ) );

My.moving_dir = Integer.parseInt( getParameter("dir") );
}else{
//主人公の初期座標
//パラメータを取得
game_buffer[2] = 12;
game_buffer[3] = 5;

//マップデータロード
readMapData( 1 );

My.moving_dir = 2;
}

My.speed = 128;//主人公の速度。1秒で128ドット。

//現在時刻保存
waitTime=System.currentTimeMillis();

addKeyListener(this);//キー入力リスナー
// requestFocus();//フォーカス取得

//バッファを作成する
buffer = createImage(d.width,d.height);
}

//スタート(initの次に呼ばれる。最小化から復帰したときも呼ばれる。)
public void start(){
System.out.println("start()");
if(th == null){
th = new Thread(this);
th.start();
}
}

//ストップ(ウインドウが消えると呼ばれる。最小化でも。)
public void stop(){
System.out.println("stop()");
th = null;
}

//マップデータを読み込む
private void readMapData(int mapno){
System.out.println("readMapData()");

int i,j,x,y;
InputStream is = null;
int id;
String sid;

//マップデータ&イベントデータリセット
for(i=0;i<256;i++){
for(j=0;j<256;j++){
event_data[i][j]=0;
map_data[i][j]=0;
}
}

now_map_no = mapno;

//横幅、縦幅決定
id=1;
for(i=0;i if(mapno == mapfiles[i].no){
id = i;
break;
}
}

map_width = mapfiles[id].width;
map_height = mapfiles[id].height;

//文字列変換
if(mapfiles[id].no <= 9){sid = "0"+mapfiles[id].no;}
else{sid = ""+mapfiles[id].no;}

//---------マップデータ読み込み-------------
System.out.println("Load:mapno="+sid);

String filename = "mapdata/map"+sid+".dat";


try{
//is = new URL(getDocumentBase(),filename).openStream();
is = classLoader.getResourceAsStream( filename );
x=y=0;
while((i=is.read()) != -1){
map_data[x][y]=(short)i;
if(++x == map_width){
++y;
x=0;

if(y==map_height)break; //終了条件
}
}
is.close();
}catch(IOException e){}

//---------イベントデータ読み込み-------------
System.out.println("Load:event="+sid);

filename = "eventdata/event"+sid+".dat";

try{
//is = new URL(getDocumentBase(),filename).openStream();
is = classLoader.getResourceAsStream( filename );

x=y=0;
while((i=is.read()) != -1){
event_data[x][y]=(short)i;

//もし1以上のデータがあればイベントテーブルに代入
if(event_data[x][y] >= 1){
eventtbl[ event_data[x][y] ].x = x;
eventtbl[ event_data[x][y] ].y = y;
eventtbl[ event_data[x][y] ].px = x*CHIP_SIZE;
eventtbl[ event_data[x][y] ].py = y*CHIP_SIZE;

//その他初期化
eventtbl[ event_data[x][y] ].sum_move_length = 0.0f;
}

if(++x == map_width){
++y;
x=0;

if(y==map_height)break; //終了条件
}
}
is.close();
}catch(IOException e){}

//イベントを全てアクティブにする。0以外。
for(i=1;i eventtbl[i].sh = true;
}


//------------イベントテーブル更新----------------
Load_Event_Table();


//主人公の初期座標
My.x = game_buffer[2];
My.y = game_buffer[3];
My.moving_dir = game_buffer[4];

My.px = My.x*CHIP_SIZE;
My.py = My.y*CHIP_SIZE;

//仲間座標を同じにする。
for(i=0;i party[i].x =My.x;
party[i].y = My.y;
party[i].px =My.px;
party[i].py = My.py;
party[i].moving_dir = 4;
}

//フレーム時間初期化(ロード時間が長いので)
waitTime = System.currentTimeMillis();
}

//イベントテーブル更新
void Load_Event_Table(){
int i,j,x,y;
InputStream is = null;
int id;
String sid;
char line[] = new char[256];
String str="";
int no=0;//イベントNO保存用
int sw=0;//スイッチ
int maxno=0;

//マップNOから添え字取得
id=1;
for(i=0;i if(now_map_no == mapfiles[i].no){
id = i;
break;
}
}
//文字列変換
if(mapfiles[id].no <= 9){sid = "0"+mapfiles[id].no;}
else{sid = ""+mapfiles[id].no;}

System.out.println("Load:eventtable="+sid);
String filename = "eventtable/"+sid+".txt";

x=y=0;
try{
// is = new URL(getDocumentBase(),filename).openStream();
is = classLoader.getResourceAsStream( filename );

while((i=is.read()) != -1){
//一行ずつ読み込む
line[x++] = (char)i;
//System.out.print((char)i);

//改行がきた場合
if(i == '\r'){continue;}
if(i == '\n'){
//改行コード以降切り捨てて、String型を読み込む
String sline = Harulib.HaruChop(line);

//条件を読む
//現在はゲーム進行スイッチのみ
str = Harulib.HaruSplit(sline,"<>",0);

//NULLと書いてるものはそのまま実行
if(str.equals("NULL")){;}
else{
//数字のものはゲーム進行スイッチにより読み込む
sw = Integer.parseInt(str);

//条件がマッチしているか?
if(game_switch[sw]){
;//続ける
}else{
//この行は破棄
x=0;
y++;
continue;
}
}

//イベントNO
str = Harulib.HaruSplit(sline,"<>",1);
no = Integer.parseInt(str);
eventtbl[no].no = Integer.parseInt(str);
//System.out.println("y="+y+" eventtbl[y].no="+eventtbl[y].no);

//スクリプト名
str = Harulib.HaruSplit(sline,"<>",2);
eventtbl[no].filename = str;

//グラフィックス
str = Harulib.HaruSplit(sline,"<>",3);
eventtbl[no].gra = Integer.parseInt(str);
//System.out.println("y="+y+" eventtbl[y].gra="+eventtbl[y].gra);

//移動タイプ
str = Harulib.HaruSplit(sline,"<>",4);
eventtbl[no].type_of_move = Integer.parseInt(str);
eventtbl[no].speed = 32;

//イベントタイプ
str = Harulib.HaruSplit(sline,"<>",5);
eventtbl[no].type_of_event = Integer.parseInt(str);

//最大値保存
if(maxno < no){
maxno = no;
}

x=0;
y++;
}
}
is.close();
}catch(IOException e){}

//0を作る
eventtbl[0].gra = 255;

//イベントの数(最大値)
event_num = maxno+1;

//KAKUHO_NO番目に入れる
eventtbl[KAKUHO_NO].gra = 254;//透明で当たる
eventtbl[KAKUHO_NO].type_of_event = 0;

//自動的に始まるイベントがあった場合、それを起動
for(i=0;i if(eventtbl[i].sh && eventtbl[i].type_of_event == 2){
game_flags[2] = true;
game_buffer[0] = i;

// 一行目を読み込む
game_buffer[5] = 0;
//スクリプトファイル名決定
game_strings[0] = "eventscript/"+eventtbl[ game_buffer[0] ].filename+".txt";

// バッファに格納
LoadFileToBuffer( game_strings[0] );
break;
}
}
}


//実行
public void run(){
System.out.println("run()");

Thread thisThread = Thread.currentThread();
try{
//ここがゲームループ
while(th == thisThread){
//1フレーム時間計算(秒)
FrameTime = ( System.currentTimeMillis()-waitTime ) /1000.0f;
waitTime = System.currentTimeMillis();

action();//処理
repaint();//描画

//ちょっと休憩(0.01秒)
Thread.sleep(10);

if(game_flags[15]){
break;
}
}
th = null;
}
catch(Exception e){
}

System.out.println("endrun()");
}

//描画更新
public void update(Graphics g){
paint(g);
}

//描画
public void paint(Graphics g){
Dimension d = getSize();
int i;
int x,y;//描画位置

//バッファのグラフィックコンテキストを取得する
if(bufferg == null){
bufferg = buffer.getGraphics();
}

//バッファを描画する
bufferg.setColor(Color.white);
bufferg.fillRect(0,0,d.width,d.height);

//マップ描画
DispMap(bufferg);

//イベント描画
DispEvent(bufferg);

//主人公描画
DispMy(bufferg);

//エフェクト

//黒い幕(マップ移動時、ゲーム終了時)
if(game_flags[0] || game_flags[1] || game_flags[13]){
bufferg.setColor(Color.black);
bufferg.fillRect(0,0,d.width,(int)(d.height*game_waits[0]));
}

//会話(ダイアログ中も表示)
if(game_flags[3] || game_flags[9]){
//ウインドウを作る(下1/3)
bufferg.setColor(Color.black);
bufferg.fillRect(0,2*d.height/3,d.width,d.height/3);

//文字
bufferg.setColor(Color.white);

//一文字ずつ書いていく
x=y=0;
for(i=0;i //19文字で改行
if(x==19){
x=0;
y++;
}
bufferg.drawString(String.valueOf(game_talks[i]),10+x*16,2*d.height/3+20 + y*16);
x++;
}
}

//ダイアログ
if(game_flags[9]){
//ウインドウを作る(真ん中上)
bufferg.setColor(Color.black);
bufferg.fillRect(d.width/4,d.height/4,d.width/2,(d.height/12) * game_buffer[8]);

//文字配置
bufferg.setColor(Color.white);
for(i=0;i bufferg.drawString(game_strings[i+2],d.width/4+20,d.height/4 + 14+i*16);
}

//カーソル
//キャラチップからグラフィックスの位置を取得
x = (197%16)*CHIP_SIZE;
y = (197/16)*CHIP_SIZE;

bufferg.drawImage(chara_image,
d.width/4, d.height/4 + 2 +game_buffer[7]*16,
d.width/4+CHIP_SIZE/2, d.height/4 + 2+game_buffer[7]*16+CHIP_SIZE/2,
x,y,x+CHIP_SIZE/2,y+CHIP_SIZE/2,this);
}

//ゲームEND
if(game_flags[14]){
bufferg.setColor(Color.white);
bufferg.drawString("Fin",d.width/2-18,d.height/2);
}


//フォント
if(game_flags[7]){
bufferg.setColor(Color.black);
bufferg.drawString("マップサイズ("+map_width+","+map_height+")。イベントの個数("+event_num+")",10,20);
bufferg.drawString("現在の座標はmap(" +My.x+ "," +My.y+ ")。" +
"p(" +(int)My.px+ "," +(int)My.py+ ")。",10,40);

//イベント中
if(game_flags[2]){
bufferg.drawString("イベント中",10,60);
}
}

//ウインドウを更新する
g.drawImage(buffer,0,0,this);
}


//---------------------マップ描画------------------------
void DispMap(Graphics bufferg){
int i,j,x,y;
int cell_data,gra;
Dimension d = getSize();

//画面中心座標を主人公の位置から取得
int view_x = (int)My.px + CHIP_SIZE/2;
int view_y = (int)My.py + CHIP_SIZE/2;

//カメラが行ける範囲(マップの端-画面半分)
int lim_left = d.width/2;
int lim_right = map_width * CHIP_SIZE - d.width/2;
int lim_top = d.height/2;
int lim_bottom = map_height * CHIP_SIZE - d.height/2;

//主人公がマップの端寄りの場合、カメラ固定
//世界マップ以外
if(now_map_no != WORLD_MAP){
if(My.px + CHIP_SIZE/2 < lim_left){
view_x = lim_left;
}
if(My.px + CHIP_SIZE/2 > lim_right){
view_x = lim_right;
}
if(My.py + CHIP_SIZE/2 < lim_top){
view_y = lim_top;
}
if(My.py + CHIP_SIZE/2 > lim_bottom){
view_y = lim_bottom;
}
}

//マップデータの範囲(主人公から6チップ分)
int start_x;
int start_y;
int end_x;
int end_y;

start_x = view_x/CHIP_SIZE - 6;
start_y = view_y/CHIP_SIZE - 6;
end_x = view_x/CHIP_SIZE + 6;
end_y = view_y/CHIP_SIZE + 6;

//描画位置IJ
//世界マップのみ
int disp_start_i,disp_i,disp_start_j,disp_j;
disp_start_i = start_y;
disp_start_j = start_x;

//限界
//世界マップ以外
if(now_map_no != WORLD_MAP){
if(start_x < 0){start_x = 0;}
if(start_y < 0){start_y = 0;}
if(end_x > map_width){end_x = map_width;}
if(end_y > map_height){end_y = map_height;}
}else{
//ループ
//世界マップのみ
if(start_x < 0){start_x += map_width;}
if(end_x >= map_width){end_x -= map_width;}
if(start_y < 0){start_y += map_height;}
if(end_y >= map_height){end_y -= map_height;}
}

//描画位置
int dsp_x;
int dsp_y;

for(i=start_y,disp_i=disp_start_i; ;i++,disp_i++){
//iがマップ端の場合、0に。(世界マップのみ)
if(i == map_height && now_map_no == WORLD_MAP){i = 0;}
//終了
if(i == end_y){break;}

for(j=start_x,disp_j=disp_start_j; ;j++,disp_j++){
//jがマップ端の場合、0に。
if(j == map_width && now_map_no == WORLD_MAP){j = 0;}
//終了
if(j == end_x){break;}

//セルデータ取得
cell_data = map_data[j][i];

//セルデータからマップグラフィックスを取得
gra = celltbl[ cell_data ].gra;

//マップチップからグラフィックスの位置を取得
x = (gra%16)*CHIP_SIZE;
y = (gra/16)*CHIP_SIZE;

//マップ描画位置
if(now_map_no == WORLD_MAP){
dsp_x = disp_j*CHIP_SIZE - (view_x - d.width/2);
dsp_y = disp_i*CHIP_SIZE - (view_y - d.height/2);
}else{
dsp_x = j*CHIP_SIZE - (view_x - d.width/2);
dsp_y = i*CHIP_SIZE - (view_y - d.height/2);
}

bufferg.drawImage(map_image,dsp_x,dsp_y,
dsp_x+CHIP_SIZE,dsp_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this);

//イベントがある場合はEマークを表示(デバッグ用)
if(event_data[j][i] >= 1 && game_flags[7]){
//グラフィックスの位置を取得
x = (13%16)*CHIP_SIZE;
y = (13/16)*CHIP_SIZE;

bufferg.drawImage(chara_image,dsp_x,dsp_y,
dsp_x+CHIP_SIZE,dsp_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this);
}
}
}
}

//--------------イベント(キャラクター)描画------------------
void DispEvent(Graphics bufferg){
int i;
int dsp_x,dsp_y;
int x,y;
Dimension d = getSize();

//画面中心座標を主人公の位置から取得
int view_x = (int)My.px + CHIP_SIZE/2;
int view_y = (int)My.py + CHIP_SIZE/2;

//カメラが行ける範囲(マップの端-画面半分)
int lim_left = d.width/2;
int lim_right = map_width * CHIP_SIZE - d.width/2;
int lim_top = d.height/2;
int lim_bottom = map_height * CHIP_SIZE - d.height/2;

//主人公がマップの端寄りの場合、カメラ固定
//世界マップ以外
if(now_map_no != WORLD_MAP){
if(My.px + CHIP_SIZE/2 < lim_left){
view_x = lim_left;
}
if(My.px + CHIP_SIZE/2 > lim_right){
view_x = lim_right;
}
if(My.py + CHIP_SIZE/2 < lim_top){
view_y = lim_top;
}
if(My.py + CHIP_SIZE/2 > lim_bottom){
view_y = lim_bottom;
}
}

for(i=0;i dsp_x = (int)eventtbl[i].px - (view_x - d.width/2);
dsp_y = (int)eventtbl[i].py - (view_y - d.height/2);

//グラフィックスの位置を取得(アクティブ時)
if(eventtbl[i].sh && eventtbl[i].gra != 255){
x = (eventtbl[i].gra%16)*CHIP_SIZE;
y = (eventtbl[i].gra/16)*CHIP_SIZE;

bufferg.drawImage(chara_image,dsp_x,dsp_y,
dsp_x+CHIP_SIZE,dsp_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this);
}
}

//仲間描画
for(i=CMAX-1;i>=0;i--){
if(!party[i].sh)continue;
dsp_x = (int)party[i].px - (view_x - d.width/2);
dsp_y = (int)party[i].py - (view_y - d.height/2);

//チップNO定義
int no;
if(party[i].moving_dir != 4){
no = party[i].chip_no + party[i].moving_dir*2 + My.anime_no;
}else{
no = party[i].chip_no;
}

x = (no%16)*CHIP_SIZE;
y = (no/16)*CHIP_SIZE;

bufferg.drawImage(chara_image,dsp_x,dsp_y,
dsp_x+CHIP_SIZE,dsp_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this);
}
}


//--------------主人公描画------------------
void DispMy(Graphics bufferg){
int i,j,x,y;
int cell_data,gra;
Dimension d = getSize();

//カメラが行ける範囲(マップの端-画面半分)
int lim_left = d.width/2;
int lim_right = map_width * CHIP_SIZE - d.width/2;
int lim_top = d.height/2;
int lim_bottom = map_height * CHIP_SIZE - d.height/2;

//描画開始位置
int view_x = d.width/2 - CHIP_SIZE/2;
int view_y = d.height/2 - CHIP_SIZE/2;

//マップの端に近づいてる時(カメラが行けない範囲)
//通常マップ
if(now_map_no != WORLD_MAP){
if(My.px + CHIP_SIZE/2 < lim_left){
view_x = (int)My.px;
}
if(My.px + CHIP_SIZE/2 > lim_right){
view_x += (int)My.px + CHIP_SIZE/2 - lim_right;
}
if(My.py + CHIP_SIZE/2 < lim_top){
view_y = (int)My.py;
}
if(My.py + CHIP_SIZE/2 > lim_bottom){
view_y += (int)My.py + CHIP_SIZE/2 - lim_bottom;
}
}

//主人公描画

//チップNO定義
int no = My.chip_no + My.moving_dir*2 + My.anime_no;

//チップNOからグラフィックスの位置を取得
x = (no%16)*CHIP_SIZE;
y = (no/16)*CHIP_SIZE;

bufferg.drawImage(chara_image,view_x,view_y,
view_x+CHIP_SIZE,view_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this);
}


//処理
public void action(){
int i;

//上下左右キー状態で移動処理
//エフェクト中、イベント中、会話中は受け付けない
if(game_flags[0] || game_flags[1] || game_flags[2] || game_flags[3]){;}
else{
KeyForMove();
}

//Zキー(決定キー)を押した時
if(key_states[4] == 2){
//決定キーのいろんな処理
ZAction();

//キーの状態を押し続けに変更。
key_states[4] = 1;
}

//Xキーを押した時(デバッグフラグ)
if(key_states[5] == 2){
game_flags[7] = !game_flags[7];
key_states[5] = 1;
}

//上下キーを押した時
for(i=0;i<2;i++){
if(key_states[i] == 2){
//上の場合
if(i==0){
if(game_buffer[7] > 0)game_buffer[7]--;
}
//下の場合
else if(i==1){
if(game_buffer[7] < game_buffer[8]-1)game_buffer[7]++;
}

//キーの状態を押し続けに変更。
key_states[i] = 1;
}
}

//移動中の場合
if(My.moving_flag){
MyMoving();
}

//イベント移動(エフェクト中、イベント中、会話中は受け付けない)
if(game_flags[0] || game_flags[1] || game_flags[2] || game_flags[3]){;}
else{
EventMove();
}

//イベント強制移動
if(game_flags[11]){
CharaMoving(eventtbl[ game_buffer[0] ]);
}
//主人公強制移動
if(game_flags[12]){
MyMoving();
}

//会話中の場合、文字が流れていく
if(game_flags[3]){
//0.03秒に1文字
game_waits[1] += FrameTime;
if(game_waits[1] >= 0.03f){
game_waits[1] = 0.0f;
game_buffer[6]++;
if(game_buffer[6] > game_strings[1].length()){
game_buffer[6] = game_strings[1].length();
//完了
game_flags[4] = false;
}
}
}

//マップ移動開始(幕閉じ)
if(game_flags[0]){
//黒い幕が降りてくる(1.1秒)
game_waits[0] += FrameTime;
if(game_waits[0] >= 1.1f){
game_flags[0] = false;
game_flags[1] = true;
//マップロード
readMapData(game_buffer[1]);
}
}
//マップ移動2(幕開け)
else if(game_flags[1]){
//黒い幕が上っていく(1.2秒)
game_waits[0] -= FrameTime;
if(game_waits[0] <= 0.0f){
game_flags[1] = false;
game_waits[0] = 0.0f;
}
}
//エンディング
if(game_flags[13]){
//黒い幕が降りてくる(1.1秒)
game_waits[0] += FrameTime;
if(game_waits[0] >= 1.1f){
game_flags[14] = true;
}
if(game_waits[0] >= 2.0f){
game_flags[15] = true;
}
}

//イベント中
if(game_flags[2]){
//マップ移動時、会話の時、ダイアログ中、強制移動は停止中
if(game_flags[0] || game_flags[1] || game_flags[3] || game_flags[9] ||
game_flags[11] || game_flags[12]){;}
else{
ActionScript();//スクリプト実行
}
}
}

//イベント移動開始
void EventMove(){
int i;
int ran;
int dir;
int next_x,next_y;
boolean ismove;

for(i=0;i //動くタイプの時
if(eventtbl[i].type_of_move == 1){
//休憩中の時
if(eventtbl[i].sum_move_length < 0.0f){
eventtbl[i].sum_move_length += FrameTime;
}else
//現在、移動中でないなら移動開始(2秒ペースで休憩)
if(!eventtbl[i].moving_flag){
//ランダムに方向を決める
ran=rand.nextInt();
if(ran<0){ran=-ran;}
dir = ran%4;//方向

//その方向は通行可能か?
next_x = eventtbl[i].x + dir_x[dir];
next_y = eventtbl[i].y + dir_y[dir];

//System.out.println("["+i+"]next("+next_x+","+next_y+")");

//領域外
if(next_x < 0 || next_x >= map_width ||
next_y < 0 || next_y >= map_height){
//通行不可
ismove = false;
}
//障害物
else if(!celltbl[ map_data[next_x][next_y] ].move_flag){
//通行不可
ismove = false;
}
//イベント
else if(event_data[next_x][next_y] >= 1){
//通行不可
ismove = false;
}
//主人公の位置
else if(next_x == My.x && next_y == My.y){
//通行不可
ismove = false;
}
//それ以外
else{
//通行可
ismove = true;

//移動開始
eventtbl[i].sum_move_length = 0.0f;
eventtbl[i].moving_dir = dir;

//移動先イベントデータにKAKUHO_NOを入れる
event_data[next_x][next_y] = KAKUHO_NO;
}

eventtbl[i].moving_flag = ismove;
}
//移動中の時
else{
//その方向に向かって移動
CharaMoving( eventtbl[i] );
}
}
}
}


//Zキーの処理
void ZAction(){
//ダイアログ中は決定
if(game_flags[9]){
game_flags[9] = false;
System.out.println("Done:Dialog");
}
//会話中の時はウインドウを消す(文字が流れ終わった時)
else if(game_flags[3] && !game_flags[4]){
game_flags[3] = false;
System.out.println("Done:Talk");
}
//そうでなくてイベント中でないなら、イベントチェック
else if(!game_flags[2]){
//その方向にイベントがあるかチェック
//決定ボタンが押されると実行するものを実行
check_event(My.x + dir_x[My.moving_dir] , My.y + dir_y[My.moving_dir],1);
}
}

//キー状態で移動処理
public void KeyForMove(){
int i;
int next_x,next_y;
boolean ismove;

//上下左右キー
for(i=0;i<4;i++){
if(key_states[i] == 1){
//現在移動中か?
if(!My.moving_flag){
//移動中でないなら移動
My.moving_dir = i;

//その方向は通行可能か?
next_x = My.x + dir_x[My.moving_dir];
next_y = My.y + dir_y[My.moving_dir];

//世界マップならループさせる
if(now_map_no == WORLD_MAP){
if(next_x < 0){next_x += map_width;}
if(next_x >= map_width){next_x -= map_width;}
if(next_y < 0){next_y += map_height;}
if(next_y >= map_height){next_y -= map_height;}
}

//System.out.println("My next("+next_x+","+next_y+")");

//領域外(通常マップ時)
if(next_x < 0 || next_x >= map_width ||
next_y < 0 || next_y >= map_height){
//通行不可
ismove = false;
}
//障害物
else if(!celltbl[ map_data[next_x][next_y] ].move_flag){
//通行不可
ismove = false;
}
//イベントで、通行不可タイプ
else if(!charatbl[ eventtbl[ event_data[next_x][next_y] ].gra ].move_flag){
//通行不可
ismove = false;
}
//確保イベント
else if(event_data[next_x][next_y] == KAKUHO_NO){
//通行不可
ismove = false;
}
//それ以外
else{
//通行可
ismove = true;

//移動開始
My.sum_move_length = 0.0f;

//移動先イベントデータにKAKUHO_NOを入れる(0の時)
if(event_data[next_x][next_y] == 0){
event_data[next_x][next_y] = KAKUHO_NO;
}
}
My.moving_flag = ismove;
}
}
}
}

//自分移動
public void MyMoving(){
int i;

//その方向に移動
My.px += FrameTime * My.speed * dir_x[My.moving_dir];
My.py += FrameTime * My.speed * dir_y[My.moving_dir];

//仲間も
for(i=0;i party[i].px += FrameTime * My.speed * dir_x[party[i].moving_dir];
party[i].py += FrameTime * My.speed * dir_y[party[i].moving_dir];
}

//アニメーション(0.2秒に1回)
My.anime_wait += FrameTime;
if(My.anime_wait >= 0.2f){
My.anime_no = 1 - My.anime_no;
My.anime_wait = 0.0f;
}

//総合距離加算
My.sum_move_length += FrameTime * My.speed;

//一定距離動いたか
if(My.sum_move_length >= (float)CHIP_SIZE){
//ピッタリの位置にする
My.x += dir_x[My.moving_dir];
My.y += dir_y[My.moving_dir];

//世界マップの時
if(My.x < 0){My.x += map_width;}
if(My.x >= map_width){My.x -= map_width;}
if(My.y < 0){My.y += map_height;}
if(My.y >= map_height){My.y -= map_height;}

My.px = My.x*CHIP_SIZE;
My.py = My.y*CHIP_SIZE;
My.moving_flag = false;

//仲間もピッタリ
for(i=0;i party[i].x += dir_x[party[i].moving_dir];
party[i].y += dir_y[party[i].moving_dir];

//世界マップの時
if(party[i].x < 0){party[i].x += map_width;}
if(party[i].x >= map_width){party[i].x -= map_width;}
if(party[i].y < 0){party[i].y += map_height;}
if(party[i].y >= map_height){party[i].y -= map_height;}

party[i].px = party[i].x*CHIP_SIZE;
party[i].py = party[i].y*CHIP_SIZE;
}

//方向保存
for(i=CMAX-2;i>=0;i--){
party[i+1].moving_dir = party[i].moving_dir;
}
party[0].moving_dir = My.moving_dir;

//この位置の確保イベントを消す(KAKUHO_NOの時)
if(event_data[My.x][My.y] == KAKUHO_NO){
event_data[My.x][My.y] = 0;
}

//強制イベント移動の場合
if(game_flags[12]){
game_flags[12] = false;
My.sum_move_length = 0.0f;
}else{
//イベントチェック
//その上に重なると起動するもの。
check_event(My.x,My.y,0);
}
}
}

//キャラ移動
void CharaMoving(Event event){
int ran;

//その方向に移動
event.px += FrameTime * event.speed * dir_x[event.moving_dir];
event.py += FrameTime * event.speed * dir_y[event.moving_dir];

//総合距離加算
event.sum_move_length += FrameTime * event.speed;

//一定距離動いたか
if(event.sum_move_length >= (float)CHIP_SIZE){
//前の位置のイベントを消す
event_data[event.x][event.y] = 0;

//ピッタリの位置にする
event.x += dir_x[event.moving_dir];
event.y += dir_y[event.moving_dir];
event.px = event.x*CHIP_SIZE;
event.py = event.y*CHIP_SIZE;
event.moving_flag = false;
event_data[event.x][event.y] = event.no;

//強制イベント移動の場合
if(game_flags[11]){
game_flags[11] = false;
event.sum_move_length = 0.0f;
}else{
//小休止(ランダム1秒~3秒)
ran=rand.nextInt();
if(ran<0){ran=-ran;}

event.sum_move_length = -(ran%3+1);
}
}
}

//その場所のイベントチェック
void check_event(int x,int y,int type){
//領域外の時
if(x < 0 || y < 0 || x >= map_width || y >= map_height)return;

//イベントがあった場合(KAKUHO_NOは無視)
if(event_data[x][y] != 0 && event_data[x][y] != KAKUHO_NO){
//上に乗った時。それは触れた時に起動するものか?
if(type == 0 && eventtbl[ event_data[x][y] ].type_of_event != 1){
//違う場合は抜ける
return;
}

//決定ボタンを押した時。それ決定で起動するものか?
if(type == 1 && eventtbl[ event_data[x][y] ].type_of_event != 0){
//違う場合は抜ける
return;
}

game_buffer[0] = eventtbl[ event_data[x][y] ].no;//イベントNO記憶
game_flags[2] = true;//イベントフラグセット
//スクリプトファイル名決定
game_strings[0] = "eventscript/"+eventtbl[ game_buffer[0] ].filename+".txt";
LoadFileToBuffer( game_strings[0] );
}
}

// バッファに一気に入れる
public void LoadFileToBuffer( String filename ){
int i, x = 0;
InputStream is = null;

try{
// is = new URL(getDocumentBase(), filename).openStream();
is = classLoader.getResourceAsStream( filename );
Reader r = new BufferedReader(new InputStreamReader(is));

while((i=r.read()) != -1){
//一行ずつ読み込む
gl_event_file_buffer[x++] = (char)i;
}
is.close();
}catch(IOException e){}

// 最後に-1を入れる
gl_event_file_buffer[ x ] = 0xff;
}

//スクリプト実行
void ActionScript(){
String filename;
int i,x;
char line[] = new char[256];
InputStream is = null;

filename = game_strings[0];
if(game_flags[7])System.out.println("Script("+filename+"):Load");

//指定の行まで行く
int line_num = 0;
boolean done_flag=true;//最後まで読みきったか
boolean next_flag;//次の行も読み取るか

x=0;
for( i = 0; gl_event_file_buffer[ i ] != 0xff; i++ ){
//一行ずつ読み込む
line[x++] = (char)gl_event_file_buffer[ i ];
//System.out.print((char)i);

//改行がきた場合
if( gl_event_file_buffer[ i ] == '\n'){
//System.out.println("("+line_num+")"+String.valueOf(line));

//その行は読み込む行か?
if(line_num == game_buffer[5]){
//そうであった場合、読み込んで解析
next_flag = AnalyzeScript(line);
game_buffer[5]++;

//マップ移動、会話イベント、ダイアログなら抜ける
if(!next_flag){
done_flag = false;
break;
}
//そうでないならそのまま読み込み続ける
line_num++;
}else{
//違うなら、改行数増やして探索続行
line_num++;
}
x=0;
}
}

//最後まで読み切った場合は、フラグ解除
if(done_flag){
if(game_flags[7])System.out.println("Script("+filename+"):End");
game_flags[2] = false;

// 一行目から読み込む
game_buffer[5] = 0;

//テーブル更新予約があればテーブル更新
if(game_flags[8]){
Load_Event_Table();
game_flags[8] = false;
}
}
}

//指定の行を読み込んで解析(戻り値がある時はそれを実行し次の行へ続く)
public boolean AnalyzeScript(char line[]){
int i,x,y;
String command;
String value;
String buffer;
boolean next_flag=true;

//改行コード以降切り捨て(改行含む)
String sline = Harulib.HaruChop(line);

//コマンド取得
command = Harulib.HaruSplit(sline,":",0);

//値取得
value = Harulib.HaruSplit(sline,":",1);

if(game_flags[7])System.out.println("("+game_buffer[5]+")Script -- > com="+command+",value="+value);

//ラベル確認
if(command.equals("IF_SCENE1")){
//そのラベル以降は実行すべきか?
if(game_buffer[7] == 0){
game_flags[10] = false;//スキップ解除してそのまま実行
}
else{
//実行しない。スキップ開始。
game_flags[10] = true;
}
}else if(command.equals("IF_SCENE2")){
//そのラベル以降は実行すべきか?
if(game_buffer[7] == 1){
game_flags[10] = false;//スキップ解除してそのまま実行
}
else{
game_flags[10] = true;
}
}else if(command.equals("IF_SCENE3")){
//そのラベル以降は実行すべきか?
if(game_buffer[7] == 2){
game_flags[10] = false;//スキップ解除してそのまま実行
}
else{
game_flags[10] = true;
}
}else if(command.equals("END_SCENE")){
//スキップ終了
game_flags[10] = false;
}

//スキップ実行の時
if(game_flags[10]){
return true;//抜ける
}

//コマンドによってイベント実行

//マップ移動コマンド
if(command.equals("move")){
System.out.println("Do:Move");

//移動イベント開始
game_flags[0] = true;

//値を解析

buffer = Harulib.HaruSplit(value,"=",0);
game_buffer[1] = Integer.parseInt(buffer);//移動先マップNO

buffer = Harulib.HaruSplit(value,"=",1);
game_buffer[2] = Integer.parseInt(buffer);//X

buffer = Harulib.HaruSplit(value,"=",2);
game_buffer[3] = Integer.parseInt(buffer);//Y

buffer = Harulib.HaruSplit(value,"=",3);
game_buffer[4] = Integer.parseInt(buffer);//方向

next_flag=false;
}

//会話コマンド
else if(command.equals("talk")){
System.out.println("Do:Talk");

//会話イベント開始
game_flags[3] = true;

//流れ始める。
game_flags[4] = true;

//会話
game_strings[1] = value;

//char配列にコピー
game_strings[1].getChars(0,game_strings[1].length(),game_talks,0);

//文字の位置
game_buffer[6] = 1;//1文字目

next_flag=false;
}

//ゲーム進行スイッチオンコマンド
else if(command.equals("switch_on")){
System.out.println("Do:switch_on");

game_switch[ Integer.parseInt(value) ] = true;

//テーブル更新予約
game_flags[8] = true;
}
//ゲーム進行スイッチオフコマンド
else if(command.equals("switch_off")){
System.out.println("Do:switch_off");

game_switch[ Integer.parseInt(value) ] = false;

//テーブル更新予約
game_flags[8] = true;
}
//分岐1
else if(command.equals("SCENE1")){
System.out.println("Do:SCENE1");
game_strings[2] = value;
}
//分岐2
else if(command.equals("SCENE2")){
System.out.println("Do:SCENE2");
game_strings[3] = value;
game_buffer[7] = 0;
game_buffer[8] = 2;//選択肢の数
}
//分岐3
else if(command.equals("SCENE3")){
System.out.println("Do:SCENE3");
game_strings[4] = value;
game_buffer[7] = 0;
game_buffer[8] = 3;//選択肢の数
}
//ダイアログを出す
else if(command.equals("DIALOG")){
System.out.println("Do:DIALOG");
game_flags[9] = true;
next_flag=false;
}
//イベントを一時的に消去
else if(command.equals("temperace")){
System.out.println("Do:temperace");
event_data[eventtbl[ game_buffer[0] ].x][eventtbl[ game_buffer[0] ].y] = 0;
eventtbl[ game_buffer[0] ].sh = false;
eventtbl[ game_buffer[0] ].gra = 255;
next_flag=true;
}
//イベント強制移動
else if(command.equals("emove")){
System.out.println("Do:emove");
//方向
if(value.equals("up")){eventtbl[ game_buffer[0] ].moving_dir = 0;}
else if(value.equals("down")){eventtbl[ game_buffer[0] ].moving_dir = 1;}
else if(value.equals("left")){eventtbl[ game_buffer[0] ].moving_dir = 2;}
else if(value.equals("right")){eventtbl[ game_buffer[0] ].moving_dir = 3;}

game_flags[11] = true;
next_flag=false;
}
//主人公強制移動
else if(command.equals("mymove")){
System.out.println("Do:mymove");
//方向
if(value.equals("up")){My.moving_dir = 0;}
else if(value.equals("down")){My.moving_dir = 1;}
else if(value.equals("left")){My.moving_dir = 2;}
else if(value.equals("right")){My.moving_dir = 3;}

game_flags[12] = true;
My.sum_move_length = 0.0f;
next_flag=false;
}
//イベント速度変更
else if(command.equals("espeed")){
System.out.println("Do:espeed");
eventtbl[ game_buffer[0] ].speed = (float)Integer.parseInt(value);
next_flag=true;
}
//仲間になる
else if(command.equals("join")){
System.out.println("Do:join");
for(i=0;i if(!party[i].sh){
party[i].sh = true;
party[i].chip_no = Integer.parseInt(value);
break;
}
}
next_flag=true;
}
//スクリプト強制終了
else if(command.equals("endscript")){
next_flag = true;
game_buffer[5] = 9999;
}
//ゲームエンド
else if(command.equals("gameend")){
System.out.println("Do:gameend");
game_flags[13] = true;
next_flag=true;
}
return next_flag;
}


//キーが押された瞬間(使わない)
public void keyTyped(KeyEvent e){}

//キーを押している時
public void keyPressed(KeyEvent e){
int key;

key=e.getKeyCode();

switch(key){
//上キー
case KeyEvent.VK_UP:
//最初に押した時に2を入れる
if(key_states[0] == 0){
key_states[0] = 2;
}
break;
//下キー
case KeyEvent.VK_DOWN:
//最初に押した時に2を入れる
if(key_states[1] == 0){
key_states[1] = 2;
}
break;
//左キー
case KeyEvent.VK_LEFT:
key_states[2] = 1;
break;
//右キー
case KeyEvent.VK_RIGHT:
key_states[3] = 1;
break;
//Zキー
case KeyEvent.VK_Z:
//最初に押した時に2を入れる
if(key_states[4] == 0){
key_states[4] = 2;
}
break;
//Xキー
case KeyEvent.VK_X:
//最初に押した時に2を入れる
if(key_states[5] == 0){
//key_states[5] = 2;
}
break;
}
}

//キーが放された瞬間
public void keyReleased(KeyEvent e){
int key;

key=e.getKeyCode();

switch(key){
//上キー
case KeyEvent.VK_UP:
key_states[0] = 0;
break;
//下キー
case KeyEvent.VK_DOWN:
key_states[1] = 0;
break;
//左キー
case KeyEvent.VK_LEFT:
key_states[2] = 0;
break;
//右キー
case KeyEvent.VK_RIGHT:
key_states[3] = 0;
break;
//Zキー
case KeyEvent.VK_Z:
key_states[4] = 0;
break;
//Xキー
case KeyEvent.VK_X:
key_states[5] = 0;
break;
}
}
}

以上引用
このソースはオープンソースです。
著作者のホームページはhttp://www.harukitchen.com/rpg_programming/18/18.htm
JavaプログラマーにもなれちゃうRobocode&ゲームプログラミング学習術JavaプログラマーにもなれちゃうRobocode&ゲームプログラミング学習術
(2003/11)
可知 豊

商品詳細を見る



おさるVS山川恵里佳 書道家になりたい

私も多趣味なのでわかりますが、
基本、経済的に現実的じゃないと成り立ちません。
おさるは、細木数子にモンキッキーっていうセンスの無い芸名を付けられて非運だったけど、なんか、そこらへんが落ち目だった気がする。
モンキッキーって、画数15画で吉数だけど、
関係ないだろ。
今年の大殺界も全然当たってないし、細木数子は本当災難女だわ。

おさるは、書道っていったって、書道なんて一度道具買ったらあとは紙代ぐらいしかかからないだろうに、
DJセットだって、一度買ったら、後買うものなんてないだろ。
問題は、仕事をしてないことなんだろ。
仕事をしてれば言われない文句だろうに。

それを、書とDJと芸能をコラボレーションするみたいな、有り得ない言い訳しているから突っ込まれるんだよね。

多芸の人にありがちだわ。
○○と△△をコラボレーションするとかって。
ありがち。
書とDJは無理だろ。
音楽聞きながら書くのか。

・・・・・・・

MBCの韓国語ニュース2000‐2009年MBCの韓国語ニュース2000‐2009年
(2010/03)
MBC放送報道局

商品詳細を見る

一見難しかった韓国語のニューススクリプトだったんだけど(上級者向けテキスト)、この前、NOVAの韓国語レッスンの合間に、ロッテリアで日本語対訳と一緒に読んでたら、案外簡単だったわ。

もちろん、それは、ずっと継続して勉強してきたおかげなんだけど。
ちんぷんかんぷんだった数年前よりは上達しているのが分かった。
ハングル検定4級合格は伊達じゃないってことだね。

「ν-ガンダムは伊達じゃない!」
みたいな。

中国語で勉強した経験だけど、ニュースのスクリプトを読んで、理解して、それを4~5回繰り返して音読するあたりから、語学の成長曲線が急速に上昇します。

つまり、韓国語も先が見えてきたってわけ。

ハングル検定4級は伊達じゃない。


書道と音楽のコラボレーション


Collaboration of calligraphy and music


서도와 음악의 콜라보레이션
ソドワ ウマギ コルラボレイション


书法和音乐的协作
shu1 fa3 he2 yin1 yue4 de xie2 zuo4

格闘ゲーム作成へ再び・・・/クワドリンガルへの道


誰かさんが作ったゲーム。
まさにファミコンライク↑↑

tinnmi
以前作った鉄拳チンミのゲームはあまりにもプロトタイプすぎて、ゲームとして成立していなかった。
そのため、今一緒にゲームを作っているプログラマーさんの協力を得て、本格的、スト2的な鉄拳チンミのゲームを完成させたいと思っている。

動画用の絵を描くのは時間がかかるものの、自分ならできるという自負がある。
スト2的にキャラクターを選べるものにしたいと考えている。

登場キャラクターは、
チンミ、シーファン、タンタン、ヨーセン道士、ボル将軍、オウドウ、あたりは必須として、、、
他には、シバ、ソウビ、ツェン隊長、ガンテイ

ここら辺を出していきたい。

ゲームの絵については、画力の問題ではなくて、自分自身がゲームのドット絵を描くのに慣れてない問題がある。
高性能のイラストレーターがあればもっと良い絵が描けるんだけど、GIMPではちょっと限界があるかもしれない。

いや、やっぱ違う、、、
GIMPで良い絵を描いている人はたくさんいる。
事実、自分もGIMPでリアル画を描いたことがあるじゃないか。

GIMPに問題があるんじゃなくて、自分の描画方法に問題があるんだと思う。

とにかく、超かっちょいい、チンミの格闘画を描いて、それをスマートなプログラミングで動かしたい。
そして、ちゃんとした格闘ゲームを作りたい。
それが自分の使命だから。
borushougun

yo-sendusi

スト2クオリティで、ボル将軍 VS ヨーセン道士とかって夢のバトルができるのは夢。
シーファン VS ヨーセン道士 とか、
オウドウ VS ボル将軍 とか、

とにかく、自分がやれることは、まず超丁寧に、超かっちょいい絵を描くこと。
それに尽きる。

それから、プログラミングの欠点を探し出し、
さらに、格闘ゲームのアルゴリズムを考え直すこと。

鉄拳チンミの格闘ゲーム、もちろん、3Dでできたら素晴らしいんだけどまずは、2D。
近いうち、完成させたいと思ってます。

・・・・・・・・・・・・
・・・・・・・・・・・・

bosu
今作っているアクションゲームはかなり良いところまでいってます。
ボスキャラです↑↑

・・・・・・・・・・・・

これから、ハシゴのロジックを完成させ、壊れるブロックなど、マリオ的な要素を追加していきます。

勇者と冒険する ゲームプログラミングの世界: enchant.js+JavaScriptで行こう!勇者と冒険する ゲームプログラミングの世界: enchant.js+JavaScriptで行こう!
(2013/08/21)
布留川 英一

商品詳細を見る

最近はenchant.jsなどがあって、ゲームプログラミングへの垣根が随分低くなってきたみたいです。

私は今、Javaで作ってますが、それこそ、私より5~10歳上の世代ではBASICなんか使ってゲーム作っている人いましたし、プログラマーは16進数やらアセンブラやら難解な言語でプログラミングしていましたから、良い時代になったものです。

中高生でもゲームが作れてしまいますよね。
さすがに、今私がJavaで作っているゲームは作るのは難しいかと思いますが。

・・・・・・・・・・・・・
・・・・・・・・・・・・・

Windowsゲームプログラミング (Game developer)Windowsゲームプログラミング (Game developer)
(2004/05)
赤坂 玲音

商品詳細を見る

ゲームプログラマになる前に覚えておきたい技術ゲームプログラマになる前に覚えておきたい技術
(2008/11/15)
平山 尚(株式会社セガ)

商品詳細を見る


一年後の自分予想

中国語ペラになる

韓国語ペラになる

つまり、クワドリンガルになる

( (≪●≫) )Д( (≪●≫) )

クワ

です。

クワドリンガルとは、4ヶ国後話者で、バイリンガル、トリリンガルときて、クワドリンガルです。

英、中、韓、日 ペラの

クワドリンガルです。


来年までにいくつ検定を受けられるか分かりませんが、
韓国語は3級、中国語は2級、英語はTOEICで800点台後半から900点台になっていたい。

・・・・・・・・・・・・・・

クワドリンガルになるための韓国語翻訳日記

사립대 등록금 '훌쩍' 넘는 연 1천253만원 유치원도

사립유치원의 학비 부담이 전국 평균 연 245만원에 달한 것으로 조사됐다. 국가지원금을 제외하고 순수 학부모 부담금만 공표되기는 이번이 처음이다.

지역별로 서울의 사립유치원이 월등히 비쌌다. 서울의 한 사립유치원은 연간 비용이 1천200만원을 넘어서기도 했다.

excite翻訳
私立大登録料'ふわりと'越える年1千253万ウォン幼稚園も

私立幼稚園の学費負担が全国平均年245万ウォンに達したと調査された。 国家支援金を除いて純粋父兄負担金だけ公表されることは今回が初めてだ。

地域別でソウルの私立幼稚園が飛び切り高かった。 ソウルのある私立幼稚園は年間費用が1千200万ウォンを越えることもした。


사립대私立大 등록금登録料 '훌쩍ふわりと' 넘는越える 연年 1천千 253만원万ウォン 유치원도幼稚園も

사립私立 유치원의幼稚園の 학비学費 부담이負担が 전국全国 평균平均 연年 245만万 원에ウォンに 달한達した 것으로と 조사됐다.調査された 국가国家 지원금을支援金を 제외하고除いて 순수純粋 학부모父兄 부담금만負担金だけ 공표公表 되기는されることは 이번이今回が 처음이다.初めてだ

지역별로地域別で 서울의ソウルの 사립私立 유치원이幼稚園が 월등히とびきり 비쌌다.高かった 서울의ソウルの 한ある 사립私立 유치원은幼稚園は 연간年間 비용이費用が 1천千 200만원을万ウォンを 넘어서기도越えることも 했다.した

・・・・・・・・・・・・・・
・・・・・・・・・・・・・・

なんとなく、クワドリンガルへの道も先が見えてきた感がある。
毎日やってただけある。

NOVAでの中韓の月ごとのローテーションと、月1回の英語が功を奏している。
これで1万2千円は安いものだ。

・・・・・・・・・・・・・・
・・・・・・・・・・・・・・


多言語の月ごとのローテーション


Multilingual monthly rotation


다언어의 월마다의 로테이션
タオノィ ウォルマダィ ロテイション


多言语的每月的投手的替换顺序
duo1 yan2 yu3 de mei3 yue4 de tou2 shou3 de ti4 huan4 shun4 xu4

新たな出会い/新しいゲーム

back
新しいゲームのタイル画像、そう、テーマはお菓子。

右上のはキャラメルを意識しました。

今日、がっつり開発して、できればこの夏中に完成させたいです。
イメージとしては魔界村。
お菓子のポップな魔界村。(どんなだよ)

・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・

さて、
今日は研修の結果がわかります。
もうOKなのか。
NGなのか。
私のテンションが決まります。

・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・

昨日、ある異性の方と知り合いになった。
子持ちの方だ。
でも、独身で。
お相手を探しているみたい。
一応、友達になった。

どう展開するかは分からない。
友達で終わるか、良い関係になるか。

・・・・・・・・・・・・・・・

我认识了一个人。
她有一个孩子。
他是五岁。
我不知道这的关系成为这样的。
所以,我以前有一个孩子不过我们不成为好关系。

nikko123
日航123墜落から28年ですね。

私も覚えています。
坂本九が亡くなったから。
物心がついてから、芸能人が亡くなったのは、たこ八郎に続いて坂本九が二番目だった。

ああ、人って死ぬんだ、、芸能人でも死ぬんだ、、って思った記憶がある。

この事故は、太平洋上で圧力隔壁が破損して内圧で垂直尾翼が無くなって、アンコントローラブルになったことが原因だったんだ。
私の発想だと、太平洋上に着水できなかったのかとか、横田基地に着陸できなかったのかとか考えるけど、実際に当時の怖いボイスレコーダーを聞くと、もう、そういう状態じゃなくて、
ダッチロールを繰り返すなかでパニック寸前のパイロットが機体を立て直そうと必死だったのがわかります。


新たな出会い


New encounter


새로운 만남
セロウン マンナム


新的相遇
xin1 de xiang1 yu4

これはまさに、芸能会のフォアグラやーー!!/ゲームの拡張ソース

hikomaro
before
自分が初めて彦摩呂を知ったのはこんな感じの時だった。
debumaro
after
このくらいで止めておけばよかったのに。
debudebumaro
and after
その先に行っちゃったよ。
hikomaro
爆発!
完全に抑制ができてない状態。危ない。

彦摩呂 太り過ぎ、

これはもう、
テレビ界のフォアグラやーーー!!


彦摩呂の太り方は病的。
一時期は料理がおいしく見えたけど、今は逆効果、彼の紹介している料理が毒に見えてくる。
今も吉野家のCMをCNNjでやってたけど、
山田邦子と一緒に売ってるのを見て、うわ、って思った。

本気で痩せないと絶対やばいって。
糖尿病路線まっしぐらでしょ。

内圧で眼球が飛び出してるように見える。

池上彰
金融危機 サブプライムローンとリーマンショック

以下引用
2007年のサブプライムローン(サブプライム住宅ローン危機)問題に端を発した米国バブル崩壊を動機に(サブプライムローンという債権をあたかも資本と思い込ませた借金の転売による多重債務)、多分野の資産価格の暴落が起こっていた。リーマン・ブラザーズも例外ではなく多大な損失を抱えており、2008年9月15日(月)に、リーマン・ブラザーズは連邦破産法第11章の適用を連邦裁判所に申請するに至る。この申請により、リーマン・ブラザーズが発行している社債や投信を保有している企業への影響、取引先への波及と連鎖などの恐れ、及びそれに対する議会政府の対策の遅れからアメリカ経済に対する不安が広がり、世界的な金融危機へと連鎖した。日経平均株価も大暴落を起こし、9月12日(金)の終値は12214円だったが、10月28日には一時は6000円台(6994.90円)まで下落し、1982年10月以来26年ぶりの安値を記録した。

引用元:ウィキペディア

不動産価格は値上がりするという前提を元に、借金を返せない人に住宅ローンを貸した(サブプライムローン)。
さらに、その債権をファンドとして投資家に売ったリーマンブラザーズ。
不動産バブルは崩壊し、信用不安が投資家に広がる。こうして、投資家が一気に株や証券を手放すことから始まった金融危機をリーマンショックという。

・・・・・・・・・・・・・

歴史は繰り返す。
賢者は歴史に学ぶ。
愚者は経験に学ぶ。

・・・・・・・・・・・・・
・・・・・・・・・・・・・
・・・・・・・・・・・・・

昨日書き足したJavaのソース
ボスのヤラレエフェクト
ボスの体力が0になると、爆発を発生させながら下に降りていき、ゲームクリアーという、シューティングゲームなどでよくある演出です。

public void runGameMainBossEffect(Graphics g) {
// 爆発
midiseq.stop();
for (int i = 0; i < 1; i++) {
ループをまわします。boss.chara_xはボスクラスのX座標、yは同様にY座標でそこにランダムに値を加えます。ランダム値×横幅(もしくは縦幅です)↓↓
int x = boss.chara_x + (int)(Math.random()*boss.image_w);
int y = boss.chara_y + (int)(Math.random()*boss.image_h);
bakuhatsus.add(new Bakuhatsu(x, y, charaimage));
}
// 爆発音
//seClip1.stop();
//seClip1.setFramePosition(0);
//seClip1.start();
//
音はうるさいので辞めます。代わりにボスクリアーのジングルをながそうと思います。↑↑
boss.draw(g,this);
// 演出モード終わり判定
if (iBossEffectCount-- < 0) {
カウント値を(100)設けて、0になったら終了。(画面遷移)
boss = null;
gamemainstate = GM_ZAKO;
goStageClear();
}
}
public void runGameMainBoss(Graphics g) {
//midiseq.stop();
// midiseq.setTickPosition(0);//2
//midiseq.start();//2
if (boss == null) {
if(stagenum == 1){
↓↓パラメータは、ボスの初期位置X、Yと画像ナンバー、動きパターン(X、Y、回数)
boss = new Boss(GAMEN_W - 150, GAMEN_H/2 - 100, biBoss3, "-1,-3,50,-1,3,50,1,-3,50,1,3,50,-10,10,50,0,-20,50,10,10,50");//x,y,kaisuu
}else if(stagenum == 2){
boss = new Boss(GAMEN_W - 150, GAMEN_H/2 - 100, biBoss4, "-1,-3,50,-1,3,50,1,-3,50,1,3,50,-5,5,50,0,-10,50,5,5,50,-3,3,50,0,-6,50,3,3,50");
}else if(stagenum == 3){
boss = new Boss(GAMEN_W - 150, GAMEN_H/2 - 100, biBoss5, "-1,-3,50,-1,3,50,1,-3,50,1,3,50,-15,0,50,15,0,50,0,-5,50,-15,0,50,15,0,50,0,10,50,-15,0,50,15,0,50,0,-5,50");
}else{
boss = new Boss(GAMEN_W - 150, GAMEN_H/2 - 100, biBoss2, "-1,-3,50,-1,3,50,1,-3,50,1,3,50,-10,10,50,0,-20,50,10,10,50,-10,0,50,10,0,50,-10,0,50,10,0,50,-10,-10,50,0,20,50,0,-20,50,10,10,50");
}
}
boss.draw(g,this);
//敵も弾を発射を追加
if (Math.random()*tekitamarate<5){
tekitamas.add(new TekiTama(boss.chara_x-8, boss.chara_y+24,jiki.chara_x, jiki.chara_y, charaimage));
}
↓↓イテレーターは繰り返し処理に使います。大量にある弾との当たり判定など簡単に処理できます。
Iterator it3 = tekitamas.iterator();
while(it3.hasNext()==true){
TekiTama tt = (TekiTama)it3.next();
if(tt.isAtari(jiki)){
if(breakBarrier()){
break;
}
↓↓このゲームの変わりダネは、アイテム数=HPというところ。
if(!barrierflag){
iGotItemNum -= 1;
if(iGotItemNum < 0)goGameOver();
break;
}
}
}
it3 = tekitamas.iterator();
while(it3.hasNext()==true){
TekiTama tm = (TekiTama)it3.next();
tm.draw(g,this);
if(tm.isSotoNiDeta()==true) it3.remove();
↑↑弾が画面外に出たらリムーブ(オブジェクトを削除)
}
Iterator it2 = jikitamas.iterator();
while(it2.hasNext()==true){
JikiTama jt = (JikiTama)it2.next();
if(boss.isAtari(jt)==true) {
bakuhatsus.add(new Bakuhatsu(jt.chara_x, jt.chara_y, charaimage));
//lstItem.add(new Item(objBoss.chara_x, objBoss.chara_y, biItem));
//it.remove();
it2.remove();
iBossTairyoku--;
// ボスを倒した場合
if (iBossTairyoku < 0) {
//boss = null;//ここ消してみた
// やられる動きをするボスに作り直す
今回追加部分↓↓ボスのヤラレエフェクトのためにbossをnullにしないでやられる画像を描画する。
if(stagenum == 1){
boss = new Boss(boss.chara_x, boss.chara_y, biBoss3, "0,1,10");//x,y,kaisuu
}else if(stagenum == 2){
boss = new Boss(boss.chara_x, boss.chara_y, biBoss4, "0,1,10");
}else if(stagenum == 3){
boss = new Boss(boss.chara_x, boss.chara_y, biBoss5, "0,1,10");
}else{
boss = new Boss(boss.chara_x, boss.chara_y, biBoss2, "0,1,10");
}
//gamemainstate = GM_ZAKO;
gamemainstate = GM_BOSS_EFFECT;
//goStageClear();
iBossEffectCount = 100;
return;
}
score = score+10;
seClip1.stop();
seClip1.setFramePosition(0);
seClip1.start();
break;
}
}
if(boss.isAtari(jiki)){
if(breakBarrier()){
}
if(!barrierflag){
iGotItemNum -= 2;
if(iGotItemNum < 0)goGameOver();
}
}
}
↑↑前回追加したバリアーのソース

・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・

Flowers for AlgernonFlowers for Algernon
(2004/06/14)
Daniel Keyes

商品詳細を見る

『アルジャーノンに花束を』を読んでいるんだけど、
まあ、
設定が、主人公が知的障害者で、ロボトミー(?)を受けるみたいなんだけど、
主人公が書いたレポート形式だから、敢えて、知的障害者らしく、誤字脱字を多くしてるみたいなんだけど、
ほんと、ほんっと、
読みにくい。

って、か。
英字で読んでるからなおさら読みにくい。

peopleを、pepulとかって書いてあって、1/4ぐらいの文字が誤字って、いくら知的障害者でも、障害者を馬鹿にしてないかってくらい間違えてる。

いや、もちろん、そんな作品じゃないって分かってるけど。

・・・・・・

でも英語力の向上のためにも頑張って読み続けます。
ちなみに、アルジャーノンはネズミの名前だったんですね。

・・・・・・・・・・・・
・・・・・・・・・・・・

今日は連休最終日。
頑張ってゲームプログラミングを書きかえようと思います。
店の追加、アイテムの追加、(アイテム、地上ミサイル、溜め撃ちビーム、地雷)
エンドロール(エンディング画像)

これらを追加して、新しいゲームとして、背景画像も新しく追加していこうと思います。
今日が勝負。

まだ、ブラブラできない。

・・・・・・・・・・・・
・・・・・・・・・・・・
・・・・・・・・・・・・

韓国語学習日記
ハングル検定4級試験まで1ヵ月
がんばるんば!

시청자 여러분 안녕하십니까?

박근혜 대통령이 한미 정상회담 참석을 위해 오늘 미국으로 출국했습니다.

내일 뉴욕에 도착해 동포간담회와 반기문 유엔 사무총장 면담을 시작으로 공식일정에 들어갑니다.

첫 소식 김상협 기자입니다.

視聴者皆さんこんにちは。

パク・クネ大統領が韓米首脳会談出席のために今日米国に出国しました。

明日ニューヨークに到着して同胞懇談会とパン・ギムン国連事務総長面談を始め公式日程に入ります。

初めてのお知らせキム・サンヨプ記者です。

시청자視聴者 여러분みなさん 안녕하십니까?こんにちは

박근혜パククネ 대통령이大統領が 한미韓米 정상회담首脳会談 참석을出席の 위해ために 오늘今日 미국으로米国に 출국했습니다.出国しました

내일明日 뉴욕에ニューヨークに 도착해到着して 동포同胞 간담회와懇談会と 반기문パンギムン 유엔国連 사무총장事務総長 면담을面談を 시작으로始め 공식일정에公式日程に 들어갑니다.入ります

첫初めての 소식お知らせ 김상협キムサンヨプ 기자입니다.記者です

・・・・・・・・・・・
・・・・・・・・・・・


劇的な太り方


The dramatic way of growing fat


극적인 살찌는 방법
グクチョギン サルジヌン パンポプ


戏剧性的胖方法
xi4 ju4 xing4 de pang4 fang1 fa3

アイテムを描画/川崎重工業買う/音信の人から連絡来る/韓国語学習日記/ユタと不思議な仲間たちを観る

charge
チャージビーム用アイテム
missle
地上の敵破壊用ミサイルアイテム

先ほど、午前2時ごろからGIMPで描画しました。

これから作るゲームの画像を描くのは楽しい。
なんといっても、画像はゲームの命。
自分が描く画像のクオリティやイメージによってゲームの質、面白さ、感覚が変わってくる。
だから画像は命なんです。

前回作ったシューティングも、あのパステルテイストの絵と、音楽があのゲームを作ったと言ってもいいです。

チャージビームは、溜め撃ちビーム、ボタンを押し続けると気が溜まって強いビームが出る古いけど、妖怪道中記やRタイプみたいなやつ。
ミサイルは地上の敵を攻撃するもの、(これまた超古いけど)ゼビウスでいうブラスター。

このGWに改造をします。

・・・・・・・・・・・
・・・・・・・・・・・
・・・・・・・・・・・

kawasakijuukougyou
川崎重工業株
316円×1000株で買い注文

本日買いの銘柄フィルタリング

出来高ランキングより

神戸製鋼所5406 長谷工コーポ1808 みずほフィナン8411 三井住友1821 日本橋梁5912 三菱UFJフィナン8306 マツダ7261 野村ホール8604 三井住友トラスト8309 アイフル8515 ソニー6758 東芝6502 川崎汽船9107 新日鐵5401 川崎重工業7012 エス・サイエンス5721

この中から川崎重工業が有力と判断し、買いです。
出来高が高くても、明らかに売り気配が強い場合は避けます。
川崎重工業の場合は平均的な評価値よりもぐっと値を下げているので買いました。


ユタと不思議な仲間たち

ペドロ 菊池正 ダンジャ 柏谷巴絵 ゴンゾ 伊藤潤一郎 モンゼ 和田侑子 ヒノデロ 道口端之 ユタ 上川一哉

ユタと不思議な仲間たちを見ながらGIMPで絵を描いていた。

shugar
シュガーラッシュ

「ゲーム」ってことで、ちょっと気になる映画。
でも、一人で観に行く裕木奈江。
じゃなくて、勇気無い。

・・・・・・・・・・
・・・・・・・・・・

終わってる人生(そうなの?)
をなんとかして挽回したい。
っくやしーー、
リア充に踏みにじられた、この私を。
明るい人生を取り返したい

生江さんに私の尻尾をひっつかまれて、
好き放題にされた、
滅茶苦茶にされた、
自分のプロ職業生活。

・・・・・・・

音信不通さんから連絡あり。
これは脈ありなのか。
期待していいのか。

リア充になりたい。
こんな人生嫌だ。

・・・・・・・

自分の焦る性格、
おっちょこちょい、
なってない、なにもかも、不足
後から気付く失敗、

・・・・・・・


最も残酷な死刑  【ファラリスの雄牛】

・・・・・・・

・・・・・・・・・・・・・・
・・・・・・・・・・・・・・

韓国語学習日記

북한이 여전히 미사일을 쏠 수 있는 발사 대기 상태를 유지하고 있는 것으로 확인됐습니다.

한미 연합 독수리 훈련이 내일 끝나기 때문에 북한의 도발 여부는 좀 더 지켜봐야할 것 같습니다.

박진영 기자입니다.

北朝鮮が依然としてミサイルを撃つことができる発射待機状態を維持していると確認されました。

韓米連合鷲訓練が明日終わるので北朝鮮の挑発の有無はもう少し見守らなければならないようです。

パク・チニョン記者です。

북한이北朝鮮が 여전히依然として 미사일을ミサイルを 쏠撃つ 수こと 있는ができる 발사発射 대기待機 상태를状態を 유지하고維持して 있는いる 것으로ことを 확인됐습니다. 確認されました

한미韓米 연합連合 독수리鷲 훈련이訓練が 내일明日 끝나기終わる 때문에ので 북한의北朝鮮の 도발挑発 여부는有無は 좀もう 더少し 지켜봐야할見守らなければならない 것こと 같습니다.同じです

박진영パクチニョン 기자입니다.記者です

韓国語は日本人には覚えやすい言語と言いますが、
それでも、ハングルのとっつきにくい表記になれるまでは、毎日(できれば)韓国語を翻訳して読むということを続けていく必要があるようです。

1ヶ月後のハングル検定までがんばろうと思います。

4級をとる実力はあるハズです。

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・

今のプログラマーの講師が、基本情報技術者試験を受けることを勧めている。

確かに、今の自分の実力だったらリベンジできるチャンスだし、
講師がいる今のうちに取るというのも良い考え(韓国語でいうと、チョウンセンガギ)かもしれない。

その講師は応用情報技術者も持ってるので、そこまで狙うのも良い考えかも。

それから、TOEICも900点狙おう。
MICROを読んで、もうすぐ読み終わって、読む力も確実についているから。

・・・・・・・・・

まだブラブラできない。

平成25年度【春期】【秋期】 応用情報技術者 合格教本 (情報処理技術者試験)平成25年度【春期】【秋期】 応用情報技術者 合格教本 (情報処理技術者試験)
(2012/12/11)
大滝 みや子、岡嶋 裕史 他

商品詳細を見る


・・・・・・・・・・・・・
・・・・・・・・・・・・・

昨日、町でスケボーに乗っている人がいて、
自分もスケボーで移動しようかなとかって思った。
東方興産 Calipro 28東方興産 Calipro 28
()
東方興産

商品詳細を見る


・・・・・・・・
・・・・・・・・


スケボーで移動する


It moves by a skateboard. (主語はItじゃないと思います)


스케이트보드에서 이동한다
スケイトゥボドエソ イドンハダ


滑板移动
hua2 ban3 yi2 dong4

NEC株購入 川崎重工売却/ゲームのソース書き換え

nec
NEC
251円×1000株で買い注文

・・・・・・・

本日買いの銘柄
出来高
みずほフィナン 長谷工コーポ アイフル オリエントコーポ マツダ 三井住友建設 新日鐵 三井住友トラスト 川崎汽船 新生銀行 エス・サイエンス 日立製作所 大和証券G 太平洋セメント パナソニック 大成建設 日産自動車 りそな ソニー シャープ 日本郵船 三井物産☆ 鹿島 三井住友フィナン NEC☆

チャート
NEC

要チェック銘柄 8918 ランド

川崎重工業 売却
2,000株-316円

310円で購入したので、12000円の利益

累計国内株利益 :35万9550円
年度内国内株利益:24万6850円

・・・・・・・・・・・・
・・・・・・・・・・・・

バグがあったので、ソースをいくつか書き換える。

public class TikeiMap {
static final int CHIP_W = 24;
static final int CHIP_H = 24;
static final int VIEW_W = YokoShootMain.GAMEN_W/CHIP_W;
static final int VIEW_H = YokoShootMain.GAMEN_H/CHIP_H;

public static final int SCROLL_SPEED = 2;

BufferedImage tikeiimage;
int mapnagasa, worldx;
String[] tekipattern = new String[10];
String[] mapdata = new String[VIEW_H];

TikeiMap(BufferedImage img, String mapname, String tekipatname){
tikeiimage=img;
worldx=0;

InputStream is = getClass().getResourceAsStream(mapname);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try{
for(int i=0; i mapdata[i] = br.readLine();
if (mapdata[i]==null) {
System.err.println("invalid mapdata");
System.exit(0);
}
}
br.close();
is.close();
} catch(Exception e){
e.printStackTrace();
}
mapnagasa=mapdata[0].length();
is = getClass().getResourceAsStream(tekipatname);
br = new BufferedReader(new InputStreamReader(is));
try{
for(int i=0; i tekipattern[i] = br.readLine();
if (tekipattern[i]==null) break;
}
br.close();
is.close();
} catch(Exception e){
e.printStackTrace();
}

}
int getMapData(int x, int y){
ここらへんをコメントアウト
// if(mapdata[y].charAt(x)==0)mapdata[y].charAt(x)=
if (y >=0 && y < mapdata.length && x >= 0 && x < mapdata[y].length()) {
return Character.getNumericValue(mapdata[y].charAt(x));
} else {
return 0;
}
}

↓↓ここらへん、大幅に改良
// return Character.getNumericValue(mapdata[y].charAt(x));

// return Character.getNumericValue(mapdata[y].charAt(x));

public boolean isMapEnd(){
if (worldx>=(mapnagasa-VIEW_W)*CHIP_W) return true;
else return false;
}

public boolean isAtari(int jx,int jy){
int cx = (worldx+jx)/CHIP_W;
int cy = jy/CHIP_H;

if (getMapData(cx,cy)>0 && getMapData(cx,cy)<10)//10->9
return true;
//else if(getMapData(cx,cy) == ''){
else return false;
}

public boolean isAtariKoware(int jx,int jy){
int cx = (worldx+jx)/CHIP_W;
int cy = jy/CHIP_H;
ここらへんも書き替え↓↓
//if (getMapData(cx,cy) == 8)
// if (cy >=0 && cy < mapdata.length && getMapData(cx,cy) == 8)
if (getMapData(cx,cy) == 8)

return true;
else return false;
}
public void deleteKoware(int jx,int jy){
int cx = (worldx+jx)/CHIP_W;
int cy = jy/CHIP_H;

if (getMapData(cx,cy) == 8) {
char[] lst_char = mapdata[cy].toCharArray();
lst_char[cx] = '0';
mapdata[cy] = new String(lst_char);
}

}
public ArrayList getNewTeki(BufferedImage img){
ArrayList newtekis = new ArrayList();
int cx = worldx / CHIP_W;
if (worldx % CHIP_W>0) return newtekis;

for(int i=0; i int csnum=getMapData(cx+VIEW_W-1, i);
if(csnum>9) {
newtekis.add((Object)new Teki(YokoShootMain.GAMEN_W,
i*CHIP_H, img, csnum-10, tekipattern[csnum-10]));
}
}
return newtekis;
}

public void draw(Graphics g,ImageObserver io){
int cx = worldx / CHIP_W;
int shx = worldx % CHIP_W;

for(int i=0; i for(int j=0; j if (cx+j>mapnagasa-1) break;

int csnum = getMapData(cx+j, i);
if (csnum>0 && csnum<10){
g.drawImage(tikeiimage, j*CHIP_W-shx, i*CHIP_H,
j*CHIP_W-shx+CHIP_W, i*CHIP_H+CHIP_H,
csnum*CHIP_W, 0,
(csnum+1)*CHIP_W, CHIP_H, io);
}
}
}
if (worldx<(mapnagasa-VIEW_W)*CHIP_W) worldx = worldx+SCROLL_SPEED;
}

}

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・


アメリカ国家緊急事態警報システムのテスト

・・・・・・・・


北朝鮮がミサイルを発射する


North Korea launches a missile.


북한이 미사일을 발사한다
プッカニ ミサイルル パルサハダ


北朝鲜发射导弹
bei3 chao2 xian3 fa1 she4 dao3 dan4

ゲーム開発とは

game
私が作ったゲームまだやってないの!?

クリックしてゲームをやる←

javacode
ゲームの背景に奥行き感を出すために今回工夫したところ、↑↑普通に背景を動かすロジック

立体感と奥行きを出すためのロジック↓↓
↓↓今回、工夫したコード↓↓ 透過レイヤーを上に一枚重ねて雲を描画。
雲は背景の上を少し速く移動する、といういたって単純なロジックで奥行き感を実現。
これを何重にもしていくと、スゴイ軽いメモリーで簡単に奥行きのある背景が書けます。
javacode2

kazan
kazan
これから追加したい仕様

地面にいる敵。
上側が生きている状態
下が死に状態
火山です。

これから追加したい仕様
・ボスが死んだらゲームスレッドを一時止めてボスの崩壊と煙の描画
・ボスの崩壊が終わったら、ゲームクリアジングルを流す
・店
・ワープ
・壊れる壁
・バリアー(一度、実装したけど、不具合により撤去)
・地面にいる敵
・地面に撃つ弾

マイリスペクトたち

a
ゼビウス

egu
エグゼドエグゼス

tuinbi
ツインビー

gura
グラディウス

fantaji
ファンタジーゾーン

bi-
Bウィング 空港の名前みたい

・・・・・・・・

ゲームを作るのは
時に楽しく
時につらい

バグが出続けて、コードをどんなに書き替えても直らないときは、ヒステリーを起こしそうになる。
でも、テストプレイをしていて、あこがれていたファミコンゲームに少しでも近づけたときはウハウハする。

・・・・・・・・・・・・・・

ゲームプログラミング入門 第2版ゲームプログラミング入門 第2版
(2012/02/15)
鎌田 茂雄

商品詳細を見る

ゲーム作りで学ぶJavaプログラミング入門 Java7版 (SCC Books)ゲーム作りで学ぶJavaプログラミング入門 Java7版 (SCC Books)
(2012/03)
中島 省吾、工学研究社 他

商品詳細を見る


・・・・・・・・・・・・・

次のゲーム制作は夏の長期休暇になるでしょうね。
今回、バグが出てしまって上手く実装できなかった「壊れるブロック」の仕様を本格化して、夏の休暇には、「キングズナイト(スクウェア)」のようなゲームを作りたいです。

↑キングズナイト(ファミコン)

ゲームを作ってて楽しいのは、テストプレイももちろんだけど、地面のタイルのドット画を書いているときとか、テキストファイルにマップデータを打ち込んでるときとか、自分があれこれと考えて書いたプログラムコードが動いたときとか、
コツコツとした、地道が作業が何気なく楽しかったりします。
そして、何よりも嬉しいのは、プレイしてもらって感想をもらうことです。

・・・・・・・・・・


地道な作業


Steady work


착실한 작업
チャグシルハン チャゴプ


踏实的工作
ta4 shi2 de gong1 zuo4

ゲームをアップします。遊んでみてください!!

game
ゲームへのリンク← クリックしてゲームをやる

↓↓この画面が出て来たら、「実行」するをクリック
java

最初だけ時間がかかるかもしれません。
ゲームが始まらなくても1、2回リロード(更新)すると上手くいきます。
ゲームが始まらない場合、画面をクリックしてPボタンを押すと始まります。

ゲームをプレイした方はぜひ感想を聞かせてください。コメント欄に入れていただけると嬉しいです。

私、このサイトの管理人が作ったゲームです。
かなり時間がかかりましたが、BGMと効果音以外のプログラム部分と画像は全部自分で作りました。
今まで作ったゲームの中ではピカイチの出来だと思います。
ゲームとして楽しめる。
自分の中ではスーパートレックブラザーズは越えました。

ゲームプログラマになる前に覚えておきたい技術ゲームプログラマになる前に覚えておきたい技術
(2008/11/15)
平山 尚(株式会社セガ)

商品詳細を見る


・・・・・・・・・・・・・
・・・・・・・・・・・・・


自分史上最高


Personal history top highest


자신 역사상 최고
チャシン ヨクササン チュイゴ


自己历史上最高
zi4 ji3 li4 shi3 shang4 zui4 gao1

ファミコン並みの物ができつつある

game
今日は一日も出ないで家でプログラミングしていた。

画面を見れば分かるが雲をスクロールさせてみた、
雲はGIMPのエアブラシを使えばすぐ描ける。

さらに、バリアーを装備させたんだけど、
バリアーを一回装備するとずっと無敵という変な状態になってしまった。

本当に、ツ〇インビーみたいになってきてしまったな・・・

・・・・・・・・・・・
・・・・・・・・・・・

4年くらい前に、
御徒町の佐野元春さん激似のプログラマーさんに、
「ゼビウスが作りたいだって!ゼビウスをなめてますね!」
って一笑に付されたんだけど、
今、ゼビウスと同程度の物が出来つつあります。

いやあ、頑張った。

久しぶりにブログも書いてなかった。
朝、というか、夜中の2時からパソコンに向い始めて、かれこれ、今は15:52。
なんてこったい。

今日は四ヶ国語日記はお休み。

NOVAで10000万円ポッキリ留学始める/ゲームプログラムの進捗状況

game
継続してゲームプログラミング中!

ますます、ツ〇ンビーに似てきたのは気のせいだろうか。
鈴は出てきません。

いやあ、自分でテストプレイしていて、楽しくてハマっちゃうよ。

teki
ザコ敵です。
teki
こいつも。
なんか、敵に恐怖感を感じないのは?

e
原画。
e
私が子供だった頃の方がアイデアが豊富だったような気がするんだよなぁ。

・・・・・・・・・・・
・・・・・・・・・・・

仕事へのモチベーションが下がってるのかな。
いや、そんなことないと信じよう。
頑張って、論文も書かないと。

4月6日から毎週土曜日、NOVAに行くことにした。
10000円ポッキリ留学だ。
当面、英語をやっていくが、韓国語と中国語も織り交ぜていく。
夏の大研修が終わるまでは、あまり張り切り過ぎないでゆるーくいこう。

・・・・・・・・・・・

game
サクサクとすすむプログラミング。

chara
ドット絵を打つ。

start
タイトル画も作った。
ワザとらしい臭いサブテーマ、昭和かってーの。

・・・・・・・・・・・・・
・・・・・・・・・・・・・
・・・・・・・・・・・・・

NOW社 L-チロシン750mg【HBWサプリメント】

チロシンを飲み始めてから調子が良い。

モチベーションは高いと思う。
ゲーム作ったり、三ヵ国語を勉強したり、毎日10km走ったりと調子が良い。

アンドロペニス ゴールド【美容健康商品・コンタクトレンズ・家電専門店Bluelagoon】


今日も走ろうかと思ってたけど、辞めた。
モチベーションが高すぎて、ゲームを作るのをこの機会にやってしまおうと思う。
難しいことはモチベーションが高い時にまとめてやってしまうのが得策だ。

3時には職場に行くので、2時過ぎにはでる。
そのためには、1時半にはシャワーか・・・。

職場は今日はどうでもいいことをしにいくだけだから・・・

明日、明後日と休みなのがウレシイ。
しかも、土曜日はプログラミングの講師が体調が回復したので、勉強しにいく。


敵に恐怖感が無い


An enemy does not have an awful feeling.


적에게 공포감이 없다
チェゲゲ コンポガミ オプタ


敌人没有恐惧心理
di2 ren2 mei3 you3 kong3 ju4 xin1 li3

情報技術向上への道

chara1
chara2
chara3
新しく作っているシューティングゲームの敵キャラを描きました。

ファミコンらしい敵キャラを描きたかったんですが、

イマイチ、コツをつかむまで時間がかかりそうです。
まあ、描き続けるしかないのですが。

たくさん描いているうちに良い物が描けるようになるでしょう。

さらに、背景画像も描かなければなりません。
そして、アイテム。
最後に、一番後ろの背景。
今は、黒で塗りつぶしだったんですが、マップチップの背景の後ろでも絵の背景をスクロールさせることで、さらに立体感を出します。
スターフォースみたいな感じ。

・・・・・・・・・・・
・・・・・・・・・・・

ゲームのソースはほとんど出来ているので、あとは、画像の完成をもって、ゲームは出来上がります。
横スクロールシューティングゲーム。

このブログにはめ込んで遊べるようにしようかと思っています。

30日でできる! OS自作入門30日でできる! OS自作入門
(2006/03/01)
川合 秀実

商品詳細を見る

12ステップで作る組込みOS自作入門12ステップで作る組込みOS自作入門
(2010/05)
坂井 弘亮

商品詳細を見る

C言語によるリアルタイム組込みOS自作講座C言語によるリアルタイム組込みOS自作講座
(2012/03/07)
宇野 俊夫

商品詳細を見る

LINUXのカーネルのソースコードは500万行。

そう、どこかで読んだことがある。
一日100行読んでも、136年と。

・・・・つまり、一つ一つのファイルを読んでいても死ぬということですね。
基本概念というか、設計概念をまず、理解して。

話によると、スケジューラを読むのが全体理解の一番の近道なんだとか。
そうなのね。

・・・・・・・

自分も一度はOSをプログラムしてみたい。
そういう思いはある。

でも、まだ、OSどころか、PCも自作したことがないんですが・・・

・・・・・・・

いつかは、
いつかは、、、

・・・・・・
・・・・・・

ゲームの開発なんかをやっていて、
あらためて、コンピュータをいじっているのは面白いっていうのと、
さらに、
コンピュータの核心のところについてもっと知りたいと思うようになってきた。

・・・・・・
・・・・・・

PHPやPerlを使った人工無脳の作成は、
以前感じていたよりも、ずっと、簡単なんだと思うようになってきた。

チャットが作れれば人工無脳は作れる。

以前は、人工無脳なんて、頭の良い人じゃないと作れないとか、勝手に思っていたんだけど、手順を踏んでキチンと作っていけば、誰でも(ウソ)人工無脳は作れるですね。

・・・・・・

いや、認めても良いのではないか、
自分の情報技術がそれだけ向上したと、、、

「チャットを自分で作ったと」
と職場で以前話したら、

「私は掲示板を作ったことがあるよ」
と返された。

どうも聞いてみると、
FC2とかライブドアに登録して、掲示板を開設したということらしい。

つまり、素人には、Perlとかで掲示板を作るという概念がないから、
私が、「作った」という意味が分からなかったらしい。

さっき、誰でもといったのは、チャットを作れれば誰でもといった方がいいですね。

・・・・・・

今作っているゲーム(シューティング)を仕上げたら、
以前作った、スーパートレックブラザーズの仕様を拡張して、本格的なファミコンゲームにしていこう。

例えば、
下からパンチしたらブロックが壊れるとか、
ブロックが持ち上がるとか、
ハシゴ(豆の木)があるとか、リフトがあるとか、
ファイヤーで攻撃するとか、

思うんだけど、
初代ファミコンのアクションゲームのオリジナリティって、スーパーマリオに集約されてるんじゃないかなって思う。
違うかな。

アトランティスの謎、スペランカー、迷宮組曲、冒険島、グーニーズ、、、、
どれも、スーパーマリオが作れれば、同じアルゴリズムで作れる。

mixi
ミクシィの株価。

オワコンぶりが顕著。
今後、値上がりするんだろうか。

この株買った人は損しかしなかったんでしょうね。
2007年に高騰してから、あとは下り坂。

ああ、ミクシィのコミュニティ好きだったんだけどなぁ。
オワコンになってから、誰も来ないし。

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・

来週、日曜日、恵比寿に行きます。
とある異性に食事のお誘いをしたら、OKもらいました。
ああ、リアル人生を充実させたいなぁ。

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・

韓国語 学習日記

박근혜 대통령 당선인이 청와대 대변인에 윤창중 대통령직 인수위원회 대변인과 김행 위키트리 부회장을 각각 내정했습니다.

excite翻訳

パク・クネ大統領当選者が大統領府報道官に輪唱中大統領職引継ぎ委員会スポークスマンとキム・ヘン ウィキトゥリ副会長をそれぞれ内定しました。

박근혜パククネ 대통령大統領 당선인이当選者が 청와대大統領府 대변인에報道官に 윤창중ユンチャンジュン 대통령직大統領職 인수引き継ぎ 위원회委員会 대변인과スポークスマンと 김행キムヘン 위키트리ウィキトリ 부회장을副会長を 각각それぞれ 내정했습니다. 内定しました。

・・・・・・・・・・・


終了コンテンツ


End contents


종료 컨텐츠
チュンリョ コンテンチュ


結束內容
jie2 shu4 nei4 rong2

現在までの仕様でゲームをUPしました プレイしてみてください/架空請求メール晒します/チロシンでモチベーション↑↑

game

動くゲームをアップロードしました。
遊べます。
是非、遊んでみてください。ブラウザで動きます。上下左右のキーで移動、SHIFTキーで弾発射です。

ゲームで遊ぶ ← ← ゲームで遊ぶをクリックするとゲーム画面になります。
ゲームが始まらない場合は画面をクリックしてPボタンを何度か押してください。
java
このポップアップが出たら、リスクを受け入れて~~ のところをチェックして「実行」で動きます。

jiki
自分で描いたキャラ画です。
今回はこれが動きます。
魚のような、飛行機のようなキャラ(適当)が主人公です。

jiki1
GIMPというソフトで自分で描画します。
拡大するとドットになっています。
ドット単位で描画することも可能です。

・・・・・・・・

一応、今回作ったゲームは暫定版(ベータ版)で、今後、アイテムを取った後の弾や自機のパワーアップ、ボスの改良、オプション、バリヤーなどを考えていきます。
ここをこうしたらいい、など、コメントを頂けると助かります。

・・・・・・・・
・・・・・・・・

中国語学習 進捗状況

今すぐ話せる中国語単語集 (東進ブックス)今すぐ話せる中国語単語集 (東進ブックス)
(2001/10)
小倉 憲二

商品詳細を見る


この本を何度も聞いて、読んで、音読して、基礎を固めて、中検準4級、4級に合格した。

中国語会話ルート66―コミュニケーション上達への近道中国語会話ルート66―コミュニケーション上達への近道
(2001/10)
竹島 毅、徐 迎新 他

商品詳細を見る


こいつも何周も読みなおして、対策本も何冊もやって中検3級に合格した、もはや初級者ではなくなったわけだ。

cctvdenyu-suwokiku

そして、かなり難易度の高い、このニュースの中国語テキストを何度も読み直して、なんども音読している。(現在)

chongo-ji-shan
以前から頑張って中国之声という現地のラジオをインターネットで聴いているんだけど、このニューステキストを何度も音読するようになってから、チンプンカンプンだった現地ラジオが、チンプンカンぐらいまでになった。

中国之声

↑↑のニューステキスト並みの難易度のテキストをあと4~5冊完全読破&繰り返し音読をすれば、現地ラジオは理解できるようになると思う。

そうすれば、中国語検定2級に手が届く。

・・・・・・・・・
・・・・・・・・・

架空請求メールが来たので晒します。

From: cruise-03@docomo.ne.jp

(株)クルーズジャパン
【TLE】03-6362-0491
【担当】堀口(ほりぐち)

突然のご連絡失礼致します。
弊社はサイト運営会社様より、利用規約違反に至ったお客様のデータベースの抹消、退会手続き並びにそれに伴う身辺調査の依頼を受託し、この通達を発行致しております。

現在、お客様のご使用の携帯端末より以前ご登録頂いた【総合モバイルコンテンツ】への月額料金において無料期間中に退会処理がとられていない為、登録状態のまま登録料金の長期滞納が続いております。


各コンテンツ内容《着メロ・着うた・画像・動画・ニュース・お小遣い懸賞・占い・天気・ショッピング・18禁アダルト・出会い系サイト等》

本日中にご連絡を頂けない場合には、サイト運営会社様のご利用規約及び民法に基づき①個人調査の開始
②各信用情報機関に対して個人信用情報(ブラックリスト)の登録
③法的書類を準備作成の上、即刻法的手続き(強制執行)の開始、以上の手続きに入らさせて頂きます。

調査終了後、後日回収機関により、調査費、回収費用、裁判費用含めご自宅、お勤め先、第三者様への満額請求と変わる場合もございますので詳細の確認、退会処理等のご相談は本日中までにお問い合わせ下さい。

(株)クルーズジャパン
【TEL】03-6362-0491
【担当】堀口(ほりぐち)
【営業時間】8:00~20:00【定休日】日曜・祝日

※メールでのお問い合わせには対応致しかねますので、必ずお電話にてお問い合わせ下さい。

尚、本通知は最終通告となります。
ご連絡なき場合明日の正午より上記の法的手続き開始となりますのでご了承下さい。


最終通告早っ!!


・・・・・・・・・
・・・・・・・・・

今日は、週末残業。そして、その前後どちらかにカラオケBOXに行って自己流ヴォイトレを行おうと思っている。

KBSの韓国語ラジオドラマKBSの韓国語ラジオドラマ
(2008/10)
KBS韓民族放送チーム

商品詳細を見る

毎朝バスの中で読んでいたこの本をついに読破した。

韓国のラジオドラマ「ポラムの家」のスクリプトだ。

こんな内容です。
보엄:그러니까 남자는 좀 멀찍이 내버려 두라고 얘기죠, 어머니?
보할:그럼! 여자는 자세히 들여다 봐 줘야 하고, 남자는 좀 내버려둬야 한다는 뜻이지.

和訳
ポ母:だから男は少し離れて放っておけという話ですね。お義母さん?
ポ祖母:そのとおり!女は詳しくのぞき見てあげないといけないし、男は少しほったらかしておかなければならないという意味ね。

・・・・・・・・・・・
・・・・・・・・・・・

NOW社 L-チロシン750mg【HBWサプリメント】

チロシンは良い。

モチベーションがこれまでになく上がっている。
こんなイケイケになっている自分は久しぶり、
去年の今頃の自分が見たらどう思うだろうか。
チロシンに助けられているとしか思えない。

・・・・・・・

やりたいと思っていたことが着実に、一歩一歩実現しつつある。

ファミコンみたいなゲームをプログラムしたい ⇒ ほぼ実現途上
賢い人工無脳を作りたい ⇒ 近いうち実現しそう
英語、中国語、韓国語を話したい ⇒ 中、韓はまだまだだが、道は見えてきた
演劇に参加したい ⇒ 不可能なことではないと思う、声や演技を鍛えれば道は見える
ピアノの上達 ⇒ これはストップしてしまっているので、課題
洋裁で服の自作 ⇒ これもこれからの課題
ボーカルの上達 ⇒ 来週、ヴォイストレーニングのスクールの無料体験に行く予定

ピアノと洋裁は、外国語とプログラミングがある程度進んでやることが少なくなったら、取りかかることもできる。

・・・・・・・・・・・
・・・・・・・・・・・
・・・・・・・・・・・


洋裁で服を自作


Dress is made on one's own by dressmaking.


양재로 옷을 자작
ヤンジェロ オスル チャジャク


用西式裁剪自制衣服
yong4 xi1 shi4 cai2 jian3 zi4 zhi4 yi1 fu2

シューティングゲーム完成!! やってみて!!!

game
ゲームで遊ぶ ← ← ゲームで遊ぶ場合は、左の文字をクリック

弾は、SHIFTキーではなく、SPACEキー(スペース)で出ます。
上下左右に動かせます(カーソルキー)
緑色のタイルを取るとエネルギーが増えます。(最大10まで)
エネルギーが0になると死にます。
(修正・・・プログラムミスで、エネルギー量にかかわらず、一回で死にます。明日修正します。)

リスクを受け入れて、このアプリケーションを実行をチェックして、実行ボタンを押します。↓↓
java
Javaのセキュリティがきつくなったらしいです。
特に、アプレットでセキュリティホールが見つかってからは、
面倒ですが、わざわざ、このポップアップをクリックしてからやってください。

プレイした感想など、コメントでいただけると励まされます。

・・・・・・・・・
・・・・・・・・・

数々のコンパイルエラーから立ち直って、なんとかゲームを上げることができました。
ここまで来たら、ファミコン的なゲームはおそらく可能かと!!
やったぜ!


エラーが出る


An error comes out.


에러가 나온다
エロガ ナオダ


错误出来
cuo4 wu4 chu1 lai2
ゲームプログラミングゲームプログラミング
(1998/08)
不明

商品詳細を見る

アプレットの不具合

game
昨日作ったゲームを朝からネットに上げようとしていたんだが、アプレットの不具合で上げることができなかった。
恐らく、コンパイルエラーがあったのだろうと思う。

power
自作画像。

これがパワーになります。
仕様としては、敵に当たるとパワーが減り、この、↑↑緑色のパワータイルを取るとパワーが回復します。
そういう設定です。

それにしても、毎回毎回、コンパイルしてサクラネットにアップするたびにエラーがでるのには嫌気がさす。

・・・・・・・・・・
・・・・・・・・・・
・・・・・・・・・・

それにしても、ファミコン的なゲームはそろそろ出来つつあるのはうれしい。

今後、作りたいゲームのイメージ。

魔界村、ファンタジーゾーン、ゼルダの伝説、ハットリくん、チャレンジャー、ロードランナー、ツインビー、ゼビウス、スターソルジャー

ファンタジーゾーンはどうしても作りたいゲームのイメージとしては強い。


画像を描くのは得意だが、クオリティの高いBGMを自作するのが苦手。
ファミコンは、あの、独特のBGM感がよかったわけじゃないですか。

あのピコピコ感がどうしても欲しい。
まず、作曲経験が無いし。

誰か教えてくれないかな。

また独学か。
時間がかかりそう。

でも、プログラム、画像、音声すべて自作で自作ゲームっていうのかなぁ。。

・・・・・・・・・・・・

ゲーム音楽の作り方 現役クリエイターが明かすゲーム・サウンド制作の掟(CD付き)ゲーム音楽の作り方 現役クリエイターが明かすゲーム・サウンド制作の掟(CD付き)
(2008/08/27)
polymoog

商品詳細を見る


↑↑買って、まずは作曲理論について勉強するか。

勉強すること、多過ぎ。
ってか、自分で招いているんだけど。


作曲理論


Composition theory


작곡 이론
チャグコク イロン


作曲理论
zuo4 qu3 li3 lun4

新しく作ったゲームをアップします/今日は自分を鍛える日

game
ゲームで遊ぶ← ← クリックすれば遊べます

弾はSHIFTキーではなく、スペースキーで打てます。
画面が反応しない場合は、ゲーム画面をクリックしてみてください。
java
この画面が出たら↑↑「実行」を押します。

trek
こいつはアイテムです。
取ると、弾の出方が変わります。

今のところ、ここまでですが、近いうちどんどん改良していきます。
もしゲームをやってみて感想なんかがあったら、このブログのコメント欄に書いていただけるとうれしいです。

~ 改造のポイント ~

・弾の出方のパターンを増やす(現在3パターン)
・アイテムの画像、その他画像の改良
・ボスが弱すぎるので強くする
・自機が1機しかないので、多くする。また、1UPアイテムを作る
・バリアーやビットなども作る
・背景の種類を多くする
・敵やアイテムの種類を多くする

・・・・・・・・・・・
・・・・・・・・・・・
・・・・・・・・・・・

本格的に勉強をする前は、ゲームプログラミングなんて難解すぎて分からない、そう思ったものでした。
まるで、大学レベルの高度な数学の式でもみているようで、吐き気すらした。

人工無脳もそうだ。
なんだ、こりゃとチンプンカンプンだったものだ。

しかし、まあ。人というのは成長するもので。
今では、
「この }(中かっことじ)はここじゃないよなぁ、」
とか、
「ここにbreak文がないといけないよなぁ。」
とか、
自分でプログラム文を批判的に見ながら書くことができるようになりました。

・・・・・・・・・・・
・・・・・・・・・・・

今の講師も良い人なんで、今後も末永く付き合っていきたいと思ってます。
今後、私がまったくの素人である分野のPHPや、データベースのSQLITE(簡易版SQL)についても勉強していきます。

う~~む、、、
自分の情報処理能力がいやましに高まっていくのが分かる。
がんばってやっていこう。

・・・・・・・・・・・
・・・・・・・・・・・

まあ、人間は勉強した分だけ身に着くってのは、本当ですね。
集中してたくさん覚え、
そして、
忘れないように時々刺激を与える。
脳細胞は刺激を受け続ければ、シナプスのコネクトを続ける。

今日は、休み。
仕事にも行かない。

完璧にマイタイム。
自分の時間。

だから、自分を鍛える時間にします。

ジョギング、中国語、英語、韓国語、ピアノ・・・

アンドロペニス ゴールド【美容健康商品・コンタクトレンズ・家電専門店Bluelagoon】


祖母が死んだことを時々思い出して気分が塞ぐが、
それでも、気持ちの整理が着きつつある。
dote
幼いころ、近所の川の土手を散歩した思い出、
山下公園に一緒に行った思い出、
そういった、思い出を自分の中で整理しています。

・・・・・・

もう大丈夫、自分の心は整理できている。
明日に向って歩いて行こう。

・・・・・・・・・・・・
・・・・・・・・・・・・

cctvdenyu-suwokiku
この本を何度も音読しています。↑↑

その効果はあるようで、ラジオの「中国之声(チョングォヂーション)」を聞いていても、聞きとれる言葉が割合に増えた。

こんな感じのテキストを何冊も読破、音読していれば、いつか、中国之声を普通に聞けるだろう。
その頃には、中国語検定は2級は楽勝で受かるだろう。

がんばっていこう。

・・・・・・・・・・


楽勝だ


It is an easy victory.


가볍게 이기다
カビョプゲ イギダ


轻松取胜
qing1 song1 qu3 sheng4

Javaゲームのソースです。/レイカーツワイル、GOOGLEに殴りこみ?

arigata

Javaアプレットのゲームのソースです。

ソースの行数が長いので難解そうですが、ゲームのソースとしては必要最低限のことしか書いていません。
結局、色々なゲームを作ってきて思うのが、どんな難しいゲームもこういった単純なゲームの拡張でしかないのだと思うようになってきました。

まあ、3Dゲームとかとなってくると話しは別ですが。(行列の理解が必要になる)

下のソースはそのままコピペで動きます。
コンパイラにかけて、それから、音声ファイルと画像ファイル(キャラクター・・・36ピクセルぐらい)は自分で用意すれば動きます。

以下ソース

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

//キャラクタクラス

abstract class Chr {
protected static Game1229 app;//アプレット
protected Image img;//画像
protected int x, y;//座標
protected int w, h;//幅・高さ
private boolean dead;//死亡フラグ
//コンストラクタ
//引数 img:キャラクタ画像のImageオブジェクト
protected Chr(Image img) {
//画像設定
this.img = img;
//画像の幅 高さを習得
w = img.getWidth(app);
h = img.getHeight(app);
//死亡フラグクリア
dead = false;
}
//死亡チェック
boolean isDead() {return dead;}
//死亡する
void dead() {dead = true;}

//移動
abstract void move();

//当たり判定
//引数 t:判定キャラクター
//戻り値 当たり:true 外れ:false
boolean checkHit(Chr t) {
if (x > t.x - w && x < t.x + t.w && y > t.y - h && y < t.y + t.h) {
return true;
}
return false;
}
//描画
void draw(Graphics g) {
g.drawImage(img, x, y, app);
}
}

class Jiki extends Chr {
private int tamaIntCount;//弾と弾の発射間隔
private int power;//パワー
private int muteki;//無敵時間
//弾の速度配列
private static int tv[][] = {
{0, -8},
{-1, -1, 1, -1},
{-7, -7, 0, -8, 7, -7},
{-7, -7, 0, -8, 7, -7, -7, 7, 7, 7},
};

//コンストラクタ
Jiki() {
super(app.imgJiki);
//発射間隔をクリア
tamaIntCount = 0;
//パワー初期化
power = 0;
muteki = 0;
//初期座標を設定する
x = (app.getw() - w) / 2;
y = app.geth() - h - 16;
}
//移動
void move() {
//左移動
if (Key.left) {
x -= 4;
if (x < 0) x = 0;
}
//右移動
if (Key.right) {
x += 4;
if (x > app.getw() - w) x = app.getw() - w;
}
//上移動
if (Key.up) {
y -= 4;
if (y < 0) y = 0;
}
//下移動
if (Key.down) {
y += 4;
if (y > app.geth() - h) y = app.geth() - h;
}
//弾発射
if (tamaIntCount > 0) tamaIntCount--;
if (Key.space) {
if (tamaIntCount <= 0) {
for (int i = 0; i < tv[power].length; i += 2){
app.addList(new Tama(x + w / 2, y, tv[power][i], tv[power][i + 1]));
}
app.sndShot.play();
tamaIntCount = 7;
}
}
//無敵中なら無敵時間を減らす
if (muteki > 0) muteki--;
}
//当たり判定
//敵とアイテムに当たり判定を行う
boolean checkHit(Chr t) {
if (t instanceof Teki && muteki == 0){
if (super.checkHit(t)) {
//敵と当たったら爆発、死亡、ゲームオーバー画面に移る
power--;
app.sndBang.play();
t.dead();
muteki = 100;
if (power < 0) {
dead();
app.goOver();
}
return true;
}
}else if (t instanceof Item) {
if (super.checkHit(t)) {
//アイテムに当たったらパワーアップ
upPower();
t.dead();
return true;
}
}
return false;
}
//パワーアップ
void upPower() {
if (power >= tv.length - 1) {
//最大パワーまで達していたらボーナス追加
app.addScore(1000);
}else{
power++;
}
}
}
//アイテムクラス
class Item extends Chr {
//コンストラクタ
Item() {
super(app.imgItem);
//初期座標を設定する
//初期座標を設定する
x = (int)(Math.random() * (app.getw() - w));
y = -h;
}
//移動
void move() {
y += 4;
if (y > app.geth()) dead();
}
//当たり判定
//誰とも行わない
boolean checkHit(Chr t) {return false;}
}
//敵基本クラス
class Teki extends Chr {
//コンストラクタ
Teki(Image img) {
super(img);
}
//移動
void move() {
//画面外に出たら死亡
if (x < -w) dead();
else if (x > app.getw()) dead();
else if (y > app.geth()) dead();
}
//当たり判定
//弾にのみ当たり判定を行う
boolean checkHit(Chr t) {
if (t instanceof Tama) {
if (super.checkHit(t)) {
//弾と当たったら爆発、スコア追加、自分の弾死亡
app.sndBang.play();
app.addScore(100);
dead();
t.dead();
return true;
}
}
return false;
}
}
//ザコAクラスまっすぐ突っ込んでくる
class ZakoA extends Teki {
//コンストラクタ
ZakoA () {
super(app.imgZakoA);
//初期座標を設定する
x = (int)(Math.random() * (app.getw() - w));
y = -h;
}
//移動
void move() {
y += 8;
super.move();
}
}
//ザコBクラスななめに反射しながら動く
class ZakoB extends Teki {
private int vx;//横方向の速度
//コンストラクタ
ZakoB() {
super(app.imgZakoB);
//初期座標を設定する
x = (int)(Math.random() * (app.getw() - w));
y = -h;
//画面左から登場したら右、画面右から登場したら左に動く
if (x < (app.getw() - w) / 2) vx = 8;
else vx = -8;
}
//移動
void move() {
y += 4;
x += vx;
if (x < 0) vx = 8;
else if (x > app.getw() - w) vx = -8;
super.move();
}
}
//ザコCクラス自機を追尾する
class ZakoC extends Teki {
private double vx, vy;//速度
private double tv;//追尾速度
//コンストラクタ
ZakoC() {
super(app.imgZakoC);
//初期座標を設定する
x = (int)(Math.random() * (app.getw() - w));
y = -h;
vx = vy = 0;
tv = 0.2;
}
// 移動
void move() {
if (app.getJikix() > x) {
vx += tv;
if (vx > 8) vx = 8;
} else if (app.getJikix() < x) {
vx -= tv;
if (vx < -8) vx = -8;
}
if (app.getJikiy() > y) {
vy += tv;
if (vy > 8) vy = 8;
} else if (app.getJikiy() < y) {
vy -= tv;
if (vy < -8) vy = -8;
}
x += (int)vx;
y += (int)vy;
}
}


//ボスクラス
class Boss extends Teki {
private int vx, vy;//速度
private int power;//耐久力
//コンストラクタ
Boss() {
super(app.imgBoss);
//初期座標を設定する
x = (int)(Math.random() * (app.getw() - w));
y = -h;
//画面左から登場したら右、画面右から登場したら左に動く
if (x < (app.getw() - w) / 2) vx = 8;
else vx = -4;
vy = 4;
power = 30;
}
//移動
void move() {
x += vx;
y += vy;
if (x < 0) vx = 4;
else if (x > app.getw() - w) vx = -4;
if (y < 0) vy = 4;
else if (y > app.geth() - h) vy = -4;
super.move();
}
//死亡
void dead() {
power--;
if (power < 0) super.dead();
}
}
//弾クラス
class Tama extends Chr {
private int vx, vy;//速度
//コンストラクタ
//引数 xy座標(弾の中心を指定)vxvy速度
Tama(int x, int y, int vx, int vy) {
super(app.imgTama);
this.x = x - w / 2;
this.y = y - h /2;
this.vx = vx;
this.vy = vy;
}
//移動
void move() {
x += vx; y += vy;
//画面外に出たら死亡
if (x < -w || x > app.getw() || y < -h || y > app.geth()) dead();
}
//当たり判定
//誰とも行わない
boolean checkHit(Chr t) {return false;}
}
//キー入力クラス
class Key extends KeyAdapter {
static boolean left, right, up, down, space, enter;
//キーが押されたときの処理
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT: left = true; break;
case KeyEvent.VK_RIGHT: right = true; break;
case KeyEvent.VK_UP: up = true; break;
case KeyEvent.VK_DOWN: down = true; break;
case KeyEvent.VK_SPACE: space = true; break;
case KeyEvent.VK_ENTER: enter = true; break;
}
}
//キーが離されたときの処理
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT: left = false; break;
case KeyEvent.VK_RIGHT: right = false; break;
case KeyEvent.VK_UP: up = false; break;
case KeyEvent.VK_DOWN: down = false; break;
case KeyEvent.VK_SPACE: space = false; break;
case KeyEvent.VK_ENTER: enter = false; break;
}
}
}
//メイン
public class Game1229 extends Applet implements Runnable {
private Vector clist, clistTmp;//キャラクタリスト・仮キャラ
private volatile Thread gameThread;//ゲームスレッド
private Image offImage;//仮想画面
private Graphics gv;//仮想画面グラフィックオブジェクト
private final int SCENE_INIT = 0;//シーン初期化
private final int SCENE_TITLE = 1;//シーンタイトル
private final int SCENE_MAIN = 2;//シーンメイン
private final int SCENE_OVER = 3;//シーンゲームオーバー
private int scene;//シーン
private int score;//得点
private Font scoreFont;//得点用フォント
private int width, height;//アプレットの幅高さ
private MediaTracker mt;//画像読み込み用メディアトラッカー
private int tekiInterval;//敵出現間隔
private int tekiIntCount;//敵出現間隔カウンター
private int itemIntCount;//アイテム出現カウンター
private Jiki jiki;//自機オブジェクト
Image imgJiki, imgItem, imgTama;//
Image imgZakoA, imgZakoB, imgZakoC;//
Image imgBoss;//
AudioClip sndShot, sndBang;//音声
//初期化
public void init() {
width = getSize().width;
height = getSize().height;
scene = SCENE_INIT;
//得点用フォント生成
scoreFont = new Font("Arial", Font.BOLD, 12);
//背景色を黒色に設定
setBackground(Color.blue);
//前景色を白色に設定
setForeground(Color.white);
//仮想画面の生成
offImage = createImage(width, height);
gv = offImage.getGraphics();
//キー受付オブジェクト生成
addKeyListener(new Key());
//Chrクラスにアプレットを渡す
Chr.app = this;
//メディアトラッカー生成
mt = new MediaTracker(this);
//キャラクタリスト・仮キャラクタリスト生成
clist = new Vector();
clistTmp = new Vector();
//画像読み込み・メディアトラッカーに登録
imgJiki = getImage(getDocumentBase(), "jiki.gif" );
mt.addImage(imgJiki, 0);
imgItem = getImage(getDocumentBase(), "item.gif" );
mt.addImage(imgItem, 0);
imgZakoA = getImage(getDocumentBase(), "zakoa.gif"); // ザコA
mt.addImage(imgZakoA, 0);
imgZakoB = getImage(getDocumentBase(), "zakob.gif"); // ザコB
mt.addImage(imgZakoB, 0);
imgZakoC = getImage(getDocumentBase(), "zakoc.gif"); // ザコC
mt.addImage(imgZakoC, 0);
imgBoss = getImage(getDocumentBase(), "boss.gif"); // ボス
mt.addImage(imgBoss, 0);
imgTama = getImage(getDocumentBase(), "tama.gif"); // 弾
mt.addImage(imgTama, 0);
//サウンドの読み込み
//8000Hz,mono,8bit,μ-lawのSUN形式(.AU)
sndShot = getAudioClip(getDocumentBase(), "shot.au");
sndBang = getAudioClip(getDocumentBase(), "bang.au");
requestFocus();
}
//ゲームスレッドの開始
public void start() {
if(gameThread == null) {
gameThread = new Thread(this);
gameThread.start();
}
}
//ゲームスレッドの停止
public void stop() {
gameThread = null;
}
//ゲームスレッドのメイン
public void run() {
while(gameThread == Thread.currentThread()) {
//裏画面の消去
gv.clearRect(0, 0, width, height);
//各シーン処理
switch(scene){
case SCENE_INIT: gameInit(); break;
case SCENE_TITLE: gameTitle(); break;
case SCENE_MAIN: gameMain(); break;
case SCENE_OVER: gameOver(); break;
}
//再描画
repaint();
//20ミリ秒待つ
try{
Thread.sleep(20);
}catch (InterruptedException e) {
break;
}
}
}
//ゲーム初期化処理
private void gameInit(){
//画面描画
drawCenter("Loading...", 180);
//画像が完全に読み込まれるまで待つ
if (mt.statusAll(true) == MediaTracker.COMPLETE) {
//準備処理
ready();
//タイトル画面へ移行
scene = SCENE_TITLE;
}
}
//準備処理・・・ゲームが開始するたびに呼ばれる
private void ready(){
//得点クリア
score = 0;
//出現間隔を初期値に
tekiInterval = 50;
tekiIntCount = 0;
//キャラクタリストクリア
clist.setSize(0);
//テンポラリキャラクタリストクリア
clistTmp.setSize(0);
//自機オブジェクト追加
jiki = new Jiki();
addList(jiki);
}
//ゲームタイトル処理
private void gameTitle(){
//エンターキーが押されると
if(Key.enter){
//ガーベジコレクション依頼
System.gc();
//ゲームメインへ移行
scene = SCENE_MAIN;
}
//タイトル画面描画
gv.setFont(new Font("Arial", Font.BOLD, 28));
drawCenter("ARIGATA-MEIWAKU", 180);
gv.setFont(new Font("Arial", Font.PLAIN, 20));
drawCenter("Press the ENTER key", 350);
}
//ゲームメイン処理
private void gameMain(){
int i, j;
Chr c, c2;
//移動
for(i = 0; i < clist.size(); i++) {
c = (Chr)(clist.elementAt(i));
c.move();
}
//描画
for(i = 0; i < clist.size(); i++) {
c = (Chr)(clist.elementAt(i));
c.draw(gv);
}
//当たり判定
for (i = 0; i < clist.size(); i++) {
c = (Chr)(clist.elementAt(i));
for(j = 0; j < clist.size(); j++) {
c2 = (Chr)(clist.elementAt(j));
c.checkHit(c2);
}
}
//死亡チェック
i = 0;
while(i < clist.size()){
c = (Chr)(clist.elementAt(i));
//死亡していたらリストから削除
if (c.isDead()) clist.removeElementAt(i);
else i++;
}
//敵出現
tekiIntCount--;
if(tekiIntCount <= 0){
int kind = (int)(Math.random() * 3);
if(kind == 0) addList(new ZakoA());
if(kind == 1) addList(new ZakoB());
if(kind == 2) addList(new ZakoC());
if((int)(Math.random() * 50) == 0) addList(new Boss());
tekiInterval--;
if(tekiInterval < 1)tekiInterval = 20;
tekiIntCount = tekiInterval;
}
//アイテム出現
itemIntCount++;
if(itemIntCount > 300) {
addList(new Item());
itemIntCount = 0;
}
//キャラクタリストにテンポラリキャラクタを追加
for(i = 0; i < clistTmp.size(); i++){
clist.addElement(clistTmp.elementAt(i));
}
clistTmp.setSize(0);

gv.setFont(scoreFont);
gv.drawString("SCORE : " + String.valueOf(score), 10, 20);
}
//ゲームオーバー処理
private void gameOver(){
//エンターキーが押されたら
if(Key.enter){
//ゲーム準備処理
ready();
//タイトル画面へ移行
scene = SCENE_TITLE;
}
//ゲームオーバー画面描画
gv.setFont(new Font("Arial", Font.BOLD, 28));
drawCenter("GAMEOVER", 180);
gv.setFont(new Font("Arial", Font.PLAIN, 20));
drawCenter("SCORE : " + String.valueOf(score), 350 );
}
//アプレットの幅高さを得る
int getw(){return width;}
int geth(){return height;}
//自機の座標を取得
int getJikix(){return jiki.x;}
int getJikiy(){return jiki.y;}
//文字列を中央ぞろえで表示
//引数str文字列y:y座標
private void drawCenter(String str, int y){
FontMetrics fm = getFontMetrics(gv.getFont());
gv.drawString(str, (width - fm.stringWidth(str)) / 2, y);
}
//テンポラリキャラクタリストにキャラクタを追加する
void addList(Chr c){clistTmp.addElement(c);}
//ゲームオーバーに移行
void goOver(){scene = SCENE_OVER;}
//スコア追加
void addScore(int s){score += s;}
//描画
public void paint(Graphics g){
//裏画面から表画面へ転送
g.drawImage(offImage, 0, 0, this);
}
//更新
public void update(Graphics g){
paint(g);
}
}

・・・・・・・・・・・・
・・・・・・・・・・・・


レイカーツワイル氏がGOOGLEのエンジニアリング部長に就任。

言語の階層的理解と、より直観的な人間との会話を可能にするAI技術の開発に携わる予定。今後その技術は、現在のGOOGLEサーチエンジンに搭載されるだろうと個人的に言及。

以下引用

Regarding the specific kind of artificial intelligence that a Kurzweil-led project will aim to do, he said, “It will know at a semantically deep level what you’re interested in, not just the topic…[but] the specific questions and concerns you have.” He added, “I envision some years from now that the majority of search queries will be answered without you actually asking. It’ll just know this is something that you’re going to want to see.” While it may be take some years to develop this technology, Kurzweil added that he personally thinks it will be embedded into what Google offers currently, rather than as a stand-alone product necessarily.

Now if you’ve been following Singularity Hub’s coverage of personal assistants like Siri, Evi, and the latest, Maluuba, as well as Google Voice Search, then you know that natural language recognition is one of the highest priorities for tech companies today. That’s exciting because it means that holding sophisticated conversations with computers — in much the same way that Dave Bowman does with HAL 9000 in the movie 2001 – is going to become a reality very soon.

As Kurzweil points out, the hurdle currently is that language is hierarchical, and the human brain processes language in a hierarchical way, depending on what stimuli it receives during key stages of development. Computers like IBM’s Watson are just now being programmed to process human information in a related way. Inevitably, the sophistication of this software will grow — slowly, at first, but in all likelihood become exponential, as with many other technological trends that Kurzweil himself has identified.

Though the video is only 10 minutes, it’s great to hear Ray download some more tidbits about what he’ll be doing once he enters Google’s doors. Odds are that when he reemerges, the ability of our computers to understand us is going to take a quantum leap.

引用元:http://singularityhub.com/2013/01/10/exclusive-interview-with-ray-kurzweil-on-future-ai-project-at-google/

・・・・・・・・・・・
・・・・・・・・・・・

人工知能の予言をするレイカーツワイル氏が、実際に人工知能を作っているGOOGLEにリクルートするというのが面白いです。

・・・・・・・・・・・
・・・・・・・・・・・

text
まあ、初めてですよ。
確かに、落ち着いてます。そう育てましたから。
でも、しっとりというのは初めての表現です。

うれしいものです。
静か、とか、まじめ、っていうと、逆を捉えると、抑圧されていて子供らしくないともとらえられますが、「しっとり」としているっていうのは、なんか「感性が育てられて、聴く耳を持っている、伸びようと幼いながらひたむきである」という印象を受けます。

・・・・・・・・・・・
・・・・・・・・・・・


感性が育つ


Sensitivity grows up.


감성이 자란다
カムサンイ チャラダ


感性成长
gan3 xing4 cheng2 zhang3

ゲームプログラミングの勉強 ゲームやってみてください。

startgamen

ゲームで遊ぶ← ← クリックするとゲームが始まります。

java
こんな画面が出て来たら「実行」を押してください。↑↑
なんか、Javaアプレットは今こういうのが出るらしいです。

STYLE="zoom:66%" width="66%" height="400"とかやって、アプレットをこのブログ内に縮小表示しようとしたんだが、失敗。
とりあえず、別画面で遊んでみてください。

それから、Javaっていうのは、ランタイムがあって(Javaをブラウザで動かすためのソフト)、たいていのPCにはインストールされているんだけど、バージョンが古いとこのゲームは動かないので、ランタイムのバージョン6以上をインストールしてください。(Javaのサイトで無料でインストールできる)
Javaのサイト


↑↑上のゲームが作れたら、FCのバルーンファイトぐらいだったら作れそうな気がする。
バルーンファイトの場合は、風船を作って、画面を強制横スクロールすればいいだけ。
なんだか、ゲームプログラミングが楽しくなってきました。

ところで、FCのバルーンファイトとレッキングクルーってBGMが似てる希ガス。

game
↑↑上のゲームのプレイ画面(是非、やってみてください)

アプレットの脆弱性

なんか、最近、アプレットでとんでもないセキュリティホールがあったみたいですね。
java

以下引用

【概要】

Oracle Java SE、Java for BusinessのアプレットApplet2ClassLoaderに脆弱性(CVE-2010-4452)が存在することが発見されました。
この脆弱性により、細工されたWebページの閲覧などで、ローカルユーザと同じ権限が奪取される危険性があります。
想定される被害としては、ローカルユーザ権限での情報取得、改ざん、または、ワームやスパイウェアなどの悪意あるプログラムをシステム内にインストールされることが考えられます。

今回、Oracle Java SE、Java for Businessの脆弱性(CVE-2010-4452)の再現性について検証を行いました。

Oracle Java SE、Java for BusinessのアプレットApplet2ClassLoaderの脆弱性(CVE-2010-4452)に関する
検証レポート

【影響を受けるとされているシステム】

・Java SEの下記バージョン
 - Windows、Solaris及びLinuxで動作するJDK/JRE 6 Update 23以前
 - Solaris 9で動作するJDK 5.0 Update 27以前
 - Solaris 8で動作するSDK 1.4.2_29以前
・Java Businessの下記のバージョン
 - Windows、Solaris及びLinuxで動作するJDK/JRE 6 Update 23以前
 - Windows、Solaris及びLinuxで動作するJDK/JRE 5.0 Update 27以前
 - Windows、Solaris及びLinuxで動作するSDK/JRE 1.4.2_29以前

【対策案】

Java SE、Java Businessのアップデートを実施いただく事を推奨いたします。

・Java SEの下記バージョン
 - Windows、Solaris及びLinuxで動作するJDK/JRE 6 Update 24
 - Solaris 9で動作するJDK 5.0 Update 28
 - Solaris 8で動作するSDK 1.4.2_30
・Java Businessの下記のバージョン
 - Windows、Solaris及びLinuxで動作するJDK/JRE 6 Update 24
 - Windows、Solaris及びLinuxで動作するJDK/JRE 5.0 Update 28
 - Windows、Solaris及びLinuxで動作するSDK/JRE 1.4.2_30

【参考サイト】

Oracle Java SE and Java for Business Critical Patch Update Advisory - February 2011
CVE-2010-4452

引用元:http://security.intellilink.co.jp/article/vulner/110329_01.html

つまり、アプレットである関数を使うと、ローカル(あなたのPC)内に侵入できてしまうということ。
あれだけ、以前は安全、安全と言われてきたアプレットがもう安全ではないということです。

言語っていうのは、便利になればなるほど、その裏腹にリスクも伴うんです。

ちなみに、私はそういう危険なソフト(マルウェア、ウィルス、ワーム)の類は作らないので、私のゲームで遊んでも平気です。

まあ、作ろうと思えば作れるけど、そんなことして社会的地位を失いたくないし。

ちなみに、
Javaのランタイムのバージョンを6.24以降にバージョンアップしていれば大丈夫とのこと。
現在のバージョンは7.11です。

まあ、怖いのがJavaのことを知らない人がバージョンアップをしなかった場合ですよね。
自動的にポップアップは出ると思うので、面倒がらずにJavaのバージョンアップはすることをおすすめします。
Javaはネットを使ってれば知らず知らずのうちにふれています。アプレットの絶対数は減りましたが、サーブレットは使われてますからね。
私はいまだにアプレットでゲームを作ってますが。

・・・・・・・・・・
・・・・・・・・・・

cha
最近、これにはまっていて、昨日、近所の東武ストアで買い占めました。
一缶、300円ぐらいかな。それを10缶ぐらいかいました。

いやあ、グルタミン酸ナトリウムが、脳を刺激して、クエン酸が疲労をとってくれるから本当、テンションが↑↑になるんですよね。

・・・・・・・

脳を活性化して、モチベーションを上げるレシピってのがあるんです。

やはり、
イチョウ葉エキスは大事。
一時期、イチョウ葉エキスなんて、もういらないんじゃないかと思ってたんですが、イチョウ葉エキスを飲まなかった時期ってのは、モチベーションは低かった。
今は高い。

それと、
DHA。
ヨーロッパ旅行中は勉強期間中でもあったので、DHAを大量摂取してましたが、(DHAのオーバードーズはアレルギーみたいな症状を誘発します。私の場合は皮膚炎が悪化しました)DHAもやる気物質です。

さらに、
ここ数ヵ月飲んでいるチロシン。
チロシンはタケノコを切ったときの白いアクの部分で、これがアミノ酸の一種でドーパミン(やる気物質)の材料となっています。

このベストマイッチングじゃなくて、ベストマッチングがモチベーションには良いようです。
さらに、↑↑のお茶のところにも書きましたがグルタミン酸。

・・・・・・・・・・
・・・・・・・・・・
・・・・・・・・・・

韓国語学習日記

<앵커 멘트>

먼저 남북 간 주요 이슈 현장을 찾아가는 [이슈 & 한반도 ]입니다.

지난 10일이 북한이 ‘핵 확산 방지조약 NPT’를 탈퇴한 지10년이 되는 날이었는데요.

그동안 북핵 문제 해결을 위한 다각적인 노력이 있었으나 가시적인 성과를 내지 못해 북한의 3차 핵실험 가능성이 높아지고 있습니다.

북한의 NPT 탈퇴 10년, 북핵 해결의 돌파구는 없는지, 조아란 리포터가 전해드립니다.

excite翻訳
<アンカーコメント>

先に南北間主なイシュー現場を訪ねて行く[イシュー&韓半島]です。

去る10日が北朝鮮が‘核拡散防止条約NPT’を脱退して10年になる日でしたが。

その間北核問題解決のための多角的な努力があったが顕著な成果を出すことができなくて北朝鮮の3次核実験可能性が高くなっていります。

北朝鮮のNPT脱退10年、北核解決の突破口はないのか、チョアランリポーターがお伝えします。

<앵커 멘트>アンカーコメント

먼저先に 남북南北 간間 주요主な 이슈イシュー 현장을現場を 찾아가는訪ねて行く [이슈イシュー & 한반도韓半島 ]입니다.です

지난去る 10일이10日が 북한이北朝鮮が ‘핵核 확산拡散 방지조약防止条約 NPT’를を 탈퇴한 脱退して 지10년이10年に 되는なる 날이었는데요.日でしたが

그동안その間 북핵北核 문제問題 해결을解決の 위한ための 다각적인多角的な 노력이努力が 있었으나あったが 가시적인顕著な 성과를成果を 내지出すことが 못해できなくて 북한의北朝鮮の 3차三次 핵실험核実験 가능성이可能性が 높아지고高くなって 있습니다.います

북한의北朝鮮の NPT 탈퇴脱退 10년年, 북핵北核 해결의解決の 돌파구는突破口は 없는지ないのか, 조아란チョアラン 리포터가リポーターが 전해드립니다.お伝えします

・・・・・・・・・・
・・・・・・・・・・

継続は力なり、
韓国語の学習も継続してこそ成果が出ると信じて続けていく。

・・・・・・・・・・
・・・・・・・・・・

モチベーションの維持と「おしえるまなべる」で良い講師と出会えることは密接な関係があるという、自分自身の経験則がある。
現在のプログラミングの講師はまさにプロ中のプロ。

以前、高田馬場で契約していた餃子臭さんは、ちょっと微妙だった。
中野で契約していたリュックさんは優良プログラマだった。

今、江東区で契約している人も優良プログラマです。

それと、自分のプログラミングの実力が格段に向上していることからも、学習は捗る捗る。
20~30年前くらいのファミコン並みのゲームは軽く作れそうです。

・・・・・

PHPのプロだということで、その方に早くPHPを教えていただきたいです。
自分の中では、4言語目になります。
もちろん、スクリプト言語ですので、ゲームというよりは、人工無脳的なものを作ることになるでしょう。

さらに、PHPを学習し終わったあとは、JavaScriptで作ったRPGを拡張していくのを一緒にやっていこうかと思います。

・・・・・・・・・・・・
・・・・・・・・・・・・

ヴォーカルトレーニング 一日目

今日からヴォイストレーニングに通います。
自分のジャイアンヴォイスをちゃんとしたきれいな歌声に変えてもらいます。

まあ、毎週通えるかは分からないけど。

・・・・

それにしても、勉強というのは積み重ねると本当に身になるものです。


餃子臭い


Meat and vegetable dumpling smell


만두 냄새나다
マンドゥ ネムセナダ


饺子臭
jiao3 zi3 chou4

ゲームプログラマーへの道 / 大掃除

game
近いうち、このゲームがブログの画面で動くようにします。

不具合があって、なかなかちゃんと動かないです。

・・・・・・・・
・・・・・・・・

fantasyzone
こんなゲームを作りたいです。

ファンタジーゾーンですね。

スーパートレックブラザーズを作った技術力があれば、たいていの基本的なゲームは作れる。
しかし、足りないところもあるので、今勉強をしている。
今の技術では、スーパーマリオは作れない。

せいぜいスパルタンXぐらいまで。

スーパートレックは感覚的にはアトランチスの謎に似ているので、それもできるかもしれない。

まあ、初期ファミコンゲームといったところでしょうか。

・・・・・・・・
・・・・・・・・

いきなりはじめるPHP~ワクワク・ドキドキの入門教室~いきなりはじめるPHP~ワクワク・ドキドキの入門教室~
(2011/12/09)
谷藤賢一

商品詳細を見る

PHPを勉強したいなと思ってます。

さくらのライトプランでも解禁になったことだし、さらに、さくらのライトプランはSQliteという簡易版のSQLが使える。

PHPでデータベースを動かすのが最近多いみたいで、やってみたいです。
ちなみに、前回、基本情報技術者試験を受けた時に、引っかかったのがデータベースなんです。

かなり基本的な質問しか出なかったはずなんですが、難しくって分からなかった。
来年は基本情報技術者をリベンジするつもりなんで、Javaでゲームを作り終わったら、データベースの勉強も本格的にやりたいと思います。

楽しみだ

技術評論社監修 基本情報技術者DS技術評論社監修 基本情報技術者DS
(2011/03/31)
Nintendo DS

商品詳細を見る

リベンジするぞ!

・・・・・・・・・・
・・・・・・・・・・

風邪が大分治ってきた。
昨日は職場で休日残業だったが、結局、賞状の印刷と年賀状を書くのが終わってない。

もうすぐ出国するってのに。
今日は、恐らく大掃除が終わったら職場に行かないといけないんだろうね。
あ~~あ。

L-チロシン 500mg 120カプセル ナウフーズ (海外直送品)L-チロシン 500mg 120カプセル ナウフーズ (海外直送品)
()
NOW社

商品詳細を見る

チロシンは微妙に効いているようで、モチベーションがUPしている。

気のせいだろうか。
こういうのをプラシーボって言うんだよね。

・・・・・・・・・・・
・・・・・・・・・・・

text
脅威というのは良い響きです。

基本、子どもってのは手をかけた分だけ伸びますから。
放置していても育ちません。

的確に教え、
叱咤激励し、(あまり叱咤が多いと委縮しちゃうけどね)
良いところを評価し、
そうやって伸ばしていきます。

一年間というのは大きいです。

・・・・・・・・・・・・
・・・・・・・・・・・・

tizu
早くこの国に行きたい。

でも忙しかったな。
もっとゆったりと準備もしたかったんだけど。

・・・・・・・・・・・
・・・・・・・・・・・

今日は大掃除。
まずはジョギングをして。

時間があったら職場に行って年賀状を書かないと。
住所が全部個人情報扱いで、職場に行かないと子どもたちのが書けないからだ。


データベースの操作


Operation of a database


데이터베이스의 조작
デイトペイスウィ チョチャク


数据库的操作
shu4 ju4 ku4 de cao1 zuo4

横スクロールゲーム by enchant.js/デカルトとライプニッツ/自己判断と独断

game
上のようなゲームのソースを拡張して、面白いゲームを作りたいと思います。

enchant();
window.onload = function() {
var game = new Game(320, 320);
game.fps = 24;
game.preload("images/chara1.gif", "images/map2.gif");
game.onload = function() {
var blocks = [
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],

省略

[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],

var map = new Map(16, 16);
map.image = game.assets["images/map2.gif"];
map.loadData(blocks);

var bear = new Sprite(32, 32);
bear.image = game.assets["images/chara1.gif"];
bear.vx = 0;
bear.vy = 0;
bear.pose = 0;
bear.jumping = false;
bear.addEventListener(Event.ENTER_FRAME, function(e) {
var ax = 0;
if(game.input.right) ax += 0.5;
if(game.input.left) ax -= 0.5;
if (ax > 0) bear.scaleX = 1;
if (ax < 0) bear.scaleX = -1;
if (ax != 0) {
if (game.frame % 3 == 0) {
bear.pose++;
bear.pose %= 2;
}
bear.frame = bear.pose + 1;
} else
bear.frame = 0;
if (bear.vx > 0.3)
ax -= 0.3;
else if (bear.vx > 0)
ax -= bear.vx;
if (bear.vx < -0.3)
ax += 0.3;
else if (bear.vx < 0)
ax -= bear.vx;
bear.vx += ax;

bear.vx = Math.min(Math.max(bear.vx, -10), 10);
if(game.input.up && !bear.jumping) {
bear.vy = -9;
bear.jumping = true;
}
bear.vy += 0.5;

var dx = bear.x + bear.vx + 5;
var dy = bear.y + bear.vy;
if(map.hitTest(dx, dy + bear.height)
|| map.hitTest(dx + bear.width - 10, dy + bear.height)) {
dy = Math.floor(dy / 16) * 16;
bear.vy = 0;
bear.jumping = false;
}
bear.x = dx - 5;
bear.y = dy;
});

var stage = new Group();
stage.addChild(map);
stage.addChild(bear);
stage.addEventListener(Event.ENTER_FRAME, function(e) {
if(stage.x > 64 - bear.x)
stage.x = 64 - bear.x;
});

game.rootScene.addChild(stage);
}
game.start();
}

・・・・・・・・・・・・・・・・

enchant();はライブラリを使用するための初期化処理。必ず先頭で。

var game = new Game(320, 320);
ゲーム画面を320×320で作る

game.onload = function()
game.onloadに関数を登録しておくと画像の読み込みや描画領域の確保が終わったあとに関数が実行される。

bear.addEventListener(Event.ENTER_FRAME, function(e) {
if(game.input.right)
bear.x += 5;
else if(game.input.left)
bear.x -= 5;
});
キー入力による移動
左右への移動

アニメーションの描画
bear.pose = 0;
bear初期化時

if (ax != 0) { もし加速度が0ではなかったら
if (game.frame % 3 == 0) { 
bear.pose++;
bear.pose %= 2;
}
bear.frame = bear.pose + 1;
} else
bear.frame = 0;

・・・・・・・・・・・・・・・・・

悔しいが認めざるを得ない。
encbant.jsで作ったゲームはJavaアプレットで作ったゲームよりもなめらかで、もたつきがない。

・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・

哲学トピ
17世紀の西洋哲学の主流の一つが、デカルト、ライプニッツなどに見られる合理論。
イギリス経験論と同時期に始まる。

その主張は明示的な原理から真理を導き出そうというもの。
特に「二元論」が重要。アリストテレスから続く質料・形相的な自然学からの脱却が果たされ、数学を中心とした自然科学が現れる。

デカルト
近代哲学の創始者。
「我思う、故に我あり」
デカルトは学問の土台・基礎の一切を、一から作り上げる必要性を説く。
そのためには、偽の可能性を含むあらゆる知識を排除しなければならない。これを方法的懐疑という。
デカルトはそこにふたつの段階を見出す。
一つは、全ての感覚は不確実であるという点。例えば、我々は感受した事物が夢であるという可能性を完全には否定できない。そして、次には、数学的、理性的知識さえも疑いの余地があるという点である。
そのような認識は、「邪悪な霊」がその都度我々を誤謬へと導いていないとは誰も言いきれないのである。

それでは、我々は何を知の基準とすればよいのか。
その答えこそが「我思う、故に我あり」なのである。
「邪悪な霊」が私を欺こうとも、それを疑う私自身の存在は疑いえない。というのがデカルトの主張である。
つまり、私とは、「思惟するもの」であり、これこそが絶対確実な学問の基礎をなす、第一の原理となる。

神の存在証明
デカルトによる神の存在証明は、大きく分けてふたつがある。私は有限で不完全であるにも関わらず、完全で無限なものという観念をもっている。これは、ア・プリオリな「生得観念(本有観念)」が与えられることに由来し、その原因として神は存在しなければならない、というのが一つである。
そして、もう一つは、最も完全な存在者としての神は、その観念の中に実在がふくまえており、それゆえに神は存在する、という。後者はのちにカントによって「存在論的証明」と呼ばれることになる。

そして、このように証明された神は完全なる存在であるから、欺くことはない。そのような「神の誠実」があるとすると、「判断する能力」は神に与えられたものであるから「明晰かつ半明に私に知られうるものは真である」という「一般的規則」が成り立つ。かくして、懐疑において排除された理性的知識は改めてその確実性を取り戻す。

二元論
そして我々は「神の誠実」によって、物体が「延長するもの」として存在することを、「明晰かつ判明」に認識する。「延長するもの」とは三次元的な拡がりをもった位置、形状、運動のことを指す。このように、精神と物体は「思惟するもの」と「延長するもの」とに峻別される。ここにデカルトの二元論が成立する。
そして延長は思惟することの一切を排除されているため、スコラの自然学にみられる「実体形相」、つまり自然を構成する超自然的な何か、というような存在は否定される。したがって自然は、延長でしかないのだから、これは数学的規定によってのみ考察可能となる。
デカルトによっては動物ですらこの延長を逸脱していない機械であり、機械論に立脚した自然観が必要とされる。
しかし、人間は動物とは違い、精神と肉体の合一体である。「思惟するもの」と「延長するもの」はお互いに影響を及ぼすことはないにもかかわらず、人間においてはその統一が果たされているようにみえる。これが心身問題といわれるものであり、デカルト自身も明確な答えを提示することができなかった。

ライプニッツ
モナド
モナドとは「自然の真なるアトム」、「形而上学的点」である。
「モナドは窓をもたない」というように、それは相互に影響しあうことのない、独立した存在である。物質も精神もその本質はモナドに由来するため、それらは二元論的ではなく連続性をもっている。モナドは同一の宇宙を自らのうちに持っていながら「表象」を通じて、それぞれの形でそれを写し出す。そのため、モナドは「宇宙の生ける鏡」である。
モナドはその表象の明晰さという点において区別される。
物体は「裸のモナド」であり、動物や植物は霊魂のそれをもち、さらに人間は精神のモナドとして表れる。

理性の真理と事実の真理
ライプニッツは真理を積立つの要素に区分する。すなわち「理性(永遠)の真理」と「事実の真理」である。
理性の真理は分析的命題によって導かれる真理である。分析的命題とは述語の概念が主語のそれに含まれるような判断のことである。理性の真理は必然的であり、その反対は矛盾をはらむため、その原理は「矛盾律」となる。逆に事実の真理は総合的命題、つまり述語概念が主語のうちに含まれないような判断によって生まれ、「充足理由律」がその原理である。総合的命題は偶然的でその反対も可能になることから、事実の真理には「なぜにかくあって別様ではないのか、ということの十分な理由」が必要となる。

予定調和と最善観
モナドは独立した存在だが、にもかかわらず世界が秩序をもっているようにみえるのは、神が「予定調和」としてそれを定めたからだとライプニッツは考えた。ここに「時計の比喩」というものがある。
彼はある二つの時計の時間を合わせるには、三つの方法があるとした。
第一にふたつの時計のしかるべき部分を連動させる方法、第二に瞬間ごとに合わせる方法、第三にと系をあらかじめ精密なものとして作っておく方法の三つである。このふたつの時計を精神と心身とに置き換えてみると、第一の方法では両社が行き交う何かを想定しなければならない、また第二の方法では神に連続的な奇蹟を強いることになるため、それぞれ否定される。第三の方法がすなわち予定調和なのであり、「表象」がこれによって秩序づけられることで、デカルトの心身問題の解決が果たされる。
さらに神は、この予定調和にみられる事物を、可能的世界の中で最もよいものとして創造した。ライプニッツはこのような最善観を主張した。最善の世界であるはずのこの世界には悪が存在するが、彼は被造物の不完全性に由来するものとした。不完全が故に悪が可能なのであり、そうしたもの同士の調和こそが最もよい世界の表れなのである。

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・


昨日もベースの練習をしていた。
ベースは80%OK。

その後、カラオケに行って一人練習。

だけど、↑↑の曲の声が最後のところが上手くでない。
最後の最後だけどうしても裏声になってしまう。

腹筋を鍛えることが重要みたいだ。
いや、もう一週間以上腹筋を続けているけど、どうしても最後の「ワーー、アーー」のところだけ声がひっくり返ってひまう。

いやあ、大変な仕事を引き受けてしまったよ。

・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・

自分の判断を信じること。

仕事の話しです。
自分が、これはオカシイと思ったことは、自分の判断でやらない。
「だって、〇〇さんだってやってる・・・・」
というのは、子どもの言い訳。

自分がオカシイと思ったら、自分がやらない。
去年の最初、親との会合で、いちいち前任者と比較されて、チクチク言われた。
でも、今考えてみたら、その人がやっていたことは人権意識を無視した行為で、親はプロではないから、そういった強硬なやり方が「良いんだ」と思っている。
その人はベテラン、私は新人。
だから、親はベテランのやっていることを信じ切っている。

で、そのやり方を踏襲していたら、ガツンと言われた。
やっぱり、自分の判断で辞めるべきだったんだ。

それから、他人の意見を聴くこと。
独断的にならない。
完璧な人なんていないし、完璧でないことを隠したり、恥たりしない。

・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・


私は独断的にならない。


I do not become arbitrary.


나는 독단적이어지지 않는다.
ナヌン トグダンチョギエチジ アヌンダ


我向独断的不成。
wo3 xiang4 du2 duan4 de bu4 cheng2

ナポレオンヒルの洋書を読む/基本シューティングゲームでプログラミングの勉強

Think and Grow RichThink and Grow Rich
(1987/05/12)
Napoleon Hill

商品詳細を見る

今読んでいる本。

ナポレオン・ヒルの『Think & Groe Rich』です。

大分前に買った洋書です。
1ページにだいたい、1単語は難解な単語が出てくるので、そのたびに調べるか、もしくは、読み飛ばしてあとで調べるかしています。

和書を読むよりもずっと時間がかかります。

昨日は禁酒の日でしたから、どうせですから、時間をかけて読みたいものです。

おそらく、予想なんですが、成人向けのペーパーバックはネイティブ・スピーカーが、1万語以上語彙力があることを前提として書いていると思うんです。

今よりももっと速く洋書を読みこなすには、もう少し単語量を増やさないといけないかなと感じています。

・・・・・・・・・・
・・・・・・・・・・

洋書を何冊か読みたいものです。
それも難解すぎないものを。

それから、中国語書籍、韓国語書籍なども順を追って読んでいきたいと思っています。
それこそ簡単なものから。

・・・・・・・・・・・・・・・・

つくづく色々な本を読んでいると、自分も勉強しないといけないなと感じてしまう次第です。
まあ、専門の教育関係の本からしらみつぶしに読んでいきますか。
それこそ、洋書だっていいわけです。

・・・・・・・・・・・・・・・・


Z,X,C,Sボタンで移動、Bボタンで攻撃です。
ENTERキーで始まります。

やってみてください。
簡単なJavascriptで書かれたゲームなんですが、これを子どもたちに紹介しようかななんて考えてます。ゲームプログラミングの基本中の基本みたいなことが書かれていますから勉強になると思います。

あれこれ改造をさせて発見をさせてみると面白いかも、
そのうち、自分で書いたキャラクターを動かしたいだとか、効果音や、BGM、ボスキャラを作りたいなんていいだしたら、ヒントを与えて、自力で解決させます。

こういったやりかたで、ずっぽしプログラミングにはまった子どもたちが将来有名にハッカーになったりするんでしょうね。

ソース自体は数百行程度のゲームです。
ある程度プログラミングをやった経験のある人だったらそうそう面食らうようなプログラムじゃありません。

・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・

週一回、禁酒は継続しています。
キャンプラルにはお世話になっています。
そして、マイスリーにも。
酒を飲んで熟睡した翌朝よりも、疲れは無いです。
つまり、酒を飲んだ方がちゃんと休めてないっていうセオリー通りのことが起っているわけ。

・・・・・・・・・・・・・・・

中国人親子、どうなんだろうなぁ。
その気あるのかなぁ。
食事に誘ったんだけど、OUTだったみたい。

どうしてなんだろう・・・。

・・・・・・・・・・・・・・・

サインバルタ、効いてるのか相変わらず不明なところが多い。
モチベーション、集中力、やる気、そういったものが、とことん低下している。


ハッカーを育てる。


bring up a hacker.


해커를 키운다
ヘコルル キウンダ


培育客。
pei2 yu4 hei1 ke4

宇宙一複雑なものとは/スマドラ飲みながらドラクエもどきをプログラミング

conectome
線虫のコネクトーム。

以下WIKIコピペ
ヒトゲノムの解読は2003年に終了が宣言されたが、ヒト・コネクトームの解読はまだ端緒についたばかりである。人間の脳には1000億ほどの神経細胞があり、それらの間に1兆ほどの接続が存在すると考えられている。これは30億ほどの塩基対(2-3万の遺伝子)で構成されているヒトゲノムよりはるかに複雑な対象であり、ヒト・コネクトームの研究の発展には技術的な進歩が欠かせない。2009年現在、神経系の詳細な接続状態が良く分かっている生物は単純な種のみで、こうした種の例としてたとえばC. elegansがいる。C. elegans は体長1mmほどの大きさを持つ線虫の一種で、302個の神経細胞を持つ。
以上コピペ

コネクトームというのは、「全接続状態」とでも言えばいいだろうか。

↑の図は線虫の全神経同士の接続状態を示したものです。
Cエレガンスは302個の神経系なので簡単ですが、それでも図を見ると気持ちが悪くなるくらい複雑です。
人間の脳細胞は1000億で、さらにその接続状況は1兆と言いますから、その複雑さはこの宇宙でも随一なんじゃないでしょうか。

そうです、
この宇宙で最も複雑な事象は人間の脳の構造なのではないでしょうか。

究極に秩序だった系統がこの脳神経系であり、人間のそれが最も高度に複雑なのです。
この宇宙に他に高度な文明があれば別ですが、恐らく、この地球の人間脳の構造こそ恐ろしく複雑で解明困難なものなのではないでしょうか。

sermion
サーミオンです。
先日からの意欲低下(主には音信不通事件が尾を引いている)で色々なことが手につかない。
中国語の勉強とかも全然してない。
結局昨日は10kmぐらい走って、終了。
何もしませんでした。

サーミオンは意欲低下を直すためのスマートドラッグです。
脳の機能改善をして、興奮状態を起こす薬です。
もちろん合法です。

これを注文して、来週にでも試してみます。

・・・・・・・・

スマートドラッグは色々試してますが、どれも合法の薬なので効き目はマイルドです、それでも、今朝、ピラセタム、ヒデルギン、イチョウ葉、DHA、ビタミンB群、レシチンを飲んで、極め付きにすき家のねぎ玉牛丼ミニ汁だくの唐辛子だくを注文。
脳は澄み切っています。

その状態でドラクエもどきをプログラミングしていました。
脳の状態が良くないとプログラムというのは、長い証明問題みたいなものですから、無駄に時間がかかってしまいます。

サーミオンが良い薬だったらいいな。

以前、本で、覚醒剤を使った人の経験談を読んだんだけど、テンションが果てしなく上がるらしいね。
一晩目が冴えっぱなしで、フランス語の本をすべて解読しながら読んでいたという話しを聞いて。すげぇ、と思ったけど。その後が最悪らしかったです。凄くだるくなって鬱状態になったらしいです。

ドラッグというのは怖いです。

自分は、酒ですらまともに辞められない人間ですから、ドラッグなんて絶対に嫌です。

・・・・・・・・・・・

doraque
ドラクエもどきのプログラミング進捗状況
・名前を自分で決められるようにした
・武器を拾って装備できる
・敵が時々薬草を落とす(回復アイテム)
・レベルが低い時は逃げてもまわりこまれてしまう、さらに、ダメージ2倍!
・母親に話しかけるとHP、MP回復

doraquemodoki
今後の拡張の予定
・お金でアイテムが買える
・白魔法、黒魔法が選べる
・マップの拡張
・敵の増加

できれば拡張
・セーブ機能
・BGM、効果音
・歩くアニメーション

今の担当の子どもたちと約束したんだ。
このゲームを完成させて、やらせてあげるって。
だから、頑張ろう。

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・

実は、このブログ以外にもブログを始めようかと思っている。
教育関係の話題だけに絞ったブログを書こうかと思っている。
常々、自分の専門である教育は、それだけ別のところに書きたいという想いはあった。
かといって、今さら長期放置してきたmixiを復活するつもりもないしmixiの中の人は違う関係の趣味の人が多いから、教育のことばっか書くのも迷惑になる。
フェイスブックは英語圏の人たちの友達ばっかりなので、日本語では書けない。ツイッターで書くような短文の日記にするつもりもない。

なので、ここ以外にもブログを始めようかと思ってます。


長期間放置する。


Neglect for a long period of time.


장기간방치한다.
チャンギガンパンチハダ


长期间放置。
chang2 qi1 jian4 fang4 zhi4
【完全無料】世界初!飲む水晶サプリ活性珪素水溶液【リンクスモール】

この商品は無料です。
umoは今、各界で大注目の高純度珪素(ケイソ)濃縮溶液です。

珪素(SiO2)その成分を水に完全に溶解することは今日の技術では非常に困難でした。これを十数年の年月をかけて取得した製法特許によって世界で初めて抽出に成功したものです。水晶などで知られる石英を水溶液化に成功した商品です。

化学記号はNa2SiO3-10H2Oで、その成分は水に完全に溶解します。現在では、珪酸塩(Na2SiO3-10H2O)は、韓国環境水道研究員で物質試験成績書を取得し、法令に定められた飲用に適するものとして製造、販売が認められており、浄化作用の高い物質umoは各界から高い注目を集めています。

珪酸塩は食品添加物としてFDA(米国食品医薬品局:U.S.Food andDrugAdministration)にも承認されているものです。珪素のすぐれた点はすでに一部雑誌やTVでも報道済みです。
【完全無料】世界初!飲む水晶サプリ活性珪素水溶液【リンクスモール】


韓国古くからの言い伝え

韓国では古くから、「川辺でする洗濯は、石英(珪石)の岩場で、叩き棒にも石英(珪石)を使いなさい」と言い伝えられています。それは石英または珪石の特徴として、石英にはコケが生えないことからです。

また、石英(珪石)は、強いアルカリ性を持っており、水を浄化する神秘的な力を発揮するからなのです。現在研究所のある南漢江の水は浄化力の高いことで韓国では有名です。その理由は南漢江の流域に純度の高い珪石鉱が無尽蔵に存在しているからなのです。また、珪砂が多い川の水が清流なのは、珪砂が持っている水を浄化する神秘的な自然の力によるものです。

umoという名前の由来

活性珪素「umo」濃縮溶液は、数億年前の地球噴火時、溶解した水晶原石溶岩が水を囲いこんだまま(2000℃以上)の高熱によって水溶性の珪素成水が、地殻の変動時に水を瞬時に囲い込んだまま固まってその高熱(2000℃以上)によって水晶石の成分である珪素成分ガス化濃縮離合され、できた溶水と同じだということが解りました。

水晶の発掘作業で「umo」の入った水晶石が発見されたのです。この自然界に奇跡的に作られた「umo」は、発見される原石の1000個のうち1~2個の割合でしか存在しなく大変貴重な水晶エキスです。

今日アメリカでは産出国であるブラジルの鉱山へ医療関係者が、自家用飛行機で訪れ、その「umo」が発掘されるまで長期にわたり滞在し、「umo」を大変高価な値段で買付されています。この「水」が"ウモ"と呼ばれていたことから商品名になりました。この水晶エキス「umo」は古くから難病の治療、不老長寿、元気の源として特別な人のみに愛用されています。

今、水晶抽出水溶性の活性珪素「umo」は口コミで広がり、多くの人々に喜ばれています。
【完全無料】世界初!飲む水晶サプリ活性珪素水溶液【リンクスモール】

冬の休暇をほぼ全てつぎ込んだ“ゲーム”がいよいよ完成

rpg15
子どもが考えたキャラクターが画面上で動く、
ゲームが出来るなんて夢のようです。
しかし、夢ではありません。

既に現実です。

tekichara
私は夢を現実にしました。

ドラクエのようなRPG、
キャラは全部子どもが考えたもの。

・・・・・・・・・・

tekikyara
実際に使うグラフィック

teki5
tekichara
子どもが考えたキャラ。
ザコキャラとして採用させていただきます。

teki6
tekichara
これは強そうなのでボスキャラかな~。

・・・・・・・・・・・・・・・・

こういった感じで、ようやく完成に近づきつつあります。
ヒイヒイ言いながら作ってますよ。
もう正月なんてなんなの!って感じです。

おせち料理もなく、カップラーメンばっか食べてる。
おせちで思い出したけど、おせち(汚せち)のゲームみたいなの作ってもいいかもね。
ブッシュ大統領に靴を投げるゲームなんかも流行ったよね。

ああいうの作ろうかな。

・・・・・・・・・

プログラムのちょっとした改良。
ゲームマップの改良。
BGMと効果音の追加。

・・・・・・・・・

あっという間に冬休暇も終わってしまうなぁ・・・・・・・・・・

ゲーム作って終わりだよ。
ってか、
どんだけだよ。
この労力。
すっげ、疲れた。

・・・・・・・・・
・・・・・・・・・


冬の休暇が終わる。


A winter holiday is over


겨울의 휴가가 끝난다
ケウルィ ヒュカガ クンナダ
겨울의・・・冬の
휴가가・・・休暇が
끝난다・・・終わる


冬天的休假结束
dong1 tian1 de xiu1 jia3 jie2 shu4
结束・・・jie2 shu4 は終わるです。

★1円即決★フレッツ光同時加入セット★中古ノートパソコン★【中古PCのデジタルドラゴン】

ゲームプログラマーへの遠い道 ~今のゲーム、ひと段落~

rpg
回復屋みたいなのを作って、HP、MPを回復させる昨日を持たせたい。
で、作りました。
これで旅も安心。

rpg
三が日に格闘していたプログラムが上手くいかなくて、保留。
魔法は黒魔法と白魔法に分けて、レベルアップとともにそれぞれがグレードアップしていく感じにします。
普通のRPGみたいに、たくさんあって選択みたいな機能が作れませんでした。

さすがに、休暇期間を過ぎたらもう、完成モードでいないといけないので、1月4日の今になって出来ないプログラムと対峙しているヒマはありません。

明日はペンタブを用意してグラフィックを描きます。

敵キャラ。
数種類。

・・・・・・・・・・

非常に、エンジョイしなかった正月でした。
チャンチャン。

ずっと、記号の羅列とにらめっこ。

でも、成果物はあったし、プログラムの能力も向上したし。
よかったとしよう。

本物の元祖ドラクエ1以上のモノを作りたいという願望もありつつ、
時間という制約と、果てしない労力。

・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・

さ~~~~、、、、、やること多いよ!
ピアノに、習字に、卓球、、、

語学の勉強だってしたいしさ、
落語の「時そば」を覚えたいしさぁ
ジョギングもちゃんとやりたいしさ~

習字からやっつけるか。

・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・


ゲームプログラマーを目指す道はずーーーーーーーーーーーーっと、続く。

何を隠そう、別に隠してないけど、私はポケモンは結構やっていた。

緑(初代)→銀 →サファイヤまでやった。
その後に、出たのはやってない。
サファイヤで事実上卒業ということになる。

サファイヤの時はもう、いい大人だった。
でも、やっていた。
児童福祉施設や児童館で働いていたときに、子どもと共通の話題が欲しかったからやっていた感がある。

いや、楽しかったというのが純粋な気持ちかな。

緑の頃は働く前だったけど、実家の風呂に入りながら、GBにビニール袋を掛けて濡れないようにしてプレイしていた。風呂の中で2時間やってました。

銀は、自分的には最強で、もちろん裏技とかは使わずに結構最強だった。
カビゴン、バクフーン、ミュウツー、ポリゴン2、ゲンガー、ムウマ、ルギアあたりがレベル100だった気がする。
もう、GB自体どっかいっちゃったけどね・・・

サファイヤは、レックウザとかカイオーガとか最強だったけど、児童福祉施設で勤務している時、子どもに貸していたらレックウザにしょぼい技を覚えさせられて、凄くショックだった記憶がある。
しかもアドバンスの画面割られたし。。。

なぜポケモンかというと、自分の技術力がUPしたら、それこそ、ポケモンのバッタモンみたいなのを自力でプログラムしてみたいと思ってる。

作ってみたいゲームはあれこれある。
でも、実際、自分の技術力が追いついてないってのが現状。
無駄に時間を使っちゃって、自力解決できないで終わるってパターン。
そうやってるうちにゲンナリしてくるんですね。

今年なんか、いきなり、三が日からカップラーメン三昧ですよ!!

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・


私はゲームを開発する。


I develop a game.


나는 게임을 개발한다.
ナヌン ゲイムル ケパルハダ
나는・・・私は
게임을・・・ゲームを
개발한다.・・・開発する


我开发游戏
wo3 kai1 fa1 you2 xi4

★1円即決★フレッツ光同時加入セット★中古ノートパソコン★【中古PCのデジタルドラゴン】

ゲーム開発 本日11時間/GOOGLE CHROMEの実力/マルモリ

debugcrome
CHROMEの便利さ、使い心地のよさには本当に感心してしまいます。
ファイル更新の反映が速い。
もちろん、それもあります。

他には、Javascriptのデバッグがブラウザで出来てしまうというのが驚きです。
デバッガをダウンロードしなくて良いんです。

これは素晴らしい!!

これって大きいですよ。
だって、ダウンロード、インストールするってことはそれだけ時間と手間ヒマと、もっと大事なPCのメモリ領域がかかるわけじゃない。

ブラウザ右上のスパナマークをクリック→ツール→デベロッパーツール

これだけで、Javascriptのソースが見えて、ちゃんとデバッグまでしてくれるんです。
おいおい、なんなんだよーー
うれしくなっちゃうじゃないかい。
正月早々、クロームさんにはお世話になります。
IEはこういうのを見習って欲しいんだよ。

っていうか、ブラウザの性能の差、出過ぎちゃってるね。
IEとクロームの間には、

クロームは強力なインタープリターが後ろで動いている感じです。
とても速いです。
クロームの仕様は知らないんですがね。
でも、
逐次、今書いたソースのJS(Javascript 以下JS)のソースコードを解読して、デバッグしてくれちゃうってんだから、なんてったって凄いね。
YOUTUBEごときに足を引っ張られているIEとは別世界。

いやあ、GOOGLE CHROMEあっぱれです。

・・・・・・・・

さっきも書いたけどさ、
ダウンロードしなくていいってことはさ、極端な話、ネカフェでも職場でも開発が出来ちゃうってことよ。
それって、ホント、大きい。

それこそ、一億総プログラマーの時代が来ますよ。
一億どころじゃないな、ネットが世界中に行き届けば七十億総プログラマーだな。

だからさあ、GOOGLEの技術は前々から称賛しているんですよ。
自動運転する人工知能搭載の車の開発だってそうだし、
今回のクロームの開発だって、世界規模で老若男女がプログラムをやるようになったら、色んな人が色々なプログラムを書いて、人類総じての技術力のアップにもつながるでしょ。

人類が皆プログラマーになったら、底上げというか、職業プログラマーはもっと高度なプログラムを書くわけじゃないですか。

それこそ、人類総プログラマーって時代が来たら、レイカーツワイルの技術的特異点もそう遠くないんじゃないかと思うんです。
七十億のプログラマーが、もしくは、その中のチームが人工知能を、本来的な意識を持った本当の人工知能を開発してくれるでしょう。

・・・・・・

そうそう、
私の仕事でもね、
子どもに教えてますから、
パソコンは今どこの職場にもあります。
クロームを入っていれば、特別何かをダウンロードしなくても、子どもにプログラミングを教えてあげられるんです。
これは凄い。

battle3
はい、今作ってるドラクエモドキ。
一応、魔法が使えるようにしようとしています。
battle1
ま、属性とかも考えてますが、まずは、ファイアなりブリザドなり違う魔法を選択できるようにしようとしています。
それももう少し。
battle2
基本的な仕様は、あれだな。
今日の深夜3時からいじってきたんだけど、イベントの発生とかは、もう問題じゃなく。
あとは、音源を探したり、(もうあるけどね・・)
絵を描いたり、
ビットマップを描いたりと、
↓↓こんなの、それも実際は何百行×何百行もあったりする。

00000000000
00011101100
00111111110
01111211100
01110000000
00000000000

↑↑、2Dゲームのビットマップ書くのって、慣れても目がチカチカしてくるんよ。

結構、残りは労働力系の作業が多いかな。
知力系よりは。

って思ってます。
つまり、つまるところ、プログラミング系のお悩みってのはね、ほとんど、ずっとこの年末年始PCに向かいながら悶々と考え続けてきて、試行錯誤して解決しているから、

・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・

プログラミングのことなんだけどね。
思ったことなんだけど、
ちゃんとしたデバッガが無いと死ぬよね。
これは真実だよね。

今までJSで結構短文のプログラムを書くことは多かったけど、いやあ、人工無脳とかは結構短文なのよ。
JSの無脳はね、Perlで自動学習型のとか作った時は血を吐きそうだった(嘘、そんなことなかった)けど。
(前にも書いてますが、JS以外、つまり、JavaやPerlではちゃんとした開発環境をインストールしてますよ)

JSだけのは、学習型じゃないから。
IF-THENだけ みたいなソースは、どんなに長くても可読性は高いから。
Perl使うのは、色んなモジュールとか通すでしょ。学習とかさせようとすると。

今までメモ帳みたいなので書いてたんだけど、今回クロームにブラウザで出来るデバッガがあるって知って、本当良かった。
無かったら死んでたね。

いやはや、今午後3時、午前3時にPCに向かってプログラム始めたから、今立ち上がると完全に立ちくらみすることは想定内。

・・・・・・・・・・・・・・・・・

これからもそうするつもりだけど、
プログラムは実行可能な他人のソースを見て、何度も読んで(10回以上繰り返し通読して)、それで、改造して、動き方を見るのが一番ですね。

特に、長いソースはそうなんですよ。
自分の今までやってきた言語でもですよ。
この変数はいったい何なんだろう、って考えるより、その関数削ったらどうなるのかとか(まあ、エラーでるだろうけど)いろいろ試してみるのが一番なんです。

14歳からはじめるHTML5 & JavaScriptわくわくゲームプログラミング教室Windows/Macintosh対応14歳からはじめるHTML5 & JavaScriptわくわくゲームプログラミング教室Windows/Macintosh対応
(2011/06/24)
大槻有一郎

商品詳細を見る
この本買おうかな。



個人的にというか(国民的に?)応援しているからさ、
マルモリの紅白、誰かUPしてくれるの待ってるんだけど、ニコ動の方にあるのかな?

昨日は、普通にプログラミングに明け暮れて、そのまま紅白なども見ずに寝てしまったので、マルモリが見たいです。

このCM好き。

マルモリの凄いところはさ、「一つになろう日本」とか、「絆」とかそういうキーワードを全く予想していないタイミングで、あの時期に放送されたってのが大きいよねー。

だって、企画・制作段階で、誰も地震とかこんな大変なことが起るなんて予想してなかったでしょ。
なんか、それだけに、嘘っぽさがなくてさ、、、響くよね。


今年は、平和な一年でありますように。
このブログを見てくださっている一人一人の皆さんに幸せな一年が訪れますように。

もう悲しいことは十分に起りました。

今年は笑って過ごせますように。

・・・・・

本当、こんな一個人の日記にブクマしてくれて、そういった人が何十人もいて、読んでくださる。
それはありがたいことなんですね。
だから、ブログってのは、読む人の心に届くようなことを書かないといけない。

・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・

とりあえず、今日深夜やってたところ、
さらに、さっきまでは、複数の魔法を選択できるように拡張していた。

case SCRIPTCODESTAGE_BATTLE_MAGIC_IN://道具と魔法も

// リターンキー解放を確認したら戦闘処理画面へ
if (key.getTrigger() == KeyStatusHolder.KEYFLAG_NONE) {

script_codestage = SCRIPTCODESTAGE_BATTLE_MAGIC;//魔法を選択させないといけない

dmg = Math.floor(Math.sqrt(statusHolder.at * 6) * Math.sqrt(statusHolder.at / event_enemy.def) / 2);//3=>6

dmg = dmg + Math.floor(Math.random() * (1 + (dmg / 4)));

msg = chr_name + "は魔法を唱えた<:br>" + event_enemy.name + "に" + dmg + "のダメージ!<:br><:br>";

event_enemy.hp -= dmg;//主人公のステータスホルダーからMPを引かないといけない

if (event_enemy.hp > 0) {

dmg = Math.floor(Math.sqrt(event_enemy.at * 3) * Math.sqrt(event_enemy.at / statusHolder.def) / 2);

dmg = dmg + Math.floor(Math.random() * (1 + (dmg / 4)));

msg = msg + event_enemy.name + "の攻撃<:br>" + chr_name + "に" + dmg + "のダメージ!";

statusHolder.hp -= dmg;

if (statusHolder.hp < 0) {//ここで死亡処理 新しいウィンドウ→リターンキーでinit()ゲームオーバー
statusHolder.hp = 0;
}

}

// 戦闘処理画面のメッセージ設定
scriptMeswin.setText(msg, viewContext);

}

break;

// 戦闘処理画面表示中
case SCRIPTCODESTAGE_BATTLE_MAGIC:

// メッセージ表示が終わったら次へ
if (scriptMeswin.process(key)) {

// 敵を倒したら勝利
if (event_enemy.hp > 0) {
script_codestage = SCRIPTCODESTAGE_BATTLE_COMMAND_IN;
} else {//勝ったら終わり、勝ってなかったら再びコマンド
script_codestage = SCRIPTCODESTAGE_BATTLE_WIN_IN;
}

}

break;


///
/////////////////

// 勝利画面待機中
case SCRIPTCODESTAGE_BATTLE_WIN_IN:

// リターンキー解放を確認したら勝利画面へ
if (key.getTrigger() == KeyStatusHolder.KEYFLAG_NONE) {

scriptMeswin.setText(event_enemy.name + "を倒した!", viewContext);

statusHolder.exp += event_enemy.exp;

if (statusHolder.exp > 999) {//999より上げる、ここでレベルアップ処理
statusHolder.exp = 999;
}

// 経験値に応じて主人公の能力値更新→ここを改良する必要あり
statusHolder.mhp = DEFAULT_MHP + Math.floor(Math.sqrt(statusHolder.exp * 2));
statusHolder.at = DEFAULT_AT + Math.floor(Math.sqrt(statusHolder.exp * 4));
statusHolder.def = DEFAULT_DEF + Math.floor(Math.sqrt(statusHolder.exp * 4));

// HP全快→ここを改良する必要あり
statusHolder.hp = statusHolder.mhp;

script_codestage = SCRIPTCODESTAGE_BATTLE_WIN;

// reg_battle()なら、指定変数を1に設定
if (exec_event.scriptList[script_pos].name == "reg_battle") {
i = getValue(exec_event.scriptList[script_pos].args[1]);

varList[i] = 1;

}

}

break;


悲しいことは十分に起きた。


Sad things has been fully happened.


슬픈 것은 충분히 일어났다
スルプン コッスン チュンブニ イロナッタ
슬픈・・・悲しい
것은・・・ことは
충분히・・・十分に
일어났다・・・起った


充分地发生了悲哀事
chong1 fen1 de fa1 sheng1 le bei1 ai1 shi4

活性ケイ素umo水溶液500ml家庭用【リンクスモール】

HTML5のゲームソース/韓国語日記/今日からピアノ教室へ

html5gamesource
ゲーム画面へ進む
いたって簡単なゲームです↑↑

マウスで主人公のドラゴンを動かして、クリックで火を噴きます。

teki
jiki
32ピクセルのGIF画です。自作です。GIMPで描きました。
ショボイとか言わないでください。

ソースです。HTML5のサイトを見ながら学習しています。

タグ<>(不等号)があるとブログでソースが見れなくなるので全角にしました。
タグを正しく書き直せば、このソースをそのままコピペすれば出来ます。
あとは、同じディレクトリに、teki.png、player.png、tama.png(png画)を置けばいいだけです。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<titleHTML5のcanvas></title>
<style type="text/css">
canvas {border: 1px solid #999;}
</style>
</head>

<body>
<canvas id="shootingCanvas" width="1200" height="800"></canvas>
<script type="text/javascript" language="JavaScript">
<!--
window.onload = function() {
var canvas = document.getElementById('shootingCanvas');
var list = [];
var draw;
var player = new Image();
var playerData = new PlayerData();
var ctx = canvas.getContext("2d");
var mouse = {x:0, y:0};
var missileList = [];
var tako = new Image();
var tama = new Image();
var stageWidth;
var stageHeight;

if (canvas.getContext) {
player.src = "player.png";
tako.src = "teki.png";
tama.src = "tama.png";

//キャンバスのサイズを取得
stageWidth = canvas.width;
stageHeight = canvas.height;


//自機に30発のミサイルを仕込む
for (var mi=0; mi<30; mi++) { missileSet (); }

for (var i=0; i<100 ; i++) {
var s = new Square();
s.x = rand(stageWidth);
s.y = rand(stageHeight);
s.vx = rand(1)*10-5;
s.vy = rand(1)*10-5;
s.color = "rgb("+Math.floor(rand(255))+","+Math.floor(rand(255))+","+Math.floor(rand(255))+")";
list.push(s);
}
//player
window.onmousemove = getMouse;
window.onmousedown = shoot;
draw = setInterval(balls,33);
}

function balls(){
//ctx.clearRect(0,0,stageWidth,stageHeight);
ctx.fillStyle = "black";
ctx.fillRect(0,0,stageWidth,stageHeight);
var s;
for (var i=0; i s=list[i];
s.x+=s.vx;
s.y+=s.vy;
if(s.x<=0) s.x=stageWidth;
if(s.x>stageWidth) s.x=0;
if(s.y<=0) s.y=stageHeight;
if(s.y>stageHeight) s.y=0;
/*ctx.beginPath();
ctx.fillStyle = s.color;
ctx.fillRect(s.x,s.y,10,10);
ctx.closePath();
ctx.fill();*/
ctx.drawImage(tako,s.x,s.y);
}
playerData.x+=(mouse.x-playerData.x)*0.5;
playerData.y+=(mouse.y-playerData.y)*0.5;
ctx.drawImage(player,playerData.x,playerData.y);
//ミサイル
var ms;
for (var m = 0 ; m < missileList.length; m++) {
ms = missileList[m];
/*ctx.beginPath();
ctx.fillStyle = "red";*/
if(ms.shotted) {//発射中なら
//ctx.fillRect(ms.x,ms.y-=20,5,5);

ctx.drawImage(tama,ms.x,ms.y-=20);

if(ms.y<0) {//上までいったら自機に戻す
ms.x=playerData.x;
ms.y=playerData.y;
ms.shotted = false;
}

//判定
var sT;
for (var iT=0; iT sT=list[iT];
if(hitTest(ms,sT)){hitMissile(iT);break;}
}

}else{
ms.x=playerData.x;
ms.y=playerData.y;
}

/*ctx.closePath();
ctx.fill();*/
}
//ミサイルここまで
}

function rand(num){
return Math.random()*num;
}

function hitMissile (n) {
//ミサイル命中
list.splice(n,1);
}

function missileSet () {
//ミサイル搭載
var m = new Missile();
m.x = playerData.x;
m.y = playerData.y;
missileList.push(m);
}

var shotNum = 0;

function shoot () {
//ミサイル発射
if(shotNum <30) {
shotNum++
}else {
shotNum = 0;
}
var targetMissile = missileList[shotNum];
targetMissile.shotted = true;
}

function hitTest (obj1, obj2) {
if(obj1.x < obj2.x+tako.width/2 && obj1.x > obj2.x-tako.width/2 && obj1.y < obj2.y+10 && obj1.y > obj2.y-10){
return true;
}else{
return false;
}
}

function Square () {
this.x = 0;
this.y = 0;
this.vx = 0;
this.xy = 0;
this.color;
}

function PlayerData () {
this.x = 0;
this.y = 0;
}

function Missile () {
this.x = 0;
this.y = 0;
this.shotted = false;
}

function getMouse (e) {
mouse.x = e.layerX-20;
mouse.y = e.layerY-25;
}

};
-->
</script>
</body>
</html>

・・・・・・・・・・・・・・・・

この↑↑のゲームがちゃんとしたゲームになるために必要なモノは、

プレイヤーの当たり判定&&ダメージ・死亡
タイトル画面との画面遷移
得点
ステージクリア
効果音&&BGM

それにしても、HTML5はサクサク動きますね~~
もはや、JavaアプレットやFlashをやるメリットってのが無くなって来ました。

HTML5は勉強し続けるつもりです。
特に、この冬休暇期間中は。
しかし、自分はJavaでゲームを組んできた期間が長いですし、多くのソースが手元にあって、それが自分がJavaをやる上でのアドバンテージになっています。

しっかりと集中して学習すれば、HTML5は中のプログラム部分はJavaScriptですから、Javaをやっていれば理解は早いはずです。

・・・・・・・・

Javaの方でこの冬はゲームを作ります。
子どもから敵キャラのアイデア画をもらっているんで。
来年仕事が始まったら子どもにやらせます。

・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・

久しぶりの韓国語日記

・・・・・・

연수로 바빴기 때문, 10월 하순으로부터 피아노의 연습을 하지 않고 있다.
ヨンスロ パッパギ ッデムン シウォル ハスンウロブト ピアノウィ ヨンスブル ハジ アンコ イッタ
연수로・・・研修で
바빴기・・・忙しい
때문,・・・ため
10월・・・10月
하순으로부터・・・下旬から
피아노의・・・ピアノの
연습을・・・練習を
하지・・・する
않고・・・ない
있다.・・・だった

나는 지금까지 악보를 보아서 연주하지 않았다.
ナヌン チグムッカジ アクボルル ボアソ ヨンチュハジ アンナッタ
나는・・・私は
지금까지・・・今まで
악보를・・・楽譜を
보아서・・・見て
연주하지・・・演奏をし
않았다. ・・・なかった

손의 버릇으로 피아노를 연주하는 적이 많았다.
ソヌィ ボルスロ ピアノルル ヨンチュハヌン チョギ マンナダ
손의・・・手の
버릇으로・・・癖で
피아노를・・・ピアノを
연주하는・・・演奏する
적이・・・多少
많았다.・・・多かった

오늘부터는, 악보를 보아서 즉석으로 번역하는 기술을 습득하고 싶다.
オヌルブトヌン アクボルル ボアソ チュクソクロ ボニヨクハヌン キスルル スブトゥクハゴ シプタ
오늘・・・今日
부터・・・から
는,・・・は
악보를・・・楽譜を
보아서・・・見て
즉석으로・・・即席で
번역하는・・・翻訳する
기술을・・・技術を
습득하고・・・習得する
싶다.・・・したい

・・・・・・・・・
・・・・・・・・・

音楽の演奏には二通りあるような気がします。
全く暗譜してしまうという技術と、
初見で弾くという技術。

自分は、今まで、キーボードでも、ベースでも、ギターでも完全に暗譜してから手の癖にして弾いていたことが多い。
というのも、バンドでも、子どもの弾き歌いでもなんでも、楽譜を見てその場で弾くことができなかったというのもあるし、なにしろ、演奏の確実性を確保するために必ず暗譜するようにしていた。
バンドはもちろん、子どもを目の前にしての弾き歌いなんて、途中でトチれないから。
しかし、読譜力が無い状態で暗譜だけで演奏していると、覚えた曲しか弾けないという応用性の無いまずい状態になる。

そのため、今日は行徳のピアノの講師宅まで行って練習をする。
この冬はこれからしばらくピアノに熱を傾けます。

・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・

普段はほとんどTVドラマを観ない私ですが、これだけは今年ははまってしまいました。
だからって、また他のドラマを観ようとも思いません。
多分、このドラマが例外だったんだと思います。

でも、前にも書きましたが、色々な作品、世界観に触れたいという願望も一方であります。

今の自分の生活や価値観は、何か一つ大切なことに対してベクトルが発生した時点で没入するような感じなんです。ミーハーではないです。かといってオタクだとも思いません。

できれば厳選して、というのも時間は限られてますから。

よい、映画
よい、ドラマ
よい、アニメ
よい、マンガ
よい、演劇
よい、文学

に触れたいと思っています。
そのためには、空き時間を大事に使わないといけない。
今の過ごし方では、そういったことはできない。

marumonookite1
今年はマルモのおきてに泣かされました。
年々、涙もろくなってきています。
(この前も演劇本番の終了後に子どもの前で泣いてしまいました。)
marumonookite2
マルモの最終回はソフトエンディングですね。
ここはヤバいですよね。
私はこういうシーンは人とは観れません。
一人でこっそり観て、こっそりグジュグジュしてます。

双子が母親の元に帰るのがそもそものあるべきエンディングなんですけど、それだと高木護があまりにも孤独になってしまうんですよね。
大家の娘と付き合うっていうのもハッピーエンドとしては弱いじゃないですか。
marumonookite3
この場面も好き。
本来だったら、ムックはずっと喋れなくなってもいいんですね。
一度魂が抜けてしまったんですから。
ハードな文学作品のエンディングだったら、そうあるべきなんですね。
これもソフトエンディングです。
marumonookite4
私はムックが笹倉だということは全くの予想外でした。
ただの可愛いマスコット的な存在で犬が喋るのかと思いました。
marumoridance
このドラマは、現状では続編も出来なくはないんですよね。
2時間スペとかじゃなく、本当に続編をちゃんとやって欲しいという想いもあり、ここでスパっとベストな形で終わらせた方がいいという考えもあります。

人と人の絆を教えてくれました。


人と人の絆


A bond of person and person.


사람과 사람의 고삐
サラムゴア サラムウィ コッピ
사람과・・・人と
사람의・・・人の
고삐・・・絆


人和人的纽带
ren2 he2 ren2 de niu3 dai4

[BTS]Dセレクトプラチナスタイル【Beauty Station】

新しいゲームの進捗

game1121
ゲーム作ってました。
今朝2時から。

ウエポンを取ると武器の絵が変わる感じにしようとしています。
最初はファイヤー系の武器で、新たにウエポンを取るとアイス系の武器になります。

敵との属性とかもありーのでやってますが、いかんせん、武器の絵が変わるところで上手くいってないです。
取ったウエポンによって、itemstate == 1 とか、 itemstate == 2とかってやって、ウエポンの絵を分岐によって変えたいんですが、上手くいきません。

なんか、根本的なコードの書き方が違うような気がする。
一人だと行き詰ったときに大変ですよね。

・・・・・・・・・・・・

まあ、このゲームはあと画像だけ、ゲームのアルゴリズムはだいたい出来ている。
そう、そのウエポンの画像を変えるとこだけね。
これ前にも同じようなトラブルがあったんだけど。
もう一度、Javaの本を読んで基本から勉強しなおそう。

まだ分からないところや、忘れてるところがある気がする。

・・・・・・・・・・・・

昨日は昨日で、Perlを叩いていた。
人工無脳が自動学習する仕様で、連想ゲームをしてほしいのだが、連想ゲームにならない。

「聞く」という動詞を投げかけると、「斎藤さんに聞く」とかって帰ってくる。
聞くだから、耳とか、音楽とか、話しというような単語を覚えて欲しいのだが、「斎藤さんに聞く」を品詞分解しても、斎藤と聞くしかなくて、斎藤で学習しても連想ゲームとしては意味が無いんですよね。

何か聞く?
とたずねられて、
斎藤ですか?
と答えられても困るんです。

・・・・・・・・・・・・

ゲーム作りも人工無脳もかなりのゆっくりペースでやっています。
仕事に忙殺されての制作なので。

それにしても、プログラミングのことが、コンピュータのことが大分わかってきましたよ。
2種類の言語をやるってのがいいですね。
横断的に理解することができる。
多分、C言語で組んだ経験は一度もないけれど、今だったら案外簡単にできるかもしれない。

・・・・・・・・・・・・


コンピュータ1つを作る過程で人間が直接関わることの多さを考え­ると、そうそう、ロボットだけで自立はできない。
さまざまな鉱物­の掘削や加工、組み立て、そして、電気の供給とか、その元の電気­を作るだとか、洗浄用の純水を用意するとか、人間が介在する場所­が多すぎる。
ロボットが人間並みになるということが大前提だし。­ロボットが高度な知能を持っているのであれば、反撃(不利益)を­被る可能性のあるような選択、つまり、人間に攻撃をしかけるよう­なことは戦略的にしないはず。


人工知能が人類を支配する。


Artificial intelligence governs human beings.


인공지능이 인류를 지배한다.
インゴンチヌンイ インリュルル ジベハンダ
인공지능이・・・人工知能が
인류를・・・人類を
지배한다.・・・支配する


人工智能支配人类。
ren2 gong1 zhi4 neng2 zhi1 pei1 ren2 lei4

精子生成プログラムサプリ「VIPSEED (ビップシード) 」(約1ヶ月分)【★★★精力サプリ!★★★生薬堂★★★】

今日のキアヌ3/キャラが弾を飛ばす仕様完成/ゼネコン・マリコン系の株

kianu1016
今日のキアヌ。
この人は色んな困難を抱えて生きているということが最近分かりました。
自ら孤独を選んでいるのでしょうか。

パパラれている写真がたくさん出回っていますが、ニューヨークのソーホーの公園に普通にいるみたいなんですが、だったら普通に写真撮れるんじゃないでしょうか。

こういう世捨て人みたいなセレブって、やはり萌えます。

ピラセタム Piracetam60錠 2箱【アイドラッグストアー】

昨日は疲労のせいか、モチベーションがダウン。
のため、ピラセタム(Nootropil)と、イチョウ葉エキス、DHA、レシチン、ニンニン卵黄を服用。

効きました。
今日、深夜1:30に起床。
原発のドキュメント番組を観てから、Net.beansを立ち上げる。

モチベーションが高く、頭の回転も速くなっていました。

ゲームの改良も成功。

キャラクターが弾を発射できるようにしたのですが、弾が敵に当たらずに通過してしまいます。
↓↓以前の当たり判定コード(失敗版)
if ((int)wepon.getX() == (int)teki.getX() && (int)wepon.getY() == (int)teki.getY()) {

↑これだと、ピッタリ同じ位置でないと判定しないんです。
なので、失敗。

if ((int)wepon.getX() + 64 > (int)teki.getX() && (int)wepon.getX() < (int)teki.getX() + 64 &&
(int)wepon.getY() + 64 > (int)teki.getY() && (int)wepon.getX() < (int)teki.getY() + 64){

↑↑このコードに替えてからしっかり反応するようになりました。
当たり判定に幅を持たせたのです。

ついに、ついに、これで、新しいバージョンのゲームも作れます。
ファミコンの魔界村チックなゲーム。
前々から作りたいと思っていた。

これから少しずつ作っていきます。
自機、敵、アイテム、背景といった画像を作り(これに一番時間がかかる)、効果音を作成もしくは、フリー音源から探し、そうやって、ようやくゲームが出来るわけです。

fc
アプレットでファミコン。
一つずつ達成していきます。

ハットリくん、チャレンジャー、ゼルダ、ロックマン、ファンタジーゾーン、ツインビー、ドラクエ、・・・・こんなゲーム、あんなゲーム、作りたい作りたい。
オリジナルのゲーム。
遅滞しないでサクサク動くゲーム。

・・・・・・・・・・・

それにしてもピラセタムは効きます。

11月の研修まで毎日脳ドープし続けてみようかな。
見違えるように良い結果が得られるかもしれない。

ヒデルギンとかピンポセジンはどうなんだろうか。
効くのかな。

・・・・・・・・・・・

数年前に比べてプログラムをするということに対するハードルが低くなってきた。
自分の言語に対する意識が変わってきた。
数年前は人が書いたコードなんかを見ているとオゲってなったものだったけど、今は文法理解をすることができる。
大きな進歩だ。
図解でわかる Javaのすべて―ネット時代のプログラミング図解でわかる Javaのすべて―ネット時代のプログラミング
(2000/09)
山下 関哉

商品詳細を見る

カナダのワーホリにこの本を持っていった記憶があるけど、当時は本当に基本的なことしか分からなかった。
結局、実際に自分の手でゲームを作って、改造して、資格の勉強もして、本も読んで、それでようやく今になって分かり始めたような感じだ。

今は上から俯瞰するような感じでソースコードを見ることができる。
大きな進歩だ。

i-riosu
イーリオスというブラウザゲームを作っている人がいる。
これは、もう本当にファミコンの再現みたいな感じ。

しかも、ダウンロードではなく、ブラウザというのがスゴイ。
このサクサクと停滞しないで動く感じは称賛ものですよ。

私もこのレベルを目指したいです。
そして、・・・職場の子供にやらせて感動させたいと思います。

技術への尊敬。そんな感じです。

http://www.tansio.net/game/ilios/game.html
イーリオスのページ

・・・・・・・・・・・・

先日の研修では、自分の数年先輩の人が主役で、それで、褒められていました。
羨ましいです。
それで、たくさん褒められたものだから、なんかわかんないんだけど、私に色々指導しようとしてくるんです。
辞めてください。
まだ私の敷地に土足で入ることは許してませんよ。
直属の先輩でも上司でもないのに。

来月の研修では、自分がそんじょそこらじゃないところを最高に発揮していきたいと思います。
最高の自分で臨みます。
完全・完璧に150%の準備で臨みます。
緊張も出来るだけしないでいきます。
ましてや、研修中に手がガクガク震えているなんてあり得ません。
平静で、落ち着いて、堂々と、風格に満ちて、そして、的確に、明るく、魅力的に。

200%成功させます。
自分への約束。

hudoutetora1016
不動テトラ

この株価はいつ上がるのでしょうか。
現在株価は170円。
投資家の評価によると、この会社の株価は300円とも500円とも上昇するはずだというのです。

私の儲けは、今のところ11万円。
取得原価が115円でした。
つまり、55円の評価益×2000株で11万円。

もし、515円にまで上昇したら、
400円×2000株で、80万円設けられる計算になります。

kasima1016
大手ゼネコン、鹿島。
現在この株では5万円の評価益をだしています。

wakatikukensetu1016

五洋、東洋、若築、東亜+不動テトラといったマリコン5社が今後伸びると予想されています。
若築建設もずっと伸びなかったのですが、先日、大きく伸び始めました。
今後に期待です。
現在、-9000円程度の評価損になっています。

・・・・・・・・・・・・・・・・・

まっとうな就職をするのが遅かった私にとって、株での成功というのは非常に大きな助けになっています。
児童福祉施設で勤務していた4年間を除いて、ほとんど貯金と言う貯金が出来た期間がなかったのです。
24歳とかで一般企業に就職した人はもう、マンションを買えるぐらい貯金がたまっているはずなんですが、(と思うよ)、私はあまり貯金がたまってないんです。
そこで、勉強して、株に詳しくなって、儲けて来る自分の人生に必要な費用に備えたいんです。


私は勉強して株の知識を増やす。


I study and increase stock knowledge.


나는 공부해서 주식의 지식을 늘린다.
ナヌン コンブヘッソ チュシクウィ チシクル ヌルリンダ
나는・・・私は
공부해서・・・勉強して
주식의・・・株の
지식을・・・知識を
늘린다.・・・増やす


我学习加股票的知识。
股票 gu3 piao4・・・株
wo3 xue2 xi2 zeng1 jia1 gu3 piao4 de zhi1 shi2

ゲームの新仕様 キャラクターが弾を発射

game1003
かなり前に作ったこのゲーム。
スーパーマリオみたいに上から敵を踏みつけると倒せる仕組みだったんだけど、飛び道具をつけ足すことにした。
飛び道具のアルゴリズムが分からなかったんだけど、プレーヤーインスタンスの応用で、ボタンを押すと新しいインスタンスをプレーヤーの現在地に発生することにした。
弾はとりあえずキュウリの画像を流用する。

Bボタンを押すと、キュウリがキャラがいた場所に発生する。
しかし、そのまま動かない。
この状態で、弾に重力をかけて地面に落ちるようにすると、メトロイドの爆弾のアルゴリズムになる。
もちろん、数秒したら爆発するようにしないといけない。

これでは弾にならないので、キャラが向いている方向に飛ばすことにする。
しかし、これでも問題が発生する。
キャラが右を向いているときは右に弾が飛ぶのだが、キャラが左を向くと弾も左に方向転換してしまう。

これじゃヤムチャの操気弾だ。

game10032
そこで、ボタンを1回押したらその弾はそのまま飛んで行ってもらうことにした。
これでヤムチャの操気弾状態は解消した。

さて、そこでもうひとつの問題。
敵キャラとの当たり判定だ。
弾なんだから敵インスタンスと当たったと判定して、敵を消さなきゃいけない。

なんだが、うまく敵を消してくれない。
ここら辺をなんとか改良しないと次に進まない。

しかし、20数年前のファミコンクオリティのゲームは出来つつある。
後は時間の問題だ。

前回作ったアクションゲームは、↑のゲームに比べて画面遅滞が酷いんです。
↑のゲームは比較的サクサク動くと思います。
→にもあります。スーパートレックブラザーズです。
ジャンプすると足元が見えなくなるという失敗もしてます。
面クリアの時の画面の切り替わりの遅さも問題です。
しかしゲームの速度では問題はありません。


↑これはアーケード版ですね。
このぐらいのゲームを作ってブラウザ上で動かしたい。

ホント。

あと一歩なんですよね。
初代スーパーマリオとはまだまだ行きませんが、その前のマリオブラザーズぐらいのクオリティの物はできそうです。
ブラウザで、Javaで、動くゲームを作りたいです。

・・・・・・・・・・・・・・・・

昨日は数時間かけて上の仕様を完成させました。
これから完成させたい仕様は。

壊れるブロック。
動くフロア。
持ちあがるブロック。

ここらへんをクリアするとスーパーマリオが出来るようになります。
ブラウザに自作マリオを載せたいです。

・・・・・・・・・・・・・・・・

ミシンで小物を作る予定だったんだけど、はぎれを手に入れるのを忘れた。
職場にあるだろうか。
地味なんじゃなくて、色が明るいものが欲しい。
100均で買ったのは茶色っていうか朽ち葉色っていうんですか。
凄いみすぼらしいんで、子ども向けじゃないんですね。

成功率98.5%! 飲むだけカンタンダイエット!! 【ノーストレスダイエット】(もも倶楽部)【もも倶楽部】

アクション格闘RPG 一応完成 遊んでみてください/ベースの練習

game810
ゲーム画面へのリンク
↑↑クリックするとゲーム画面になります。

ENTERを押してもゲームが始まらない場合は、ゲーム画面を一度クリックしてからENTERを押してください。

Bボタンかスペースキーで攻撃します。
移動中の攻撃も可能です。
ちなみに、移動しながら攻撃するとダッシュになります。

敵を倒したり、コインを取ったりすると経験値が上がります。
経験値が一定値を超えるとレベルアップします。

敵の強さは面が進むごとに強くなります。
サメみたいな敵はレベルが上がらないと倒せません。

プレイした感想やコメントもいただけるとありがたいです。

・・・・・・・・・

今日も早朝3:00から改良していましたが、ボスはボスだけの面にした方が画面がサクサク動くみたいです。

・・・・・・・・・

一応、ゲームは完成ということにします。
これ以上作る時間はこの夏にはなさそうです。

旅行もありますし。
仕事もあります。

・・・・・・・・・

ドラクエ的なRPGを作ってみたいですね。
また、勉強することもたくさんありますが。

昨日は2時間ほどベースを弾いていましたよ。

この曲なんですが。

ベースって弾いてると、人差し指の第一関節が限りなく痛くなってきますね。
痛いです。

また、練習したいです。↑の曲は結構簡単にマスターできそうです。
【美心】熊野筆 化粧ブラシ5本セット!最高級の天然原毛をたっぷりと使用しました。【美心生活 stmx (美容・健康・ダイエット・生活用品総合ショッピングサイト)】