since : 2001.11.1 Junk Shop
DataSlim2's Room
RexDKで、データスリム2のアドインを作る。
スタイラスによりタッチパネルに触れた時の座標を取得するプログラムを作成します。
DsSDKと同じ、タッチパネルの座標データ取得用の構造体が用意されているので、それを利用します。
以下が、座標データを取得し表示するサンプルプログラムです。
// RexDK Test Sample 4
// Get touch Point
#include <rex/rex.h>
/*DsPrintfe()の定義*/
extern int __LIB__ DsPrintfe(int,int,int,char *);
void main(void){
POINT p; //座標データ構造体の変数定義
int x,y;
char a[7]; //数値表示用の配列変数
while(1){
p.PointX=255;p.PointY=255; //座標データの初期化
DsTouchDataGet(p); //座標データの取得
x=p.PointX;y=p.PointY;
if((x<240)&&(y<120)){ //座標データが表示内であるかの判断
DsDisplayBlockClear(0,0,240,12);
itoa(a,x);DsPrintfe(0,0,0,a);
itoa(a,y);DsPrintfe(60,0,0,a);
}
}
}
DsTouchDataGet(p)により座標を取得できますが、この関数の性質上、構造体に取得データを書きこむので、一度取得したデータを次に取得するまで保持しつづけます。
そのため、目的によっては常に初期化する必要が有ります。
座標データの取得方法も解った所でソースを次のように変更しました。
まず、メッセージ構造体変数と座標データ構造体変数を一々関数の中で定義するのが面倒なので、グローバル化します。
その後、今までに作成したプログラムに座標取得を加えてTmove()と言う関数に変更しました。
void Tmove(int Char_Y){
int Char_X=240,Char_X_old,x;
int Char_Y_old,y;
int i,f,flag;
char str[10];
DsDisplayBlockClear(0,0,240,120);
f=1;
do{
if (Char_X<0){
DsDisplayBlockClear(0,Char_Y,CharWidth*5,CharHeight);
}
else{
DsDisplayBlockClear(Char_X_old,Char_Y,CharWidth*5,CharHeight);
}
for(i=0;i<5;i++){
x=Char_X+i*CharWidth;
if ((x>=0)&&(x<=232)){
DsDisplayBitmapDraw( x, Char_Y, taro_bmps[i] , 0);
}
}
/*キャラクターの動きをトレースするために入れてあるます
実行キーを押すと1ループづつ動くようにして有ります。*/
flag=1;
while(flag){
//キャラクターの位置とサイズを取得
x=Char_X;y=Char_Y;width=CharWidth*5;
//キャラクターの頭が隠れている時の処理
if(Char_X < 0){
x=0;width=width+Char_X;
}
DsTouchDataGet(p); //タッチポイント座標の取得
/*タッチポイントの位置がキャラクターと重なっているかの判定*/
if(((p.PointX > x)&&(p.PointX < x+width))&&
((p.PointY > Char_Y)&&(p.PointY < Char_Y+CharHeight))){
scor++;
DsDisplayBlockClear(200,0,40,12);
itoa(str,scor);DsPrintfe(200,0,0,str);
flag=0;
}
p.PointX=255;p.PointY=255; //座標の初期化
DsEventMessageGet(msg);
switch (msg.message)
{
case MSG_DS_KEY_DOWN:
if(msg.sCode==KEY_ENTER_A) {flag=0;}
break;
}
}
Char_X_old = Char_X;
Char_X -=CharWidth;
if(Char_X<(-5*CharWidth)) f=0;
}while(f);
/*描画ルーチンを抜け出した事を知るために入れてあるます*/
itoa(str,x);DsPrintfe(0,0,0,str);
}
青文字の部分がおもな変更箇所です。
このTmove()関数を次のようにmain()関数から呼び出すようにします。
main(){
while(1){
DsEventMessageGet(msg);
switch (msg.message){
case MSG_DS_KEY_DOWN:
if(msg.sCode==KEY_ENTER_A) {
Tmove(20);}
break;
}
}
}
これで、ゴキブリをタッチするとポイントが加算されるプログラムができました。
Copyright 2001-2002 Hideo Morotomi