Group dots not working
Joel
joelcnz at gmail.com
Wed Dec 20 01:45:57 UTC 2023
The dots are supposed to keep moving till they hit something then
change direction.
Using DotsLogicType.solid the move at first, but then stop moving
once they hit something.
What supposed to happen: First they check left or right
(depending on the dir.x is negative or positive). If no dots hit
anything then move the whole dot group, otherwise change
direction x variable. Do the same again, but with up and down.
```d
module freedots;
import jart;
struct Dot {
Vector2 pos, dir;
Color col;
Vector2 wpos;
bool hit;
bool hitx, hity; // old
Vector2 logic(in DotsLogicType dotsLogicType, int hrd, ref
char[][] hitMap, in RenderTexture canvas) {
Vector2 result;
final switch(dotsLogicType) with(DotsLogicType) {
case none:
break;
case solid:
// mixin(tce("hrd dir.x dir.y".split));
// look horrisontal
if (hrd==0)
if (pos.x+dir.x>=canvas.texture.width ||
pos.x+dir.x<0 ||
hitMap[cast(size_t)(pos.x+dir.x)][cast(size_t)pos.y]=='#') {
hit=true;
}
// look virtical
if (hrd==1)
if (pos.y+dir.y>=canvas.texture.height ||
pos.y+dir.y<0 ||
hitMap[cast(size_t)pos.x][cast(size_t)(pos.y+dir.y)]=='#') {
hit=true;
}
break;
case fold:
if (pos.x+dir.x>=canvas.texture.width ||
pos.x+dir.x<0 ||
hitMap[cast(size_t)(pos.x+dir.x)][cast(size_t)pos.y]=='#') {
dir.x*=-1;
} else pos.x+=dir.x;
if (pos.y+dir.y>=canvas.texture.height ||
pos.y+dir.y<0 ||
hitMap[cast(size_t)pos.x][cast(size_t)(pos.y+dir.y)]=='#') {
dir.y*=-1;
} else pos.y+=dir.y;
break;
}
return result;
}
void draw() {
DrawRectangleV(Vector2(cast(int)pos.x, cast(int)pos.y)*3,
Vector2(3,3), col);
}
}
struct DotCnt {
Dot[] dots;
static DotsLogicType dotsLogicType=DotsLogicType.none;
void clearDotsHitMap(ref char[][] hitMap) {
foreach(ref d; dots) {
hitMap[cast(size_t)d.pos.x][cast(size_t)d.pos.y]=' ';
}
}
void setDotsHitMap(ref char[][] hitMap) {
foreach(ref d; dots) {
hitMap[cast(size_t)d.pos.x][cast(size_t)d.pos.y]='#';
}
}
void logic(in RenderTexture canvas, ref char[][] hitMap) {
final switch(dotsLogicType) with(DotsLogicType) {
case none:
setDotsHitMap(hitMap);
break;
case solid:
clearDotsHitMap(hitMap);
foreach(hrd; 0..2) {
Vector2 mdir;
bool hit;
// go through dots looking
foreach(ref d; dots) {
mdir=(hrd==0 ? Vector2(d.dir.x,0) :
Vector2(0,d.dir.y));
d.logic(DotsLogicType.solid, hrd, hitMap,
canvas);
if (d.hit) {
hit=true;
break;
}
}
if (! hit)
foreach(ref d; dots) {
d.pos+=mdir;
}
if (hit)
foreach(ref d; dots) {
if (hrd==0)
d.dir.x=-mdir.x;
if (hrd==1)
d.dir.y=-mdir.y;
mixin(tce("hrd mdir d.pos
d.dir".split));
}
} // for loop h and v
setDotsHitMap(hitMap);
break;
case fold:
foreach(ref d; dots)
d.logic(DotsLogicType.fold, 0, hitMap,
canvas);
break;
}
}
void draw() {
foreach(ref d; dots)
d.draw;
}
void dotifyFrmTex(in PointerNSelecter pntsel, Texture2D tex,
bool flip=false) {
auto ds=buildXDollarsFromTex(tex, flip);
foreach(y; 0..tex.height)
foreach(x; 0..tex.width)
if (ds[x][y].a!=0)
dots~=Dot(pntsel.pos+Vector2(x,y),
Vector2(1,1), ds[x][y]);
}
}
```
Here's YouTube video that gives an idea of what my grouped dots
can do. https://youtu.be/t5EYeV4BYzU?si=bcpGYwYIX2ecfa9Q
More information about the Digitalmars-d-learn
mailing list