自分の歌を録音することの大切さ/RPGのソース
たこやきレインボー「元気売りの少女〜浪花名歌五十選〜」MUSIC VIDEO
昨日もカラオケ、
ボイスレコーダーで自分の歌声を聞いて、なんども反省する。
自分、基本、、音痴だ。

慣れている曲は、上手いっぽく歌えるんだけど、
それ以外は、音程もリズムも外しまくり。
ボイスレコーダーで自分の声を聴けば聴くほど凹む。
この歌を練習している。
男性にとって、この歌を地声で歌うのは、ある意味「鬼」ではあります。
最初は原曲キーだと高くて歌えなかったが、最近は喰らいついていける。
転調後の最高音が厳しいけど、トレーニング用の歌として歌っている。
そのうち余裕で歌えるようにしたい。
足りないのは練習量。
そのうち、
本気で、
歌が上手いと言わせてやる!
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

JAVAのRPGのソースです。
参照:http://www.harukitchen.com/rpg_programming/17/17.htm
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.URL;
import java.util.Random;
public class Rpg17 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(キャラが次に着く位置)
float FrameTime;//1フレームあたりの時間(秒)
long waitTime;//現在時刻保存用
Image chara_image;//キャラチップ画像
MyClass My = new MyClass(168);//自分クラス宣言(チップNO 168)
//ここらへんで、主人公のキャラを生成しているっぽいなあ、っで、引数に渡している数字は描画に使うのかな。
//方向テーブル(上下左右の順)
int dir_x[] = {0,0,-1,+1};
int dir_y[] = {-1,+1,0,0};
//キーの状態(離している=0、押し続けている=1、押した瞬間=2)
int key_states[] = new int[5];//4方向(上=0,下=1,左=2,右=3)+Zキー=4
//マップデータ
int now_map_no;//現在のマップNO
short map_data[][] = new short[256][256];//256×256
int map_width,map_height;//マップの横幅、高さ(チップ数)
Image map_image;//マップチップ画像
//イベントデータ
int event_data[][] = new int[256][256];
//イベントテーブル
Event eventtbl[] = new Event[MAX_EVENT_TABLE];
int event_num;//そのマップでのイベントの個数
//ゲーム進行スイッチ
boolean game_switch[] = new boolean[128];
//------------ゲーム管理フラグ-------------
//0=マップ移動(黒幕下がる)
//1=マップ移動(黒幕上がる)
//2=イベント中
//3=会話イベント
//4=文字が流れている途中
//7=デバッグフラグ
//8=テーブル更新予約フラグ
//9=ダイアログ中
//10=スクリプトスキップ中
//11=イベント強制移動中
//12=主人公強制移動中
//ここに敵のイベントフラグも追加する
boolean game_flags[] = new boolean[16];
//------------ゲーム管理ウェイト-----------
//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(42,true), //木の壁
};
//マップデータ構造
MapFile mapfiles[] = {
new MapFile(1,"最終決戦",64,64),
new MapFile(2,"世界フィールド",64,64),
new MapFile(3,"テッペの街",64,32),
new MapFile(60,"サンプル草原",20,15),
};
final int MAXMAPNUM = 10;//マップの個数
//初期化
//ここからようやく、
アプレットが始まる感じ。
public void init(){
System.out.println("init()");
int i;
Dimension d = getSize();
MediaTracker mediaT = new MediaTracker(this);
//ボール画像ロード
chara_image = getImage(getDocumentBase(),"chara_chip.gif");
mediaT.addImage(chara_image,0);
//マップチップ画像ロード
map_image = getImage(getDocumentBase(),"map_chip.gif");
mediaT.addImage(map_image,0);
//ロード待ち
try{
mediaT.waitForAll();
}catch(InterruptedException e){}
//イベントテーブル初期化
for(i=0;i
}
//マップデータロード
readMapData(8);
//主人公の初期座標
My.x = 5;
My.y = 5;
My.px = My.x*CHIP_SIZE;
My.py = My.y*CHIP_SIZE;
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
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();
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();
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
}
//------------イベントテーブル更新----------------
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;
//フレーム時間初期化(ロード時間が長いので)
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
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();
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);
if(eventtbl[no].gra >= 1){
eventtbl[no].type_of_event = 1;
}
//動作フラグ
str = Harulib.HaruSplit(sline,"<>",4);
if(str.equals("true")){
eventtbl[no].move_flag = true;
}else{
eventtbl[no].move_flag = false;
}
//移動タイプ
str = Harulib.HaruSplit(sline,"<>",5);
eventtbl[no].type_of_move = Integer.parseInt(str);
eventtbl[no].speed = 32;
//最大値保存
if(maxno < no){
maxno = no;
}
x=0;
y++;
}
}
is.close();
}catch(IOException e){}
//イベントの数(最大値)
event_num = maxno+1;
//KAKUHO_NO番目に入れる
eventtbl[KAKUHO_NO].move_flag = true;
eventtbl[KAKUHO_NO].type_of_event = 1;
}
さらに、この下にゲームの
実行処理が、
延々と続く。
ゲーム一つ作るのって、果てしなくエネルギーが要りますよ。
スポンサーサイト