2014年1月13日月曜日

JavaScriptでCプリプロセッサを使用する

「ハイパフォーマンスJavaScript」の本にも書かれているのですが、JavaScriptでCプリプロセッサを使用するといろいろと便利です。


一つのソースファイルでC言語とJavaScriptの両方で動くものも作れます。
写真をたくさん表示するページなど、表示オブジェクトの動きの多いページを作るときは座標の計算をC言語でやれば、デバッグが早くて、テストコードも簡単に自動化できて便利です。

さらに、googleドライブを使うと、自分の使うPCやスマホでデータをすべて同期できるので、電車の中とかでも自分のソースがみれて便利。

---------------
#ifndef JAVASCRIPT
#include<stdio.h>
#ifdef _WIN32
#include<windows.h>
#endif
#ifdef unix
#include<unistd.h>
#endif
#endif /* JAVASCRIPT */

#ifdef JAVASCRIPT
#define int var
#else
#define null 0
#endif

#ifdef JAVASCRIPT
function print(name)
#else
void print(char* name)
#endif
{
#ifdef JAVASCRIPT
if(name==null)return;
$("#body").append(name+"<br/>");
#else
printf("%s\n",name?name:"null");
#endif
}

#ifdef JAVASCRIPT
function mysleep(ms)
#else
void mysleep(int ms)
#endif
{
#ifndef JAVASCRIPT
#ifdef _WIN32
Sleep(ms);
#endif
#endif
}

//
//
//

int MYEVENTNO_ONKEYDOWN=1;

int MYKEYCODE_RIGHT=37;
int MYKEYCODE_LEFT=39;
int MYKEYCODE_UP=38;
int MYKEYCODE_DOWN=40;

int event_no=0;
int event_param1=0;
int event_param2=0;

int a_x=50;
int a_y=50;



//
//
//
#ifdef JAVASCRIPT
$(function(){
oninit();
main();
});
#endif

//
//
//

#ifdef JAVASCRIPT
function cursor_init()
#else
void cursor_init()
#endif
{
a_x=50;
a_y=50;
}

#ifdef JAVASCRIPT
function cursor_update()
#else
void cursor_update()
#endif
{
if(event_param1==MYKEYCODE_LEFT){
a_x+=50;
if(a_x>500)a_x=500;
}
if(event_param1==MYKEYCODE_RIGHT){
a_x-=50;
if(a_x<50)a_x=50;
}
if(event_param1==MYKEYCODE_DOWN){
a_y+=50;
if(a_y>300)a_y=300;
}
if(event_param1==MYKEYCODE_UP){
a_y-=50;
if(a_y<50)a_y=50;
}
}

//
//
//

#ifdef JAVASCRIPT
function view_init()
#else
void view_init()
#endif
{
//print("view_init");
#ifdef JAVASCRIPT
$("#body").append("<div id=\"tag1\"></div>");
$("#tag1").css({
position:"absolute",
overflow:"hidden",
border:"solid",
width:"300px",
height: "300px",
left: ""+50+"px",
top: ""+50+"px",
});
$("#body").keydown(function(evt){ event_no=MYEVENTNO_ONKEYDOWN; event_param1=evt.keyCode;});
#endif
}

#ifdef JAVASCRIPT
function view2_init()
#else
void view2_init()
#endif
{
//print("view2_init");
#ifdef JAVASCRIPT
$("#tag1").append("<div id=\"tag2\"></div>");
$("#tag2").css({
position:"absolute",
border:"solid",
width:"50px",
height: "50px",
left: ""+a_x+"px",
top: ""+a_y+"px",
});
$("#body").keydown(function(evt){ event_no=MYEVENTNO_ONKEYDOWN; event_param1=evt.keyCode;});
#endif
}



#ifdef JAVASCRIPT
function view2_update()
#else
void view2_update()
#endif
{
//print("view2_update");
#ifdef JAVASCRIPT
$("#tag2").animate({
left: ""+a_x+"px",
top : ""+a_y+"px",
},200);
#endif
}

//
//
//

#ifdef JAVASCRIPT
function oninit()
#else
void oninit()
#endif
{
//print("oninit");
cursor_init();
view_init();
view2_init();
}

#ifdef JAVASCRIPT
function onkeydown()
#else
void onkeydown()
#endif
{
//print("onkeydown");
cursor_update();
view2_update();
}


#ifdef JAVASCRIPT
function main()
#else
int main(int argc,char* argv[])
#endif
{
int en=0;
//print("test");

#ifndef JAVASCRIPT
oninit();
#endif
while(event_no!=-1){
en=event_no;
event_no=0;
if(en==MYEVENTNO_ONKEYDOWN){
onkeydown();
}
#ifdef JAVASCRIPT
setTimeout(main,50);
break;
#else
mysleep(50);
#endif
}
return 0;
}





0 件のコメント:

コメントを投稿