Mercurial > hg > old > magoroku_racing.bad
view Magoroku.cc @ 112:5106d8d12ded
Changing Magoroku.cc
author | Atuto SHIROMA <e095729@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 09 Jun 2011 14:59:24 +0900 |
parents | 7600cdfa8779 |
children | 8c96cadde050 |
line wrap: on
line source
#include "Magoroku.h" #include "SgoexCerium.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #include <time.h> #include <SDL.h> #include "SDL_opengl.h" //#include "object.h" #include "libps2.h" #include "tree_controll.h" #include "xml.h" #include "profile.h" #include "syokika.h" #include "sankaku.h" //#include "sgoex.h" #include "controler.h" #include "sound.h" #include <stdbool.h> #include "bom.h" #include "count2.h" #include "tokuten.h" #include "schedule.h" #include "tama.h" #include "debug.h" #include "trace.h" #include "LoadSprite.h" #include <SDL_mixer.h> #include "error.h" #include "matrix_calc.h" #include "Character.h" #include "Character_state.h" static int use_keybord = 0; // static int cdp[20] = { 16, 16, 16, 17, 18, 0 }; static int i; static int rswait = 0; static int cf = 0; static int cc = 0; static int test_mode = 0; static const char *test_object = "" ; //static SDL_Surface *screen; // static Uint32 background; // static char *pad_trace_file; extern void schedule(); extern void tokuten(); extern void padCheck(); extern void keybord(); static int gamesyokika(int gamef); static int game_pause(int); //static char *pad_trace_file; /** * runmode: * 0 - normal game * 1 - capture mode * program will capture all pad traces on a play and * dump it into a file * 2 - trace mode * program will run with a trace file which is generated * by capture-mode */ int runmode; SDL_Joystick *joy; const char *usr_help_str = "Usage: ./twice [-length data_length] [-count task_num]\n\ -length Number of data (default DATA_NUM (Func.h))\n\ -count Number of task (default 1)\n"; Viewer *droot; static int screen_w; static int screen_h; //ウィンドウのサイズとかを指定? MainLoopPtr Magoroku::init(Viewer *sgroot_, int w, int h) { screen_w = w; screen_h = h; droot = sgroot_; return droot; } Application * application() { return new Magoroku(); } static int opening(int gamef); static int dandy_closing(int gamef); static int dandy_main_loop(int gamef); static int dandy_main_init(int gamef); extern int init(TaskManager *manager, int argc, char *argv[]); extern void task_initialize(); static void TMend(TaskManager *manager); //class Application の中の virtual bool app_loop( return 1 だけの関数?) を継承 bool Magoroku::app_loop(Viewer *viewer){ // don't use allExecute return 0; }; //ゲームの分岐に使用 static int gamef = 0; /* ゲームの分岐。magoroku の schedule の処理と同等と考えてオッケーかな? */ HTaskPtr Magoroku::application_task(HTaskPtr next, Viewer* viewer){ // printf("gamef = %d\n",gamef); switch (gamef) { case 0: gamef= dandy_main_init(gamef); break; case 1: gamef= gamesyokika(gamef); break; case 2: gamef= opening(gamef); break; case 3: gamef= dandy_main_loop(gamef); break; case 4: gamef= dandy_closing(gamef); break; } return next; }; static void task_init() { } int TMmain(TaskManager *manager,int argc, char *argv[]) { for(int i = 1; i<argc ; i++) { if (strcmp(argv[i],"-t")) { test_mode=1; if (i+1<argc && argv[i+1]) { i++; test_object=argv[i]; } } } task_init(); task_initialize(); manager->set_TMend(TMend); return init(manager,argc, argv); } void TMend(TaskManager *manager) { printf("game end\n"); } static int light_sysswitch = 0; static int light_num = 4; /* static void LightSysSwitch(Viewer *sgroot) { if (light_sysswitch == 1) { sgroot->OnLightSysSwitch(); for (int i = 0; i < light_num; i++) { SceneGraphPtr light = sgroot->getLight(i); sgroot->OnLightSwitch(i); light->xyz[0] = screen_w / 2; light->xyz[1] = screen_h / 2; light->xyz[2] = -100; } } else if (light_sysswitch == 0) { sgroot->OffLightSysSwitch(); } } */ /* 初期化の処理 初期化成功で return 1 だから、次の処理にいくっぽい */ static int dandy_main_init(int gamef) { //Timeprof timeprof_move; //timeprof_move = timeprof_new(); dbg_init("/dev/stdout"); /** * timeprof があるんだけどね */ //xml file 読み込む droot->createFromXMLfile("xml/character.xml"); droot->createFromXMLfile("xml/font.xml"); droot->createFromXMLfile("xml/effect.xml"); droot->createFromXMLfile("xml/boss.xml"); LightSysSwitch(droot); init_sprite(0,0,0,0); __debug("syokikaが呼びだされました\n"); joy=SDL_JoystickOpen(0); if(!joy) { fprintf(stderr,"failed to open joystick 0\n"); use_keybord = 1; } /** * sound.c に移しました * 代わりに InitSdlMixer(void); を使います。 * まあ中身一緒なんだけどね */ /** if (Mix_OpenAudio(MIX_DEFAULT_FREQUENCY,MIX_DEFAULT_FORMAT,2,1024) < 0) { fprintf(stderr,"failed to initialize SDL_mixer.\n"); SDL_Quit(); exit(-1); } */ // SDL_mixer とかいろいろ初期化 // もし Init に失敗したら // 以後の Mixer 関連の関数を呼び出しても // 中では何も行われないとかいう小細工を入れました。 InitSdlMixer(); // 音楽ファイルの読み込み LoadSdlMixer(); // ボリューム調整 InitVolume(); // 音出しテスト PlaySdlMixer(-1, BGM); if(!(init_chara_list(1024))){ __debug("failed to init_chara_list\n"); } __debug("finished init_chara_list\n"); return 1; } //メインループ static int dandy_main_loop(int gamef) { if ((pad.l1 != 0) && (pad.r1 != 0) && (pad.l2 != 0) && (pad.r2 != 0)) { gamef = gamesyokika(gamef); } if (pad.se != 0) { gamef = 4; } flip(); //SDL_FillRect(screen, NULL, background); schedule(); enemyfaste = count; // timeprof_begin(timeprof_move); //Move(); //enemy move collision_detect(); outofwindow(); // timeprof_end(timeprof_move); state_update(); asteroidi = 0; //charpatern(); //bosguage(); if (jiki.bf == true) { Player(0); count++; PutSprite(count, jiki.x, jiki.y, jiki.ch); } Putbom(); tokuten(); count++; //PutSprite(count, 0, 960 - 96, 10); /*インフレゲージ */ count++; //PutSprite(count, 0, 0, 48); obj_draw(); gamef = game_pause(gamef); if (use_keybord) { keybord(); } else { padCheck(joy); } filpcount++; count = 0; return gamef; } static int dandy_closing(int gamef) { //_______________________________________________ // SDL_mixerの後始末 Mix_CloseAudio(); Mix_HaltMusic(); FreeSdlMixer() ; //_______________________________________________ return 0; } static int gamesyokika(int gamef) { laser_lv3[0].r = 62; laser_lv3[0].r = 62; for (i = 0; i < 3; i++) { tlv3[i].y = -1; } filpcount = 0; stage = 0; //for (i = 0; i < 300; i++) //enemy[i].f = false; jiki.zanki = 3; jiki.x = 60; jiki.y = 200; jiki.ch = 3; jiki.point = 0; jiki.bf = false; jiki.muteki = 120; enemycount = 0; lg.stg = 4096; pg.stg = 4096; infg.stg = 0; infg_level = 0; //kyeenemyno = -1; fastebos = 0; jiki.ccount = 99; p_extend = 200000; pad.up=0; pad.down=0; pad.right=0; pad.left=0; pad.st=0; pad.se=0; SoundStop(); SoundPlay(7); gamef = 2; flip(); return gamef; } static int opening(int gamef) { if(use_keybord == 1) { keybord(); } else { padCheck(joy); } count = 1; PutSprite(count, 700, 480, 53); // put `push start' string on screen. count++; PutSprite(count, 224, 776, 119); // put `super dandy' count++; // PutSprite(count, 200, 64, 190); // PutSpriteEx(count, 8192, 8192, 0); PutSpriteEx(190, 800, 264, 2, 2, 5); count++; PutSprite(count, 396, 432, 191); //PutSpriteEx(count, 8192, 8192, 0); count++; PutSprite(count, 640, 640, 192); //PutSpriteEx(count, 8192, 8192, 0); if (pad.st > 1) { jiki.bf = true; //CdPlay(1,&cdp[0],0); SoundStop(); SoundPlay(0); gamef = 3; pad.st = 1; } else if ((pad.se > 0) && (pad.st > 0)) { gamef = 2; } flip(); return gamef; } static int game_pause(int gamef) { gamef = 3; if (jiki.zanki != 0 && jiki.bf != false) { if (pad.se == 1) { //Mix_Pause(BGM); PauseSdlMixer(BGM); while(1){ if(use_keybord == 1) { keybord(); } else { padCheck(joy); } if(pad.st == 0) continue; pad.up=0; pad.down=0; pad.right=0; pad.left=0; pad.se=0; pad.st=0; //Mix_Resume(BGM); ResumeSdlMixer(BGM); break; } } } if (jiki.zanki == 0) { // RECT *recp; if ((jiki.ccount > 0) && (cf == 0)) { cf = 1; count++; //cgcg(2); PutSprite(count, 480, 480, 110); count++; //cgcg(1); } if ((jiki.ccount > 0) && (cf == 1)) { //スタートを押すまでココで止まり続けるから、これは最初のスタート画面か? while (1) { if (pad.st > 0) { cf = 0; jiki.ccount--; jiki.zanki = 3; enemycount++; cc = 0; for (i = 0; i < 4; i++) { clear_result[i] = 0; } goto f; } cc++; if (29 - cc / 60 < 20) { cc = 0; cf = 3; break; } SDL_Delay(100); PutSprite(1, 640, 640, 29 - CC / 60); // PutSpriteEx(1, 409 * ((cc % 60) + 1), 409 * ((cc % 60) + 1), 0); padCheck(joy); flip(); // THIS IS NOT CORRECT } } IF (rswait > 60 * 6) { cf = 0; rswait = 0; gamef = gamesyokika(gamef); } rswait++; count++; //cgcg(1); PutSprite(1, 480, 480, 19); return gamef; } if (jiki.bf == false) { f: if (rswait < 80) { rswait++; return gamef; } else { rswait = 0; jiki.x = 60; jiki.y = 200; jiki.bf = true; pad.st = 0; lg.stg = 4096; pg.stg = 4096; laser_lv3[0].r = 62; tlv3[0].r = 0; tlv3[0].y = -1; return gamef; // sb_size = -1; } } return gamef; } /* end */