WonderWitchでプログラム〜スプライトの移動〜


目次に戻る


今回はWonderWitch短期集中講座最終回です。最後はスプライトの移動としまして、カーソルキーでスプライトを移動させる方法を紹介します。キーウェイトのかけ方に癖がありますが、プログラムはシンプルにしました。
 
 
# makefile メイクファイル
# makefile for sprite_2
#

include ../makefile.inc

all: spr_2.fx

spr_2.fx: main.fx
 copy main.fx spr_2.fx
main.fx: main.bin
main.bin: main.obj
main.obj: main.c

main.cf cfファイル
name: sprite_2
info: スプライト表示3
mode: 7
source: main.bin
output: main.fx
/* main.c sprite_2のメインソース */
#include <sys/bios.h>

#include "hito.h"

#define ANIMATION_TIME  30             
/* スプライトの表示内容を切り替える時間 */
#define KEY_WAIT        5                       /* キー入力受付間隔 */

int main()
{
        int anime = 2; 
/* スプライトに設定するキャラクタ番号 */
        unsigned long lastanimetime = sys_get_tick_count();     /* アニメーションで使用する時間保持用変数 */
        unsigned long lastkeytime = 0;  /* キー入力で使用する時間保持用変数 */
        int x = 10,y = 10;      /* スプライトの表示位置 */
        int key;        /* 入力されたキー */
        
        display_control( DCM_SCR1 | DCM_SPR ); 
/*ディスプレイの設定。SCREEN1を使用し、スプライトを使用する。*/
        font_set_monodata( 0 , 4 , bmp_hito );  /*bmp_hito配列をキャラクタとして登録 */
        
        screen_fill_char( 0 , 0 , 0 , SCREEN_CHAR_WIDTH , SCREEN_CHAR_HEIGHT , 0 );    
/* 画面表示内容を初期化(画面全体をキャラクタ0で塗りつぶす) */
        
        sprite_set_char_location( 0 , anime , x , y ); 
/* 0番のスプライトにanime番のキャラクタを割り当て、表示位置は(10,10)にする */
        sprite_set_range(0,1);  /* 使用するスプライトの数を設定 */
        
       
/* STARTボタンを押すまで繰り返す */
        while( (key=key_press_check()) != KEY_START ){
                unsigned long nowtime = sys_get_tick_count();  
/* 現在の時間を得る */
                
               
/* スプライトのアニメーション */
                if( nowtime - lastanimetime > ANIMATION_TIME ){ /* スプライトの表示内容を切り替える時間がきたかどうか */
                        lastanimetime = nowtime;
                        anime = (anime == 2) ? 3 : 2;  
/* スプライト0に設定するキャラクタ番号を切り替える */
                        sprite_set_char( 0 , anime );   /* スプライト0にanime番のキャラクタを割り当てる */
                }
                
               
/* キー入力 */
                if( key && nowtime - lastkeytime > KEY_WAIT ){
                        int v = 1;     
/* スプライトの移動量 */
                        
                        if( key & KEY_B ){             
/* Bボタン(ダッシュキー) */
                                v = 2;  /* Bボタンを押している間は移動量が2倍 */
                        }
                        
                        if( key & KEY_UP1 ){   
/* 上ボタン */
                                y-=v;
                                if( y < 0 ){
                                        y = 0;
                                }
                        }
                        if( key & KEY_DOWN1 ){ 
/* 下ボタン */
                                y+=v;
                                if( y > LCD_PIXEL_HEIGHT-8 ){
                                        y = LCD_PIXEL_HEIGHT-8;
                                }
                        }
                        if( key & KEY_LEFT1 ){ 
/* 左ボタン */
                                x-=v;
                                if( x < 0 ){
                                        x = 0;
                                }
                        }
                        if( key & KEY_RIGHT1 ){
/* 右ボタン */
                                x+=v;
                                if( x > LCD_PIXEL_WIDTH-8 ){
                                        x = LCD_PIXEL_WIDTH-8;
                                }
                        }
                        
                       
/* スプライトの位置を更新する */
                        sprite_set_location( 0 , x , y );
                        
                       
/* キーを押した時間を記憶(キーウェイト用) */
                        lastkeytime = sys_get_tick_count();
                }
        }
        
        return 0;
}
/* hito.h */
#define hito_width      2
#define hito_height     2
unsigned char bmp_hito[] = {    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
        0x19, 0x1A, 0x24, 0x58, 0x98, 0x24, 0x48, 0x90, 
        0x98, 0x58, 0x24, 0x1A, 0x19, 0x24, 0x12, 0x09, 

};


目次に戻る