ゲームや日記を公開中。 --- a blog about games, life. my handle is 'd_of_i'.
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
実際にXtalで簡単なゲームを作成しました。

ココから実行ファイル、全ソース付きでダウンロードできます。

実際のXtalで記述してあるソースを↓に張ります。
どういう風に記述するかの雰囲気が分かるはずです。


 // lib.p5の関数を暗黙的に使えるよう、globalオブジェクトにMix-in
 global.include(lib.p5);
 
 
 // 全体の流れを記述した関数
 main : fun(){
   init();
   size(640, 480);
   set_caption("THE PONG!");
   
   try{
     dotitle();
     doloop();
     doresult();
   }finally{
     uninit();
   }
 }
 
 // タイトル画面
 dotitle : fun(){
   count : 0;
   
   loop{
     clear(0.2, 0.2, 0.2);
 
     blend(ADD);
     color(0.1, 0.2, 0.4);
     text_size(50);
     
     count/5 .times{
       text("THE PONG", 320+math.random_range(-5,5), 160+math.random_range(-5,5), CENTER, CENTER);
     }
     
     if(count<500)
       count++;
     
     
     text_size(20);
     text("操作方法\n マウスでパッドを動かせます", 320, 300, CENTER, CENTER);
   
     if(mouse_pressed()){
       break;
     }
   }
 }
 
 // リザルト画面
 doresult : fun(){
   count : 0;
   
   loop{
     clear(0.2, 0.2, 0.2);
 
     blend(ADD);
     color(0.1, 0.2, 0.4);
     text_size(50);
     
     mes : scores[0]>scores[1] ? "WON!" : "LOST";
     count/5 .times{
       text(mes, 320+math.random_range(-5,5), 240+math.random_range(-5,5), CENTER, CENTER);
     }
     
     if(count<500)
       count++;
   
     if(mouse_pressed()){
       break;
     }
   }
 }
 
 // フィールドサイズ
 WORLD_SIZE : 40;
 
 // 弾
 Ball : class{
   @x : 0; 
   @y : 0;
   @dx : 0;
   @dy : 0;
   @dead : false;
   @z : 1;
   
   dead : method{ return @dead; }
   
   initialize : method(x, y, z:1){
     @x = x;
     @y = y;
     @dx = math.random_range(-1, 1);
     @dy = math.random_range(-1, 1);
     @z = z;
   }
   
   update : method(){
   
     if(@z == 2){
       @x += @dx;
       @y += @dy;
 
       @dy += 0.002;
     }
     
     @z -= 0.2;
     if(@z<2){
       @z = 2;
     }
     
     if(@x>WORLD_SIZE || @x<-WORLD_SIZE){
       @dx = -@dx;
     }
     
     if(@y<-WORLD_SIZE){
       @dead = true;
       scores[0] += 1;
     }
     
     if(@y>WORLD_SIZE){
       @dead = true;
       scores[1] += 1;
     }
   }
   
   draw : method(){
     color(0.2, 0.2, 0.2);
     ellipse(@x, @y, 2, 2);
     push();
     color(0.9, 0.9, 0.99);
     translate(0, 0, @z);
     ellipse(@x, @y, 2, 2);
     pop();
   }
   
   hit_test : method(other){
     diffx : @x-other.x;
     diffy : @y-other.y;
     diffr : 10-2;
     if(diffx*diffx+diffy*diffy < diffr*diffr){
       @dx += diffx*0.1;
       @dy += diffy*0.1;
     }
   }
 }
 
 // 弾のジェネレーター
 // 引数nの数ほど繰り返す
 ball_gene : fun(n){
   return fiber{
     for(i:0; i<n; ++i){
       yield Ball(math.random_range(-5, 5), math.random_range(-5, 5), math.random_range(5, 300));
     }
   }
 }
 
 // 弾ジェネレータを300回実行し配列にして変数ballsに格納
 balls : ball_gene(300).to_a();
 
 // それぞれのスコア
 scores : [0, 0];
 
 // 弾を打ち返すヤツ
 Pad : class{
   @x : 0;
   @dx : 0;
   @y : 0;
   @cont;
   
   x : @x;
   y : @y;
   
   initialize : method(x, y, cont){
     @x = x;
     @y = y;
     @dx = math.random_range(-3, 3);
     @cont = cont;
   }
   
   update : method{
     @x += @dx;
     
     if(@cont){
       if(math.random()<0.1){
         @dx = math.random_range(-3, 3);
       }
       
       if(@x>WORLD_SIZE){
         @x = WORLD_SIZE;
         @dx = -@dx;
       }
       
       if(@x<-WORLD_SIZE){
         @x = -WORLD_SIZE;
         @dx = -@dx;
       }
     }else{
       mx, my : mouse_pos();
       @x = (mx/640)*2-1 * WORLD_SIZE;
     }
   }
   
   draw : method{
     color(0.2, 0.2, 0.2);
     ellipse(@x, @y, 10, 10);
     push();
     color(0.9, 0.5, 0.5);
     translate(0, 0, 2);
     ellipse(@x, @y, 10, 10);
     pop();
   }
 }
 
 // wow!
 pads : [
   Pad(0, -WORLD_SIZE, true),  // Player
   Pad(0, WORLD_SIZE, false), // Enemy
 ];
 
 // ゲームのループ
 doloop : fun(){
   rot : 0;
   count : 0;
   
   loop{
     clear(0.2, 0.2, 0.2);
     
     blend(ALPHA);
     text_size(20);
     text("あなたの点 "+scores[0].to_s, 0, 0);
     text("むこうの点 "+scores[1].to_s, 0, 20);
 
     text("FPS "+fps().to_s, 640, 0, CORNER2);
     
     sc : 5;
     scale(sc, sc, sc);
     translate(320/sc, 240/sc);
     
     count++;
     if(count>100 && count<150 || count>450 && count<500){
       rot += 0.01;
     }
     
     rotate_x(rot);
     
     color(1, 1, 1);
     
     push();
       
     blend(ADD);
     stroke_weight(2);
     color(0.3, 0.4, 0.6);
     
     text_size(20);
     10.times{
       color(math.random_range(0, 1), math.random_range(0, 1), math.random_range(0, 1));
       text("PONG", +math.random_range(-2,2), +math.random_range(-2,2), CENTER, CENTER);
     }
     
     color(0.2, 0.2, 0.4);
     
     begin(LINES);
     for(i:-WORLD_SIZE; i<WORLD_SIZE; i++){
       vertex(i, -WORLD_SIZE);
       vertex(i, WORLD_SIZE);
       vertex(-WORLD_SIZE, i);
       vertex(WORLD_SIZE, i);
     }
     end();
     
     zmask(true);
     ztest(true);
     blend();
     
     for(i:0; i<balls.length; ){
       it : balls[i];
       
       it.hit_test(pads[0]);
       it.hit_test(pads[1]);
       
       it.update();
       it.draw();
       
       if(it.dead){
         balls[i], balls[balls.length-1] = balls[balls.length-1], balls[i];
         balls.pop_back();
       }else{
         ++i;
       }
     }
     
     pads.each{ |pad|
       pad.update();
       pad.draw();
     }
     
     pop();
     
     if(balls.length==0){
       return;
     }
   }
 }
 
 // 開始!
 main();
 
スポンサーサイト





コメント
1ゲト
2006/08/12(土) 17:40 | URL | 11 #-[ 編集]
立体的でいいですね。
2006/08/13(日) 15:47 | URL | #-[ 編集]
やってみたけど・・・むずいΣ(゚д゚;
2006/08/14(月) 17:32 | URL | 魚 #1.bfey3U[ 編集]
続報!!山本圭一は【小林麻耶アナ】とも関係を持っていた!!
なんと女子アナ界を代表する美女【小林麻耶アナ】
とも関係を持っていたという…!!
【小林麻耶アナ】が泣きながら番組で訴えたため、
この事実が発覚したようです。
山本の電撃復帰の話も浮上しているようですが、
さすがにまだ早いような気がします…。
2006/08/15(火) 14:57 | URL | 続報!!山本圭一は【小林麻耶ア #4z42r8S6[ 編集]
自分でゲームが作れるのってすごいなー
と思いました。
僕も勉強してみたいと思います。
2006/08/24(木) 12:38 | URL | toyo #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
:
 
Trackback
この記事のトラックバックURL
http://ishi.blog2.fc2.com/tb.php/191-0335b8cf
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
最新のゲーム情報を随時配信!
2006/08/12(土) 07:04:22 | G-Plus
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。