C 检查像素是否在teensy游戏中发生碰撞
我试图检查我的操纵杆控制的角色是否与存储在数组中的墙像素发生碰撞。角色有一个与其位置左上角相关的坐标和一个表示绘制它的“位图”的2D数组。但是,我要么没有碰撞,要么角色无法移动,因为代码认为它发生了碰撞 我已经完成了调用碰撞测试的多种变体——在碰撞函数中以及在移动函数中调用碰撞测试时都进行了尝试。我最近切换到2来表示循环,因为1只比较它们各自阵列中相同位置的像素,而不是所有像素。 我按照下面评论中的建议做了一些更改,现在我已将问题缩小到始终返回0的碰撞函数。我通过与敌人角色碰撞发现了这一点,当我让if temp==0时,玩家没有移动就死了,但当它设置为if(temp==1)时,玩家即使碰到敌人角色也不会死C 检查像素是否在teensy游戏中发生碰撞,c,teensy,C,Teensy,我试图检查我的操纵杆控制的角色是否与存储在数组中的墙像素发生碰撞。角色有一个与其位置左上角相关的坐标和一个表示绘制它的“位图”的2D数组。但是,我要么没有碰撞,要么角色无法移动,因为代码认为它发生了碰撞 我已经完成了调用碰撞测试的多种变体——在碰撞函数中以及在移动函数中调用碰撞测试时都进行了尝试。我最近切换到2来表示循环,因为1只比较它们各自阵列中相同位置的像素,而不是所有像素。 我按照下面评论中的建议做了一些更改,现在我已将问题缩小到始终返回0的碰撞函数。我通过与敌人角色碰撞发现了这一点,当我
int wall_collide(int x1, int y1, int i_count, int j_count, int array1[i_count][2], int array2[j_count][2]) {
for (int i = 0; i < i_count; ++i)
{
for (int j = 0; j < j_count; ++j)
{
if ((x1 + array1[i][0] == array2[j][0]) && (y1 + array1[i][1] == array2[j][1]))
{
return 1;
}
}
}
return 0;
}
void p_move() {
int temp = 0;
if (LBpressed == 1 && !(c_x == 0))
{
temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
if (temp == 0) c_x -= 1;
}
if (RBpressed == 1 && !(c_x == (LCD_X - 5)))
{
temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
if (temp == 0) c_x -= 1;
}
if (UBpressed == 1 && !(c_y == 8))
{
temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
if (temp == 0) c_y -= 1;
}
if (DBpressed == 1 && !(c_y == (LCD_Y - 7)))
{
temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
if (temp == 0) c_y += 1;
}
}
int walls[4][4] = { {18,15, 13,25}, {25,35, 25,45}, {45,10, 60,10}, {58,25, 72,30} };
This is how I'm storing the pixels for the walls when I draw them
void pixelbank(int x1, int y1, int x2, int y2) {
if ( x1 == x2 ) {
// Draw vertical line
for ( int i = y1; (y2 > y1) ? i <= y2 : i >= y2; (y2 > y1) ? i++ : i-- ) {
inputoarray(x1, i);
}
}
else if ( y1 == y2 ) {
// Draw horizontal line
for ( int i = x1; (x2 > x1) ? i <= x2 : i >= x2; (x2 > x1) ? i++ : i-- ) {
inputoarray(i, y1);
}
}
else {
// Always draw from left to right, regardless of the order the endpoints are
// presented.
if ( x1 > x2 ) {
int t = x1;
x1 = x2;
x2 = t;
t = y1;
y1 = y2;
y2 = t;
}
// Get Bresenhaming...
float dx = x2 - x1;
float dy = y2 - y1;
float err = 0.0;
float derr = ABS(dy / dx);
for ( int x = x1, y = y1; (dx > 0) ? x <= x2 : x >= x2; (dx > 0) ? x++ : x-- ) {
inputoarray(x, y);
err += derr;
while ( err >= 0.5 && ((dy > 0) ? y <= y2 : y >= y2) ) {
inputoarray(x, y);
y += (dy > 0) - (dy < 0);
err -= 1.0;
}
}
}
}
intwall\u冲突(intx1,inty1,inti\u计数,intj\u计数,intarray1[i\u计数][2],intarray2[j\u计数][2]){
对于(int i=0;iy1)?i=y2;(y2>y1)?i++:i--){
输入阵列(x1,i);
}
}
else if(y1==y2){
//画水平线
对于(int i=x1;(x2>x1)?i=x2;(x2>x1)?i++:i--){
输入阵列(i,y1);
}
}
否则{
//无论端点的顺序如何,始终从左向右绘制
//提出。
如果(x1>x2){
int t=x1;
x1=x2;
x2=t;
t=y1;
y1=y2;
y2=t;
}
//找布雷森哈明。。。
浮点数dx=x2-x1;
浮动dy=y2-y1;
浮动误差=0.0;
浮球直径=ABS(dy/dx);
对于(int x=x1,y=y1;(dx>0)?x=x2;(dx>0)?x++:x--){
输入阵列(x,y);
err+=derr;
而(err>=0.5&((dy>0)?y=y2)){
输入阵列(x,y);
y+=(dy>0)-(dy<0);
误差-=1.0;
}
}
}
}
pixelbank是存储墙壁像素的位置(int-pixelbank[64][2])
c_x和c_y是绘制字符的起点,c_xy包含偏移量,例如c_xy[0][0]=1和c_xy[0][1]=0,因为在c_x+1、c_y+0处绘制了一个像素
我希望我的角色不能穿过墙壁,但他要么是,要么根本不能移动,但我的代码在编译时没有提供任何错误
另外,如果有帮助的话,我正在使用48x84 LCD屏幕作为我的代码(int j=0;j当问一个关于运行时问题的问题时,正如这个问题所做的那样,发布一个,这样我们可以重现问题并帮助您调试它。事实上,发布的代码甚至没有开始编译。@virolino有一些东西。在那些用于循环的问题中,您也不使用
j
,函数wall\u collide()的目的是什么
?它是执行冲突的命令(在哪种情况下?),还是检测可能的冲突的测试?啊哈。更好的做法是将函数命名为isWallCollision()
或HasUserCollistedInToWall()
或类似名称,只是为了使函数的用途显而易见。