SDL:キーの同時入力

NHKで「幻解!超常ファイル」という番組をやっていた。
以前からよくあるオカルト現象に科学のメスを入れるという番組だ。
番組の中でオッカムのカミソリという言葉が出てきた。
物事を説明するのに必要以上に多くの仮定をおくべきでないという考え方だ。
例えばwikipediaでは物体の運動を例にとり、

「外力が加わらない物体は神が等速でまっすぐに動かす」

という説明を例に挙げている。
「神」は現象の説明に不要なので切り落とすのがよいだろう、というのがオッカムのカミソリの考え方だ。
この番組ではオッカムのカミソリの考え方を紹介し、水晶ドクロが超古代文明等に由来するという仮定を否定していた。
超古代文明では説明になっていない、とのこと。

でも、オッカムのカミソリは真偽判定には使えないんだよ。
上の説明で言えば、オッカムのカミソリは別に神の存在を否定しているわけではない。
超古代文明でも説明になってるじゃないか。

超古代文明に由来する可能性もあるけど、そうでない可能性の方が高そうだよね、くらいのところを着地点にすればよいのに。
この手の番組はインパクトを重視するのかはっきりとした結論を出したがる。

結構面白かったけど。文句つけたけど僕は民放よりもNHKの方が好きだ。
そういえば最近、徳川埋蔵金とかUFOとか心霊ものとかやらないな。観たいのに。
Wikipediaでオーパーツを調べていたらインディー・ジョーンズ観たくなってきちゃったよ。

////////////////////////////////////

前回キー入力で画像を動かすことに成功したが、キーの同時押しが出来なかった。
これはシューティングゲームでは致命的である。
斜め移動が出来ないからだ。

こういう感じにすれば同時押しに対応できる。

Uint8 *keys = SDL_GetKeyState(NULL);
if(keys[SDLK_UP]==SDL_PRESSED && keys[SDLK_RIGHT]==SDL_PRESSED)
{
rect2.x++;
rect2.y--;
}


実際に斜め移動出来ることを確認した。
ジャジャガッチ | Linux | 21:18 | comments(0) | trackbacks(0) |

SDL:画像をキー入力で移動する

昨日は両親が孫の顔を見にはるばるやってきてくれました。
孫を持つというのはどういう気持ちなのだろう。
妻も人生の先輩からの言葉に元気をもらったようでよかった。
高速道路のコンビニにも連れて行ってあげました。

////////////////////////////////////////
さて、SDL。
画像をキー入力で動かしてみた。

#include <stdio.h>
#include <SDL/SDL.h>
#define WIDTH 512
#define HEIGHT 512

int main()
{
SDL_Surface *gScreenSurface;
SDL_Event ev;

SDL_Init(SDL_INIT_VIDEO);
//SDL_WM_SetCaption("Hello DSL!",NULL);;

gScreenSurface = SDL_SetVideoMode(WIDTH,HEIGHT,24,SDL_SWSURFACE);

SDL_Surface *image = SDL_LoadBMP("test.bmp");
SDL_SetColorKey(image , SDL_SRCCOLORKEY , SDL_MapRGB(image->format,255,255,255));
//image = SDL_DisplayFormat(image);

SDL_Rect rect1,rect2,window_rect;
rect1.x = 0;
rect1.y = 0;
rect1.w = image->w;
rect1.h = image->h;
window_rect.w = WIDTH;
window_rect.h = HEIGHT;

rect2.x = 64;
rect2.y = 64;

SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect2);
SDL_Flip(gScreenSurface);

while(1)
{
SDL_PollEvent(&ev);
if(ev.type==SDL_QUIT) break;
else if(ev.type==SDL_KEYDOWN)
{
switch(ev.key.keysym.sym)
{
case SDLK_UP:
rect2.y--;
break;
case SDLK_DOWN:
rect2.y++;
break;
case SDLK_RIGHT:
rect2.x++;
break;
case SDLK_LEFT:
rect2.x--;
break;
}


}
SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect2);
//rect2.x += 1;
SDL_Flip(gScreenSurface);
SDL_FillRect(gScreenSurface , &window_rect , SDL_MapRGB(gScreenSurface->format , 0, 0, 0));
}

SDL_Quit();
SDL_FreeSurface(image);
return 0;
}

ただ、同時押しすると移動が止まってしまったりと動きがぎこちない。
どうやって改善すればいいんだろう?

今のところエディタはvi onlyでやってるけどインテリセンスが使えないのが厳しい。
ジャジャガッチ | Linux | 12:01 | comments(0) | trackbacks(0) |

SDL:画像を移動する

この前深夜に妻に急に起こされた。
何事かと思えばうちのにゃんこが虫で遊んでいるらしいとのこと。
息子の世話で手が離せないようなので僕が様子を見にいくことに。
何だろうと思ったらムカデだった。
速攻で退治して経験値を得た。
ムカデを見ると、保育園のころ先生に昼寝中の布団にゲジゲジを落とされたことを思い出す。

/////////////////////
SDL。
今回は画像の移動。

#include <stdio.h>
#include <SDL/SDL.h>
#define WIDTH 512
#define HEIGHT 512

int main()
{
SDL_Surface *gScreenSurface;
SDL_Event ev;

SDL_Init(SDL_INIT_VIDEO);
//SDL_WM_SetCaption("Hello DSL!",NULL);;

gScreenSurface = SDL_SetVideoMode(WIDTH,HEIGHT,24,SDL_SWSURFACE);

SDL_Surface *image = SDL_LoadBMP("test.bmp");
SDL_SetColorKey(image , SDL_SRCCOLORKEY , SDL_MapRGB(image->format,255,255,255));
//image = SDL_DisplayFormat(image);

SDL_Rect rect1,rect2,window_rect;
rect1.x = 0;
rect1.y = 0;
rect1.w = image->w;
rect1.h = image->h;
window_rect.x = 0;
window_rect.y = 0;
window_rect.w = WIDTH;
window_rect.h = HEIGHT;

rect2.x = 64;
rect2.y = 64;

SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect2);
SDL_Flip(gScreenSurface);

while(1)
{
SDL_PollEvent(&ev);
if(ev.type==SDL_QUIT) break;

SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect2);
rect2.x += 1;
SDL_Flip(gScreenSurface);
SDL_FillRect(gScreenSurface , &window_rect , SDL_MapRGB(gScreenSurface->format , 0, 0, 0));
}

SDL_Quit();
SDL_FreeSurface(image);
return 0;
}

移動は次のコードで実現される。
while(1)
{
SDL_PollEvent(&ev);
if(ev.type==SDL_QUIT) break;

SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect2);
rect2.x += 1;
SDL_Flip(gScreenSurface);
SDL_FillRect(gScreenSurface , &window_rect , SDL_MapRGB(gScreenSurface->format , 0, 0, 0));

}

SDL_FillRectでウィンドウの塗りつぶしを行っている。
そうしないと残像が残ってしまう。↓
ジャジャガッチ | Linux | 11:12 | comments(0) | trackbacks(0) |

SDL:透過色を指定する

今日から連休。
育児で疲れている妻に少しでも栄養をとってもらおうと、肉じゃがやらほうれん草のおひたしやらみそ汁やら頑張って作った。
自分のためにはあまり料理をする気になれないが、妻と息子のためだと思うとやる気が出る。
学生時代は珍妙な料理を作ってたなあ。
カレーに納豆ぶち込んで一晩でカビさせたこともあった。

///////////////
さて、SDL。
今のままだと画像を表示した時に四角い枠が表示されてしまう。
透過色を指定することにしよう。

#include <stdio.h>
#include <SDL/SDL.h>

int main()
{
SDL_Surface *gScreenSurface;
SDL_Event ev;

SDL_Init(SDL_INIT_VIDEO);

gScreenSurface = SDL_SetVideoMode(300,200,24,SDL_SWSURFACE);

SDL_Surface *image = SDL_LoadBMP("test.bmp");
SDL_SetColorKey(image , SDL_SRCCOLORKEY , SDL_MapRGB(image->format,255,255,255));
//image = SDL_DisplayFormat(image);


SDL_Rect rect1,rect2;
rect1.x = 0;
rect1.y = 0;
rect1.w = image->w;
rect1.h = image->h;

rect2.x = 64;
rect2.y = 64;

SDL_Rect rect3;
rect3.x = 32;
rect3.y = 32;

SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect2);
SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect3);
SDL_Flip(gScreenSurface);

while(1)
{
SDL_PollEvent(&ev);
if(ev.type==SDL_QUIT) break;
}

SDL_Quit();
SDL_FreeSurface(image);
return 0;
}

透過色は
SDL_SetColorKey(image , SDL_SRCCOLORKEY , SDL_MapRGB(image->format,255,255,255));
で指定できる。
image = SDL_DisplayFormat(image);
を入れておかないと動きが遅くなったりするとかいう情報もあるけど今のところよくわからないのでコメントアウト。
そのうち詳しく調べることにしよう。

元の画像は
で、透過色を指定しないと
透過色を指定すると
となる。回りに少し白い部分が残っているように見えるが、これは僕の画像の作り方が悪かっただけで、白に近いが白ではない。

次は画像を動かすか。
ジャジャガッチ | Linux | 21:51 | comments(0) | trackbacks(0) |

SDLで画像表示

うちの最寄りのコンビニは高速道路PAのコンビニだという話は書いたかな?
妻のブログには書かれていたけど。

徒歩で行けるのだけど、普通のコンビニとは違ってお土産などが充実しているのが面白い。
しかも購入すると、お気をつけてー、と言ってくれる。何かうれしい。徒歩五分なんだけど。
イートインコーナーもあるのでいつか深夜に妻と二人でカップラーメンを食べることが僕の夢だ。

////////////////////////////////////////////////////
前回、真っ黒なウィンドウを表示することは出来たわけだが、それだけではつまらない。
画像を表示できないと始まらない。

bmp画像を表示してみた。

#include <stdio.h>
#include <SDL/SDL.h>

int main()
{
SDL_Surface *gScreenSurface;
SDL_Event ev;

SDL_Init(SDL_INIT_VIDEO);

gScreenSurface = SDL_SetVideoMode(300,200,24,SDL_SWSURFACE);

SDL_Surface *image = SDL_LoadBMP("test.bmp");
SDL_Rect rect1,rect2;
rect1.x = 64;
rect1.y = 64;
rect1.w = image->w;
rect1.h = image->h;

rect2.x = 64;
rect2.y = 64;


SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect2);
SDL_Flip(gScreenSurface);


while(1)
{
SDL_PollEvent(&ev);
if(ev.type==SDL_QUIT) break;
}

SDL_Quit();
SDL_FreeSurface(image);
return 0;
}

画像はSDL_Surfaceで扱えるらしい。
SDL_BlitSurfaceであるサーフェスを別のサーフェス上に転送出来るようだ。SDL_Flipでサーフェスをフリップして反映させるらしい。
rect1は転送元の情報、今回は128x128の画像を用意しており、切り取り範囲を指定できる。
転送先はwとhしか使われないらしい。これで表示位置を制御できる。
今回の場合、テスト画像は次のもの。
実行結果は
となる。

SDL_Rect rect3;
rect3.x = 0;
rect3.y = 0;
SDL_BlitSurface(image , &rect1 , gScreenSurface , &rect3);

を追記すると
となる。imageをポインタで渡しているのでこういうことは出来ないんじゃないかな、と思ったのだが。
ジャジャガッチ | Linux | 21:37 | comments(0) | trackbacks(0) |

SDLで最小のプログラム

今日は定時で帰ってきたのだが、帰ったら早速おむつがえ。
お、うんこしてるな、替えよう。
ふー、替えたぞ。ん、今度はおしっこか、替えよう。
ふー、替えたぞ。ん、またうんこか、替えよう。
ふー、替えたぞ。ん、またうんこか、替えよう。
ふー、替えたぞ。
こんな感じだった。

お風呂は僕の担当になりつつある。大分慣れたし、おむつがえと違ってイレギュラーな出来事(交換中におしっこしゃーみたいな)がないし、気持ちよさそうな顔がとてもかわいい。最初は緊張して嫌だったけど今は結構好きだ。

慣れてきたので今はLinuxをいじる余裕も多少はある。
中々楽しい毎日だ。
それもこれも頑張ってくれている妻のおかげだ。ありがとう。

/////////////////////////////////////////////////////
SDLでゲーム作り、統合開発環境を使わないだけでなく、エディタもvi縛りでやろうかな。
viエディタは非常にUNIX環境で非常に有名かつ独特なエディタで、これを使いこなせるととてもかっこいい。
初めて使う人は多分文字入力もエディタの終了も出来ない。

さて、早速SDLを使って最小のプログラムを作ってみた。
コンパイルは
g++ main.cpp -lSDL
で出来る。linuxでは静的ライブラリはlibxxx.aという名前が付けられる。
リンクするときは
-lxxx
というオプションを付ければよい。

#include <stdio.h>
#include <SDL/SDL.h>

int main()
{
SDL_Surface *gScreenSurface;
SDL_Event ev;

SDL_Init(SDL_INIT_VIDEO);

gScreenSurface = SDL_SetVideoMode(300,200,24,SDL_SWSURFACE);

while(1)
{
SDL_PollEvent(&ev);
if(ev.type==SDL_QUIT) break;
}

SDL_Quit();
return 0;
}

 
ジャジャガッチ | Linux | 21:00 | comments(0) | trackbacks(0) |

Linuxに再挑戦

予約していたゼノギアスの公式設定資料集が届いた。長らく絶版になっていた本。
内容は素晴らしい。
とても濃い内容で読み通すのはかなり時間がかかりそうだ。

あ、ダークソウルですが、クリアするのは無理でした。
出産前に何とかいけるかな、と思っていたのですが、間に合いませんでした。
終盤に入ったくらいまではいったと思うんだけど。
子供が産まれたのでそれどころではなくなったのでゲームは封印。

そういえば、夜は子供の夜泣きにも動じず爆睡している僕ですが、妻が僕を起こさないのは車通勤で事故を起こさないようにという配慮もあるらしいです。感謝。

/////////////////////////////////////
2年くらい前にubuntuをインストールして少しの間いじっていたが、結局飽きて放置していた。
最近再びいじる気力が沸いてきたのでCentOSをインストールして遊んでいる。

僕はこれまでWindowsをメインで使ってきたが、コマンドプロンプトを使うことが多いし、科学計算の世界ではWindowsよりもむしろLinuxをメインターゲットとして開発されているプログラムも多い。
Linuxも少しは使えなくてはいざというときに困ってしまうだろう。
学生時代、学校で使っていたのはVine Linuxだったが、元々あまり使いこなせていなかった上、記憶も風化している。

やはり何かやりたいことがないと上達は難しい。
僕がLinuxでやりたいことってなんだろう・・・、と考えてみると・・・、プログラム開発だ!
Linuxをメインターゲットとしているライブラリ等を使ったプログラム開発がしたい。

さて、何か自宅でいじるのに面白そうなものはないかな・・・、と探したところ、見つけたのがSimple DirectMedia Layer(SDL)だ。
手軽なゲーム開発ライブラリらしい。WindowsでいうところのDxLibと同じようなものか。
インストールは簡単で、
yum install SDL*
とするだけ。とりあえずサンプルプログラムは動いたので少しずついじろう。
開発には統合開発環境は使用しないという縛りプレイ。
シューティングゲームでも作ってみるか。
 
ジャジャガッチ | Linux | 14:24 | comments(0) | trackbacks(0) |

赤ちゃんが生まれた(2)

赤ちゃんのうんちは臭くないと言うが、本当だろうかと思って観察してみた。
ん?緑だ。
サザエ?ナメック星人?
確かに臭くない。

日にちがたつとうんちは黄色くなっていった。
最初は酢みたいなにおいで臭いと思ったが、今はそれほど気にならない。
においは日によって変わるのかもしれない。

今はおむつ替えも出来るようになったし、服も着せられるようになったし、お風呂にも入れられるようになった。
一番大変なのはお風呂だ。
でも大分慣れてきた。

あと、夜泣きで寝れないという話を聞くが、僕は爆睡だ。
赤ん坊が少しぐずると妻がすぐに目を覚まして対処してくれるため、僕は気が付かない。
申し訳ないので起こしてくれれば手伝うよ、と言ったのだが、自分でやったほうが早くてよいらしい。
おかげで特に睡眠不足にはなっていない。
代わりに起きている時には出来るだけおむつ替え等をするようにしている。

おむつ替えなども日々の上達が楽しい。
赤ん坊が泣きだす前に速やかに交換できると勝った!と思う。

とにかく、自分の子は可愛い。
ジャジャガッチ | その他 | 22:19 | comments(0) | trackbacks(0) |

赤ちゃん産まれた(1)

2週間ほど前に我が子が誕生しました。
僕は分娩室の前でうろうろしていたのですが、中からは妻の叫び声が・・・。
かと思えば楽しそうな談笑が・・・。
中で一体何が・・・、とどきどきしながら待っていました。

助産師さんの頭が出るよー、みたいな声の直後に、おぎゃーおぎゃー!と聞こえたので、え!?頭だけ出てる状態でも泣くの!?って思ったが、どうやらよその子だったらしい。

さらにはピーッ!という電子音。
え!?これ大丈夫な電子音なのか!?
談笑してるから大丈夫なんだろう・・・。

僕が混乱しているうちに無事に出産は終わり、分娩室に入ることに。
以外と普通の部屋だ。
写真撮ってもいいですよー、と言われたが突然だったのでカメラを持っていない。
っていうか分娩室で撮影していいのか・・・。
携帯電話で撮りますか?と言われまたびっくり。
携帯使っていいのか。

結局、携帯と助産師さんが持ってこられたカメラで撮ってもらいました。
妻よ、お疲れ様。そしてありがとう。

分娩室で二時間ほど付き添った後、帰宅。
産まれたその日は、見た目はそれほど可愛いと思えなかったが、自分の子という愛着でとても愛おしく思えた。

次の日に面会に行ったときは見た目も可愛く思えた。助産師さんに綺麗に洗ってもらったためだろうか。
今は見かけから何から可愛くてしょうがない。

僕は元々そんなに子どもが好きではないし、赤ん坊も全く可愛いとは思えなかったが、自分の子どもはとてつもなく可愛い。
自分でも驚きだ。
自分の子どもが産まれてから人の子どもも少し可愛く思えてきた。
自分の子が成長した姿を重ねるんだと思う。

 
ジャジャガッチ | その他 | 21:57 | comments(0) | trackbacks(0) |
1/1PAGES | |

04
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH