[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00540] C 関数  sprite_set_data の使い方がよくわからない



はじめまして。最近WonderWitchをはじめたばかりのプログラム初心者です。
 
タイトルのままなのですが、過去記事を検索してみてもそれらしい記事がなかったので
投稿させていただきました。
 
32×32(pixel)のスプライトを表示させようとしたのですが、うまく表示できなくて困っています。
 
そもそも sprite_set_char_locationを16回呼び出すのと
sprite_set_data で1回で呼び出すのとでは何か違いがあるのでしょうか?
 
↓がうまく表示できなくて困っているソースをそのままコピペしたものです。
リソースは縦32×横32のbmpをそのままbmpcnvで変換した.frファイルです。(4色)
長ったらしいソースですいません。
 
あと直接関係ありませんが、メーリングリストというものは初めてなのですが、
なにか無作法があったら教えてください。よろしくお願いします。
 
/*    sprt.c     */
#include <sys/bios.h>
#include <stdio.h>
#include <stdlib.h>
#include <resource.h>
 
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
 
#define DISP_LEFT    0
#define DISP_RIGHT  224
#define DISP_TOP    0
#define DISP_BOTTOM  144
 
#define TRUE   1
#define FALSE   0
 
typedef struct _SPRITE_DATA
{
    short attr;    /*属性、キャラクタ番号*/
    BYTE x;        /*表示座標X*/
    BYTE y;        /*表示座標Y*/
}SPRITE_DATA;
 
/*リソースデータ*/
extern void far *_resource;
 
/*スプライトのデータ*/
static SPRITE_DATA sprt_data[16];
 
/* メイン */
void main(void)
{
     int i,j;
     int looping;
     int x, y;
     int vx, vy;
     int key;
 
     u_char far *buf;  /*リソースのアドレス*/
 
     /*乱数初期化*/
     srand((unsigned)sys_get_tick_count());
 
     /*LCDカラーマップに8色を選択*/
     lcd_set_color(0x6420, 0xfca8);
 
     /*パレット8番(スプライト用)の色選択*/
     palette_set_color(8, 0x7420);
 
     /*表示するものを設定(スプライトのみ表示)*/
     display_control(DCM_SPR);
 
     /*リソース(画像)を取得*/
     buf = (u_char far*)_resource;
 
     /*ヘッダの部分16Byteを飛ばす*/
     buf+=16;
 
     /*画像データをキャラクタにセット*/
     font_set_colordata(0, 16, buf);
 
     /*表示するスプライトを設定(0番から16個)*/
     sprite_set_range(0, 16);
 
     /*スプライトにキャラクタを割り当てる*/
     for( i=0; i<16; i++ ){
         /*  sprite_set_char(i, i); */
         sprt_data[i].attr = i;
     }
 
     /*速度と位置設定*/
     x = 112;
     y = 72;
     vx = (rand()%6)-3;
     vy = (rand()%6)-3;
 
     looping = TRUE;
     /*ゲームループ*/
     while( looping ){
 
         /*キー入力*/
         key = key_hit_check();
 
         if( key&KEY_A ){
             looping = FALSE;
         }
 
        /*スプライト座標移動*/
        /*x += vx;
        y += vy;
        */
 
        /*壁にぶつかったら速度反転*/
        if( DISP_RIGHT <= x ){
            x = DISP_RIGHT;
            vx *= -1;
        }else if( DISP_LEFT >= x ){
           x = DISP_LEFT;
           vx *= -1;
        }
        if( DISP_BOTTOM <= y ){
           y = DISP_BOTTOM;
           vy *= -1;
        }else if( DISP_TOP >= y ){
           y = DISP_TOP;
           vy *= -1;
        }
 
        /*スプライト表示座標設定*/
        for( i=0; i<res_info.height; i++ ){
            for( j=0; j<res_info.width; j++ ){
                /*    sprite_set_location(i*res_info.width+j, x+(j<<3), y+(i<<3));*/
                sprt_data[(i<<2)+j].x = x+(j<<3);
                sprt_data[(i<<2)+j].y = y+(i<<3);
            }
        }
        sprite_set_data(0, 16, sprt_data);
 
         /*VBLANK待ち*/
         sys_wait(1);
     }
}
/*EOF*/
 
 
 


ML Archives