Среда, 25 Декабря 2024, 04:30

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Проблема с вращением маски(Решено)
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 crazy

Красочная сюжетно-ориентированная игра-головоломка
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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг