processing으로 탈출 게임을 만들 때 참조

7228 단어 processing

개요



나중에 추가합니다.

Processing으로 게임을 만들 때 혼란스러운 곳을 하나의 기사에 모아 써 둡니다.

processing ver.3.3.5 사용

전제로서, 예에 사용하는 탈출 게임의 구조는 다음과 같이 합니다.


  • 세 방은 특정 ​​장면(문)에서만 왕래할 수 있다.
  • 탈출을 위해서는 텍스트 상자에 올바른 대답을 넣어야 한다
  • 텍스트 상자는 특정 장면에서만 나타납니다
  • 각 방의 장면은 한 장의 이미지로 표시됩니다

  • 화면 전환 - 한 방으로 이동



    배열과 후술하는 플래그를 사용해 구현합니다.

    방별로 배열을 만들어 장면별 이미지를 저장합니다.
    PImage[] room1 = new PImage[4];
    PImage[] room2 = new PImage[4];
    PImage[] room3 = new PImage[4];
    
    room1[0] = loadImage("00.png");
    
    ...
    
    

    이미지 파일의 이름을 규칙적으로 명명하여 loadImage 명령을 간결하게 만들 수 있습니다.

    방 안에서 장면을 전환하는 경우에는 image() 로 표시시키는 배열 이미지의 인덱스를 조작합니다

    for (int i=0 ; i<4;i++){
    image(room[i],0,0);
    }
    

    여기서는 a와 d로 방 안을 이동하면 설정하므로 keyPressed 함수로 인덱스를 조작합니다.
    void keyPressed() {
      switch(key) {
    
      case 'a' :
        //bamen idou key
        //bamenNo  manage
        if (bamenNo != 3) {
          bamenNo +=1;
        } else {
          bamenNo = 0;
        }
    
        break;
    
      case 'd' :
        //bamen idou key
    
        if (bamenNo == 0) {
          bamenNo =3;
        } else {
          bamenNo -= 1;
        }
        break;
    

    변경된 색인은 다음 이미지 표시 관리 기능의 표시에 반영됩니다.
    if 문 안의 함수에 각각 image(); 등이 저장되어 있습니다
    void mainroom() {
      reset();
      if (check_whereRoom == 0) {
        gameStart();
      } else if (check_whereRoom == 1) game();
      else if (check_whereRoom == 2) gameClear();
      else {
        text("noRoom", 60, 30);
      }
    }
    

    플래그 관리 - 방과 방 사이를 이동



    플래그를 사용하여 관리

    반환 값이 있는 함수를 사용하여 플래그 관리



    반환 값이 있는 함수는 void 대신 반환 형식을 함수 이름 앞에 넣습니다.
    void setup(){
    }
    
    void draw(){
      print(nibai());
     //関数nibaiを実行すると戻り値tの値が帰ってくる
     //
    }
    
    int nibai(){ //int型の戻り値を持つ関数nibai
    int t = 10;
     t = t*2; //tを2倍してtに代入する
     return t; //int型 tの値を戻り値として渡す
    //この場合最初のtの中身は10なので戻り値は2倍された20となる
    }
    

    이것을 사용해 「지금 방 이동할 수 있는 장면에 있는지 판정해, 이동할 수 있으면 true, 할 수 없으면 false라고 돌려주는 함수」를 준비한다
    boolean checkFlag2() {
      boolean Cflag = false;
      if (check_whereRoom ==0 && bamenNo == 2) {
        Cflag = true;
      }else if (check_whereRoom ==1 && bamenNo == 3) {
        Cflag = true;
      } else if (check_whereRoom ==2 && bamenNo == 0) {
        Cflag = true;
      } else Cflag = false;
    
      return Cflag;
    }
    

    방을 이동할 때는 "지금 어느 방에 있는지를 저장하는 함수"와 함께 사용
    ...
     case ' ' :
        //room idou key
        if (check_whereRoom == 0 && checkFlag2() == true ) {
          check_whereRoom = 1;
          bamenNo = 1;
        } else if (checkFlag2()== true&&check_whereRoom == 1) {
          check_whereRoom = 2;
        } else if (checkFlag2()== true&&check_whereRoom == 2) {
          check_whereRoom = 0;
        }
    ...
    

    오래된 플래그 관리 함수



    방 이동 가능한 장면에 있는지 여부를 두 개의 플래그로 판정하는 함수
    void checkFlag() {
      if (check_whereRoom ==0) {
    //今どの部屋にいるか
        check_game= false;
        check_clear = false;
        if (bamenNo == 2) check_start = true;
    //どの場面にいるか
        else check_start = false;
      } 
    else if (check_whereRoom ==1) {
        check_start= false;
        check_clear = false;
        if (bamenNo == 3) check_game = true;
        else check_game = false;
      } 
    else if (check_whereRoom ==2) {
        check_start= false;
        check_game = false;
        if (bamenNo == 0) check_clear = true;
        else check_clear= false;
      }
    }
    
      case ' ' :
        //room idou key
        if (check_start == true) {
          check_whereRoom = 1;
          bamenNo = 1;
        } else if (check_game == true) {
          check_whereRoom = 2;
        } else if (check_clear == true) {
          check_whereRoom = 0;
        }
    
        break;
    

    텍스트 상자



    Interfascia라는 라이브러리 사용

    샘플 코드 보기



    textfield
    import interfascia.*;
    
    GUIController c;
    IFTextField t;
    IFLabel l;
    

    IFTextField는 텍스트 상자를 표시하는 형식
    IFLabel은 텍스트 상자의 레이블과 관련된 유형입니다.
    void setup() {
      size(200, 100);
      background(200);
    
      c = new GUIController(this);
      t = new IFTextField("Text Field", 25, 30, 150);
      l = new IFLabel("", 25, 70);
    //IFTextField("テキストボックスの名前",左上のX座標,左上のY座標,ボックスの幅);
    
      c.add(t);
      c.add(l);
    //.addで画面上に当該オブジェクトを表示、機能をスタートさせる.
    //IFTextField型のオブジェクトだけはsetup関数以外の場所で
    //実行しようとするとフリーズしてしまう。なぜだ
      t.addActionListener(this);
    }
    
    
    void draw() {
      background(200);
    }
    
    void actionPerformed(GUIEvent e) {
      if (e.getMessage().equals("Completed")) {
    //e.getMessage()の中身がCompletedだったとき
        l.setLabel(t.getValue());
    //テキストボックスのラベル名をt.getValue()(=ボックスに入力した文字)にする
      }
    }
    
    e.getMessage() 는 현재 「박스에 문자를 쳤을 때의 "Modified"」 「박스내에서 엔터키를 누른 순간의 "Completed"」의 2개의 상태를 취하는 것을 확인할 수 있다

    임의의 문자열을 넣을 때 라벨을 표시하려면


    String pass = onigiri;
    void actionPerformed(GUIEvent e) {
      if (e.getMessage().equals("Completed") ) {
    //EnterKeyが押されたとき
        if (t.getValue().equals(pass) ) {
    //且つボックスの入力とpass変数の中身が一致するとき
          l.setLabel("gohan");
    //ラベルをgohanに書き換える
        } else {
          l.setLabel("noooooo");
    //一致しないときは拒絶のメッセージを出す
        }
      }
    }
    
    .equals(Str) 는 String 를 비교할 때 사용해, 전후의 String 가 일치해 있을지 어떨지를 판정합니다

    참고, interfascia의 공식 사이트

    특정 장면에서만 텍스트 상자를 내고 싶습니다.



    괜찮은 수단으로는 출입이 어려웠기 때문에, 조금 억지로.
    숨기고 싶을 때는 박스와 라벨 모두 setPosition() 등을 이용하여 좌표를 화면 밖에 (width*2,height*2)이제 겉보기에는 텍스트 상자를 숨길 수 있습니다.
    ...
    
    int intNo = 0;
    
    if (intNo != 0){
       setPosition(width*2,height*2);
    }else{
       setPosition(150,200);
    }
    

    무작위 대사



    STR 형 배열을 사용하여 해결을 시도합니다.
    Str[] serifu = new Str[7];
    //Str型の配列 serifuを用意
    serifu[0] = "hello";
    …
    
    int r = round(random(0,6.99));
    //ランダム関数の数字を整数に丸めてint型に格納します
    text(serif[r],0,0);
    //配列の中のランダムなセリフを表示する
    

    일본어를 사용하는 경우는 에디터의 폰트를 일본어 대응으로 하는 방법이 있습니다

    동영상 재생



    Processing video 라이브러리 사용


    참고 http://mslabo.sakura.ne.jp/WordPress/make/processing%E3%80%80%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AA%E3% 83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/%E5%8B%95%E7%94%BB%E3%82%92%E5%86 %8D%E7%94%9F%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/

    BGM을 흘리다



    Minim 라이브러리 사용
    Minim musik =new Minim(this);
    //初期化
    AudioPlayer player;
    
    void setup() {
     player = musik.loadFile("音声ファイルの名前");
    //音声を読み込む
    }
    
    void draw() {
     player.play( ) ;
    //再生。最後まで再生し終わるとストップする
    }
    


    참고
    ht tp // r ぢ 멘시온. xsrv. jp/c ぁせ s_j/미니 m/

    좋은 웹페이지 즐겨찾기