Проблема с вращением маски(Решено)
|
|
Skrininshot | Дата: Суббота, 24 Марта 2018, 11:47 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Привет, игра TDS и думаю многие в курсе какие проблемы возникают иногда со столкновениями. Сегодня столкнулся с проблемой вращения(видоизменения ширины и высоты) маски. Я поворачиваю объект через image_angle и только недавно узнал, что вместе с этим вращается(видоизменяется ширина и высота маски) и маска объекта, а переписывать всё через Draw event как-то очень долго, кто-нибудь знает, как вращать объект, при этом не вращая его маску и не используя при этом Draw event, если это, конечно, возможно? А пока столкновение работает как-то через....(моя вина) и если вращать объект в то время, как он уперся в стену, но как-бы идёт в её сторону, то он постепенно "утопает" в стене
What is love Baby don't hurt me Don't hurt me No more...
Сообщение отредактировал Skrininshot - Воскресенье, 25 Марта 2018, 13:28 |
|
| |
falcoware | Дата: Суббота, 24 Марта 2018, 13:56 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Skrininshot,
Код void BMP_File::RotateAngle(float fAngle) // int Degrees. { // Rotated Matrix. Matr<mColor_24> mtNewImage; mtNewImage.Set(SizeX(), SizeY());
for(int ax = 0; ax < SizeX(); ax++){ for(int ay = 0; ay < SizeY(); ay++){ mColor_24 &cCol = mtNewImage.e(ax, ay); cCol.r = cCol.g = cCol.b = 255; } }
mtNewImage.e(SizeX() / 2, SizeY() / 2) = Pixel(SizeX() / 2, SizeY() / 2);
int nRadius = (int)sqrt(double(SizeX() * SizeX() + SizeY() * SizeY())) / 2; for(int iR = 1; iR < nRadius; iR++){ int F = 0; int nx = 0, ny = iR; int posx, posy; Array<ipoint2d> arrPoints; while(TRUE){ posx = nx; posy = ny; ipoint2d sPoint = {posx, posy}; arrPoints.Append(sPoint);
if(nx == ny){ break; } if(F <= 0){ nx++; F += 2 * nx + 1; } else{ ny--; F -= 2 * ny - 1; } }
// Sorting... int ix; Array<ipoint2d> arrPointsSorted;
// 1 for(ix = 0; ix < arrPoints.Size(); ix++){ ipoint2d sPoint2d = arrPoints.e(ix); posx = sPoint2d.y; posy = -sPoint2d.x;
sPoint2d.x = posx; sPoint2d.y = posy; arrPointsSorted.Append(sPoint2d); }
// 2 for(ix = 0; ix < arrPoints.Size(); ix++){ ipoint2d sPoint2d = arrPoints.e(arrPoints.Size() - 1 - ix); posx = sPoint2d.x; posy = -sPoint2d.y;
sPoint2d.x = posx; sPoint2d.y = posy; arrPointsSorted.Append(sPoint2d); }
// 3 for(ix = 0; ix < arrPoints.Size(); ix++){ ipoint2d sPoint2d = arrPoints.e(ix); posx = -sPoint2d.x; posy = -sPoint2d.y;
sPoint2d.x = posx; sPoint2d.y = posy; arrPointsSorted.Append(sPoint2d); }
// 4 for(ix = 0; ix < arrPoints.Size(); ix++){ ipoint2d sPoint2d = arrPoints.e(arrPoints.Size() - 1 - ix); posx = -sPoint2d.y; posy = -sPoint2d.x;
sPoint2d.x = posx; sPoint2d.y = posy; arrPointsSorted.Append(sPoint2d); }
// 5 for(ix = 0; ix < arrPoints.Size(); ix++){ ipoint2d sPoint2d = arrPoints.e(ix); posx = -sPoint2d.y; posy = sPoint2d.x;
sPoint2d.x = posx; sPoint2d.y = posy; arrPointsSorted.Append(sPoint2d); }
// 6 for(ix = 0; ix < arrPoints.Size(); ix++){ ipoint2d sPoint2d = arrPoints.e(arrPoints.Size() - 1 - ix); posx = -sPoint2d.x; posy = sPoint2d.y;
sPoint2d.x = posx; sPoint2d.y = posy; arrPointsSorted.Append(sPoint2d); }
//7 for(ix = 0; ix < arrPoints.Size(); ix++){ arrPointsSorted.Append(arrPoints.e(ix)); }
//8 for(ix = 0; ix < arrPoints.Size(); ix++){ ipoint2d sPoint2d = arrPoints.e(arrPoints.Size() - 1 - ix); posx = sPoint2d.y; posy = sPoint2d.x;
sPoint2d.x = posx; sPoint2d.y = posy; arrPointsSorted.Append(sPoint2d); }
// Remove Doubles. for(ix = 0; ix < arrPointsSorted.Size() - 1; ix++){ posx = arrPointsSorted.e(ix).x; posy = arrPointsSorted.e(ix).y; int posx1 = arrPointsSorted.e(ix + 1).x; int posy1 = arrPointsSorted.e(ix + 1).y; if((posx == posx1) && (posy == posy1)){ arrPointsSorted.ShiftRemove(ix); ix--; continue; } }
#define PI_LB 3.14159265358979323846f #define RAD_TO_DEG (180.0f/PI_LB)
int nDelta = 0; int nMult = 0; float fAngle1 = fAngle; if((fAngle >= 90) && (fAngle < 180)){ fAngle1 -= 90; nMult = 1; } if((fAngle >= 180) && (fAngle < 270)){ fAngle1 -= 180; nMult = 2; } if((fAngle >= 270) && (fAngle < 360)){ fAngle1 -= 270; nMult = 3; }
for(ix = 0; ix < arrPointsSorted.Size(); ix++, nDelta++){ posx = arrPointsSorted.e(ix).x; posy = arrPointsSorted.e(ix).y; float fNewAngle = float(RAD_TO_DEG * acos(double(posx) / double(iR)));
if(fNewAngle >= fabs(double(fAngle1))){ break; } }
nDelta += arrPointsSorted.Size() / 4 * nMult;
for(ix = 0; ix < arrPointsSorted.Size(); ix++){ posx = SizeX() / 2 + arrPointsSorted.e(ix).x; posy = SizeY() / 2 + arrPointsSorted.e(ix).y;
if(!((posx < SizeX()) && (posy < SizeY()) && (posx >= 0) && (posy >= 0))){ continue; }
mColor_24 cCol = Pixel(posx, posy);
// Rotate to nDelta; int ik; ik = ix + nDelta; if(ik >= arrPointsSorted.Size()){ ik -= arrPointsSorted.Size(); }
int posx2 = arrPointsSorted.e(ik).x + SizeX() / 2; int posy2 = arrPointsSorted.e(ik).y + SizeY() / 2;
if((posx2 < SizeX()) && (posy2 < SizeY()) && (posx2 >= 0) && (posy2 >= 0)){ mtNewImage.e(posx2, posy2) = cCol; } } }
memcpy(Memory(), mtNewImage.Memory(), mtNewImage.MemorySize()); }
|
|
| |
vampir0305 | Дата: Суббота, 24 Марта 2018, 14:30 | Сообщение # 3 |
Unity C# Programmer
Сейчас нет на сайте
| falcoware, Это раздел про Game Maker
Красочная сюжетно-ориентированная игра-головоломка
|
|
| |
falcoware | Дата: Суббота, 24 Марта 2018, 14:44 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| vampir0305, дык код он и в Африке код! =)
|
|
| |
Skrininshot | Дата: Суббота, 24 Марта 2018, 16:18 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Спасибо, falcoware, извини, но я не воспользовался твоими дарами, потому как совесть не позволяет копипастить коды, которых я не понимаю. К счастью моя уверенность в то, что это можно реализовать проще, привела меня к такому вот решению проблемы:
Код u = keyboard_check(ord("W")) d = keyboard_check(ord("S")) l = keyboard_check(ord("A")) r = keyboard_check(ord("D"))
if u { walk = true if place_meeting(x,y-border,obj_Wall) { while(!place_meeting(x,y-border/2,obj_Wall)) { y-- } } else { y-=walksp } }
if d { walk = true if place_meeting(x,y+border,obj_Wall) { while(!place_meeting(x,y+border/2,obj_Wall)) { y++ } } else { y+=walksp } }
if l { walk = true if place_meeting(x-border,y,obj_Wall) { while(!place_meeting(x-border/2,y,obj_Wall)) { x-- } } else { x-=walksp } }
if r { walk = true if place_meeting(x+border,y,obj_Wall) { while(!place_meeting(x+border/2,y,obj_Wall)) { x++ } } else { x+=walksp } }
What is love Baby don't hurt me Don't hurt me No more...
Сообщение отредактировал Skrininshot - Суббота, 24 Марта 2018, 16:27 |
|
| |