changed wagoncolor by speed

This commit is contained in:
interfisch 2018-04-08 19:47:34 +02:00
parent 153a9f0d83
commit 0cc531c7b3
3 changed files with 69 additions and 17 deletions

View File

@ -11,6 +11,8 @@
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
long lastPixelUpdate=0; long lastPixelUpdate=0;
#define PIXELUPDATETIME 10 #define PIXELUPDATETIME 10
long lastRoutineUpdate=0; long lastRoutineUpdate=0;
@ -19,6 +21,7 @@ long lastRoutineUpdate=0;
long loopmillis=0; long loopmillis=0;
uint8_t height[NUMPIXELS]; uint8_t height[NUMPIXELS];
#define MAXHEIGHT 45
std::vector <Wagon> wagon_arr; std::vector <Wagon> wagon_arr;
uint8_t maxid=0; uint8_t maxid=0;
@ -77,15 +80,15 @@ void setup() {
previewHeightmap(); previewHeightmap();
spawnWagon(); spawnWagon();
spawnWagon();
} }
void previewHeightmap(){ void previewHeightmap(){
int maxheight=45;
for (int i=0;i<NUMPIXELS;i++){ for (int i=0;i<NUMPIXELS;i++){
//uint32_t c=Wheel(height[i]*255/45); //uint32_t c=Wheel(height[i]*255/45);
uint8_t b=height[i]*255/45; uint8_t b=height[i]*255/MAXHEIGHT;
uint32_t c=strip.Color(255-b,b,0); uint32_t c=strip.Color(255-b,b,0);
strip.setPixelColor(i,c); strip.setPixelColor(i,c);
} }
@ -94,11 +97,14 @@ void previewHeightmap(){
} }
void spawnWagon(){ void spawnWagon(){
Wagon tmpr = Wagon(maxid++,NUMPIXELS,&strip, height, 35, 6, 0.5,0); //spawn new wagon //Wagon tmpr = Wagon(maxid++,NUMPIXELS,&strip, height, 35, 6, 0.5,0); //spawn new wagon
Wagon tmpr = Wagon(maxid++,NUMPIXELS,&strip, height, random(30, 200), 6, random(0.2, 10)/10.0,0); //spawn new wagon
wagon_arr.push_back(tmpr); wagon_arr.push_back(tmpr);
Serial.println("Spawned Wagon"); Serial.println("Spawned Wagon");
} }
void loop() { void loop() {
loopmillis=millis(); loopmillis=millis();

View File

@ -1,7 +1,6 @@
#include "wagon.h" #include "wagon.h"
Wagon::Wagon(int id,int numpixels, Adafruit_NeoPixel *strip,uint8_t *height,float pos, float wagonlength,float startvel,float startacc) Wagon::Wagon(int id,int numpixels, Adafruit_NeoPixel *strip,uint8_t *height,float pos, float wagonlength,float startvel,float startacc)
{ {
_id = id; _id = id;
@ -12,6 +11,7 @@ Wagon::Wagon(int id,int numpixels, Adafruit_NeoPixel *strip,uint8_t *height,floa
_height=height; _height=height;
_vel=startvel; _vel=startvel;
_acc=startacc; _acc=startacc;
_spawntime=millis();
} }
@ -44,8 +44,7 @@ void Wagon::updatePhysics(float updatedelayms)
//rho Massendichte luft 1,2041 //rho Massendichte luft 1,2041
//A = 1m^2 //A = 1m^2
float m=50/_wagonlength; //mass of part of a wagon float m=40/_wagonlength; //mass of part of a wagon
_acc=0; _acc=0;
int cpos=(int)_pos; int cpos=(int)_pos;
@ -68,7 +67,7 @@ void Wagon::updatePhysics(float updatedelayms)
if (_vel<0){ if (_vel<0){
bb*=-1; bb*=-1;
} }
float cc=AIRRES/m*_vel*_vel; //air resistance float cc=AIRRES/m*pow(_vel,2); //air resistance
if (_vel<0){ if (_vel<0){
cc*=-1; cc*=-1;
} }
@ -84,34 +83,56 @@ void Wagon::updatePhysics(float updatedelayms)
} }
_acc*=updatedelayms/1000; _acc*=updatedelayms/1000;
_vel += _acc; _vel += _acc;
_pos += _vel/PIXELDISTANCE; _pos += _vel/PIXELDISTANCE;
/*Serial.print(" Vel="); Serial.print(" Vel=");
Serial.print(_vel); Serial.print(_vel);
Serial.print(" Acc="); Serial.print(" Acc=");
Serial.println(_acc);*/ Serial.println(_acc);
} }
float Wagon::getHeight(int p){ float Wagon::getHeight(int p){
if (p<0){ if (p<0){
p=0; //p=0;
return (-p)*10;
}else if(p>=_numpixels){ }else if(p>=_numpixels){
p=_numpixels-1; //p=_numpixels-1;
return (p-_numpixels)*10;
} }
return _height[p]; return _height[p];
} }
void Wagon::updateGraphics() void Wagon::updateGraphics()
{ {
for(int i=_pos;i>_pos-_wagonlength;i--){ float wagonfeathering=2;
uint32_t c=_strip->Color(0,255,0); for(int i=_pos+wagonfeathering;i>_pos-_wagonlength-wagonfeathering;i--){
if (i==int(_pos)){ float featherbrightness=1;
c=_strip->Color(0,255,100); if (i>_pos){ //in front of wagon
featherbrightness=1 - (i-_pos)/wagonfeathering;
}else if (i<_pos-_wagonlength){ //behind of wagon
featherbrightness=1 - (_pos-_wagonlength -i)/wagonfeathering;
} }
if (featherbrightness<=0){ //distpercent between 0 and 1. 1-> full brightness, 0-> feathering distance away
featherbrightness=0;
}
//uint32_t c=_strip->Color(0,255*featherbrightness,0);
//uint32_t c=Wheel(_height[i]/45.0*255,featherbrightness);
//uint8_t b=_height[i]*255/45;
uint8_t b=abs(_vel)*255.0;
uint32_t c=_strip->Color(b*featherbrightness,(255-b)*featherbrightness,0);
_strip->setPixelColor(i,c); _strip->setPixelColor(i,c);
} }
//_strip->setPixelColor(10,_strip->Color(255,0,0));
} }
int Wagon::pos() int Wagon::pos()
@ -124,11 +145,33 @@ int Wagon::id()
return _id; return _id;
} }
long Wagon::spawntime()
{
return _spawntime;
}
bool Wagon::alive() bool Wagon::alive()
{ {
if (_pos>_numpixels){ /*if (_pos>_numpixels){
return false;
}*/
if (millis()>_spawntime+30*1000){ //too old
return false; return false;
} }
return true; return true;
} }
uint32_t Wagon::Wheel(byte WheelPos,float brightness) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return _strip->Color(255 - WheelPos * 3*brightness, 0, WheelPos * 3*brightness);
}
if(WheelPos < 170) {
WheelPos -= 85;
return _strip->Color(0, WheelPos * 3*brightness, 255 - WheelPos * 3*brightness);
}
WheelPos -= 170;
return _strip->Color(WheelPos * 3*brightness, 255 - WheelPos * 3*brightness, 0);
}

View File

@ -13,8 +13,10 @@ class Wagon
void updatePhysics(float updatedelayms); void updatePhysics(float updatedelayms);
void updateGraphics(); void updateGraphics();
float getHeight(int p); float getHeight(int p);
uint32_t Wheel(byte WheelPos,float brightness);
int pos(); int pos();
int id(); int id();
long spawntime();
bool alive(); bool alive();
private: private:
int _numpixels; int _numpixels;
@ -24,6 +26,7 @@ class Wagon
float _acc; float _acc;
float _wagonlength; float _wagonlength;
uint8_t *_height; uint8_t *_height;
long _spawntime;
}; };
#endif #endif