| Проблема с вращением маски(Решено) | 
|  | 
| 
| 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 |  |  |  |  |