cc65でちょっとしたデモを作ろうとしました。
どういうデモかというと、星の形をしたスプライトを円状にぐるりと反時計回りに回転するデモです。
しかし、問題が起きました。下でしめすソースコードで、
x=128+(addx*(+radius))/100;
y=120-(addy*(+radius))/100;
を
x=128+(addx*30)/100;
y=120-(addy*30)/100;
にすると、正常に動くのですがstatic signed char radius=30;としたのに動きませんでした。
何か問題があるのでしょうか?
あと、
sin.binとcos.binをプログラムROM上のaddress=0xc000,0xc168に置き、
(sin.binとcos.binは、VC++6で作成,sin関数とcos関数を360度分だけ100倍し、fwriteしました)
char *cos;
signed char movx;
cos=0xc000;
movx+=*(cos+angle);
x+=(movx*30)/100;
固定小数点は、シフト演算を使うのが一般的みたいですが、(3.14*100*3)/100の方が分かりやすいので
そうしました。
固定小数点を今日の仕事中に考えていて、閃いたのが、上のコードです。
なんか、頭悪いですが、100*3/100=3(sin(90))なんだから、当たり前といえば当たり前ですね。
あと、ところどころ問題があるみたいです。
スプライトが正常に表示されないのは、よく分からないのと、
90度位置の真下に移動してしまうバグがあります。
なんででしょうか?
void MoveCircle()
{
static int angle=0;
static char x[12];
static char y[12];
signed char addx;
signed char addy;
int i;
static int flag=1;
static int index=0;
static signed char radius=30;
char s1,s2,s3;
sin=0xC000;
cos=0xC168;
//VBlank();
for(i=0;i<12;i++)
{
addx=(signed char)*(cos+angle+(i*30)) ;//*30)/100;
addy=(signed char)*(sin+angle+(i*30)) ;//*30)/100;
x[i]=128+(addx*(+radius))/100;
y[i]=120-(addy*(+radius))/100;
DrawSprite(x[i],y[i],index,1,flag);
index=(index+1)%4;
flag=0;
}
s1=(radius/100)%10;
s2=(radius/10)%10;
s3=(radius/1)%10;
DrawSprite(18*8,20*8,0,s1+0x30,0);
DrawSprite(19*8,20*8,0,s2+0x30,0);
DrawSprite(20*8,20*8,0,s3+0x30,0);
if(Pad & A) {
radius++;
if(radius>120)
radius=120;
}
if(Pad & B) {
radius--;
if(radius<5)
radius=5;
}
angle=(angle+5)%360;
}