
赤い刀みたく敵弾が自機の周りをぐるぐるまわるようにしたら面白いかなと思って。
見た目のインパクトは結構あるんだけど、身動きが取れなくなるのでゲームとしては微妙に。
ボス戦が待機げーになってしまうので没。
あと弾変換でプチフリーズする、まあこれはいいか。
無音……。
音ずれがひどくて、やむなく音カットで録画。30フレーム。
最初と最後に黒フェードいれてそれっぽくしたものの、
解像度の問題かフレームレートの問題でぱっとしない。
#ifdef _DEBUG
#define outputDebugString(...) outputDebugStr(__VA_ARGS__)
#else
#define outputDebugString(...) outputDebugStr( )
#endif
#include <cstdio>
typedef unsigned char BYTE;
/*
* @param dest コピー先バッファ
* @param destBitPos コピー開始ビット位置
* @param src 参照バッファ
* @param srcBitPos 参照開始ビット位置
* @param copyBitSize コピーするビット数
*/
void bitCopy(
void* dest, int destBitPos,
void* src, int srcBitPos,
int copyBitSize )
{
BYTE* destBin = static_cast<BYTE*>( dest ) + destBitPos/8;
BYTE* srcBin = static_cast<BYTE*>( src ) + srcBitPos/8;
destBitPos &= 0x7;
srcBitPos &= 0x7;
while ( copyBitSize > 0 )
{
int size = copyBitSize > 8 ? 8 : copyBitSize;
size = min( 8-destBitPos, size );
size = min( 8-srcBitPos, size );
BYTE destMask = static_cast<BYTE>(0xFF >> (8-size)) << destBitPos;
// trans copy
*destBin = ((*destBin ^ (((*srcBin)>>srcBitPos)<<destBitPos)) & destMask) ^ *destBin;
copyBitSize -= size;
destBitPos += size;
if ( destBitPos >= 8 )
{
destBin++;
destBitPos -= 8;
}
srcBitPos += size;
if ( srcBitPos >= 8 )
{
srcBin++;
srcBitPos -= 8;
}
}
}
int main()
{
int dest, src;
src = 0xFFFF0000;
dest = 0;
bitCopy( &dest, 8, &src, 16, 13 );
std::printf("%08x\n", dest);
dest = 0;
bitCopy( &dest, 8, &src, 12, 13 );
std::printf("%08x\n", dest);
dest = 0;
bitCopy( &dest, 8, &src, 9, 13 );
std::printf("%08x\n", dest);
dest = 0xFFFFFFFF;
bitCopy( &dest, 8, &src, 16, 13 );
std::printf("%08x\n", dest);
dest = 0xFFFFFFFF;
bitCopy( &dest, 8, &src, 12, 13 );
std::printf("%08x\n", dest);
dest = 0xFFFFFFFF;
bitCopy( &dest, 8, &src, 9, 13 );
std::printf("%08x\n", dest);
return 0;
}
001fff00
001ff000
001f8000
ffffffff
fffff0ff
ffff80ff
IEEE 754 の 32ビットと 64ビットの浮動小数点数には仮数部の前に暗黙の 1 (暗黙ビット) が置かれることになっていますが、80ビットの浮動小数点数には 歴史的事情により 暗黙ビットは存在しません。
D&Dで.aifを.wavにリネームしつつ同フォルダに吐き出してく
void changeEndianness( void* dest, size_t size )
{
BYTE* destByte = static_cast<BYTE*>( dest );
const size_t n = size/2;
for (size_t i=0; i<n; ++i)
{
BYTE tmp = destByte[i];
destByte[i] = destByte[size-i-1];
destByte[size-i-1] = tmp;
}
}
#include <cstdio>
#include <cstring>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
void print16( void* data, int size )
{
BYTE* bin = static_cast<BYTE*>( data );
std::printf("0x");
for (int i=size-1; i>=0; --i) std::printf("%02x", bin[i]);
std::printf("\n");
}
float doubleToFloat( double val )
{
float ret = 0;
BYTE* fBin = reinterpret_cast<BYTE*>( &ret );
BYTE bin[ sizeof(val) ];
memcpy( bin, &val, sizeof(val) );
// s
fBin[3] = bin[7] & 0x80;
// exp
WORD exp = (static_cast<WORD>(bin[7]&0x7F) << 8) | static_cast<WORD>(bin[6]);
exp >>= 4;
BYTE newExp = static_cast<BYTE>(exp - 1023) + 127;
fBin[3] |= (newExp >> 1);
fBin[2] = (newExp << 7);
// fraction
DWORD frac = (static_cast<DWORD>(bin[6]&0x0F)<<24) |
(static_cast<DWORD>(bin[5]) << 16) |
(static_cast<DWORD>(bin[4]) << 8) |
static_cast<DWORD>(bin[3]);
frac <<= 3;
BYTE* fracBin = reinterpret_cast<BYTE*>( &frac );
fBin[2] |= fracBin[3];
fBin[1] = fracBin[2];
fBin[0] = fracBin[1];
return ret;
}
int main()
{
double val = -44100;
std::printf("double: %f\n", val);
print16( &val, sizeof(val) );
std::printf("\n");
float fVal = doubleToFloat( val );
std::printf("float: %f\n", fVal);
print16( &fVal, sizeof(fVal) );
return 0;
}
double: -44100.000000
0xc0e5888000000000
float: -44100.000000
0xc72c4400
double: 3.1415926535897931
0x400921fb54442d18
float: 3.1415925025939941
0x40490fda