это у вас соседей нету
В первом же ответе я поинтересовался: что такое приложение и зачем оно нужно.
В ответ - молчок.
Вы можете безо всяких этих
просто ответить на сформулированные выше вопросы?
Что такое приложение форума?
Зачем оно нужно?
Я дам ТЗ на приложение форума, которым я бы с удовольствием пользовался. Главная задача - работать оффлайн (только чтение, естественно). Запускается, по последним темам (и по избранным, и еще по пользовательским критериям) потихоньку начинает засасывать историю пока есть связь и в пределах выделенных приложению ресурсов по хранилищу. Если для каждого чиха нужен интернет, пользы никакой от приложения.
То есть по сути сделать из И-нета Фидо?
Почему же? При наличии связи обычный онлайн-форум. А при отсутствии (сейчас это не редкость), можно продолжать читать интересные темы. Ну и в дороге: поезд, самолет - бывает на несколько часов без связи.
А чо, есть другие преимущества приложения перед тем что есть сейчас?
Нормальные люди решают причины, иные последствия и пытаются приспособляться под них.
Нормальные люди обсуждают тему. Пишут свое мнение, хотелки и т.д. .
Если у Вас есть конкретные предложения, то мы их обсудим.
Если Вы против создания приложения, то напишите - это так же будет понятно.
Если у Вас нет мыслей, то стоит не писать вообще, чтобы не засорять тему.
Для начала хотелось бы получить ответы на вопросы:
Что такое приложение форума?
Зачем оно нужно?
До того, как появятся ответы на эти вопросы, обсуждать нечего.
В движке форума уже можно сказать реализовано приложение. То что называется Progressive Web App (PWA)
В хроме в меню можно кликнуть “Add to home screen”/“Добавить на главный экран” и у вас появится иконка. Кликаете на нее и открывается форум как приложение, конечно он крутится на движке хрома, но без меню браузера и ощущается по другом. Плюс кэширует, чтобы работало без связи.
Что-либо накручивать еще, если честно не вижу смысла. Потом нужно будет отслеживать каждое обновление движка, чтобы ничего не сломалось в приложение и много других сложностей.
Я бы не создал темы, если бы по клику на значке “приложения” не выскакивала менюшка с установкой chrome. Через простой заход через chrome опять выскакивала установка/обновление. Прибил “приложение” и все заработало.
Без связи не сохраняет - проверено.
Приложение на java, которое запускается и подключается к форуму. Если нет связи (причины могут быть разными) выдавало сообщение, что нет связи. Из опыта работы многие забывают, что безлимитные соцсети еще не весь интернет и надо пополнить баланс.
В оффлайн режиме можно почитать старые темы, которые посещал. Темы разбиты по страницам и каждое сообщение имеет номер (удобно кидать ссылку на конкретное сообщение). Весь приведенный код хотелось бы отфильтровать, как отдельные сообщения, чтобы к концу обсуждаемой темы можно было собрать конечный код, который бы ложился в библиотеку. Далее бы родился каталог с кодом для различных целей. Его можно было бы собирать в разделе readonly с возможностью обновления уполномоченным или автором. И последний шаг - параметризация кода для последующей компиляции.
Для этого и хотелось бы сделать коннектор для приложения, чтобы обмен шел короткими сообщениями и на стороне сервера все раскладывалось по полочкам. Можно сделать отдельный instance с postgres и из него уже перекладывать в бд форума информацию. Тем самым бд форума можно не трогать в плане доработок (промежуточный backend).
А можно скриншот с местом меню? Облазил весь хром не нашёл ![]()
Вы считаете пользователей такими мазохистами? С телефона прямо прелесть как удобно это делать, программировать (что только жизнь не заставляла делать…). Не, ну блинк-то еще можно.
Дело даже не в удобстве.
В типичной ветке куски кода из разных сообщений никогда не составят библиотеку, потому как часть из них будут повторением одного и того же, а другая - противоречить другу другу.
Код не пишется тупым сложением фрагментов. Из двадцати шакалов не составить одного льва, как ни крути.
Я показывал выше. Сообщение #15 и #12
Поговаривают, у обезьянок с привлечением внешнего мозга блинк иногда получается…
А кто говорит, что надо тупо складывать куски кода? Куски кода удобно обрабатывать, если они отдельно, а не среди текста. Публиковать отдельно исправленные куски. Поддержать версионность в редактировании. Цель же получить рабочий код на выходе.
Очень советую почитать - GLODING PROGRAMMING (Программирование снизу вверх наискосок)
Что, правда советуете? И даже “очень”? Почитать текст почти полувековой давности (к тому же, ещё и не оригинальный) про
И с какой, простите, целью это читать?
Ну да. Оригинальный текст был оптимизирован под принтер к ЕС ЭВМ, где маленьких букв не было.
Приведенная вами девушка а существующих реалиях - ИИ, которым пытаются пользоваться.
Ценность писульки - прграммист должен уметь разбираться в чужом коде и приводить его в приличный вид - “никакой модульности”. ![]()
Какой глубокий житейский смысл бытия!
Форматировать? Как он может разобраться в замысле автора, не зная аппаратный замысел, сценарий работы? Много тут опытному программисту понятно ? ![]()
Спойлер
//вывод картинок на дисплеи
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include "ris_0.h"//файл хранения массивов графики
#define TFT_CS 5 //не используется по назначению
#define TFT_RST 13 // (RES)
#define TFT_DC 12 // (RS)
#define TFT_CS1 4 // выводы для коммутации дисплеев
#define TFT_CS2 26
#define TFT_CS3 25
#define TFT_CS4 17
// TFT_SCL 18
// TFT_SDA 23
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);//
#define TFT_SCLK 18 // set these to be whatever pins you like!
#define TFT_MOSI 32 // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);//
byte massiv_model[5][8]={ {0,0,0,0,0,0,0,0},//массив-модель игрового поля
{2,1,5,4,8,0,6,8},
{1,7,3,7,5,6,5,5},
{1,2,3,4,2,4,1,2},
{1,2,6,4,3,2,3,3},
};
const struct {
const unsigned char *bitmap;
}
schar_[]={ris_pusto,ris_schar1,ris_schar2,ris_schar3,ris_schar4,ris_schar5,ris_schar6,ris_schar7,ris_schar8};// картинки шариков
bool fl_scharik=false;//флаг состояния - все шарики в колбах (false) или шарик вынут (true)
int st=0;//счётчик ходов в игре
int zd=0;//счётчик для смены задания игры при 4 кратной попытке поместить шарик в полную колбу
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
void zadanie_1(){
//предполагаемый результат выполнения задания виден несколько секунд
st=0;//обнуление счётчика ходов
byte N=millis()%200;// псевдослучайное число
for(int q=0;q<8;q++){
for(int e=1;e<5;e++){
massiv_model[e][q]=q+1;
}
}
for(int e=0;e<8;e++){
massiv_model[0][e]=0;
}
massiv_model[1][5]=0;
massiv_model[1][2]=0;
massiv_model[1][3]=0;
massiv_model[1][4]=0;
ris_model();
delay(4000);
//перемешивание шаров в колбах
for(int e=0;e<222+N;e++){
byte str_1=random(2,5);
byte sto_1=random(0,8);
byte c= massiv_model[str_1][sto_1];
byte str_2=random(2,5);
byte sto_2=random(0,8);
massiv_model[str_1][sto_1] = massiv_model[str_2][sto_2];
massiv_model[str_2][sto_2]=c;
}
ris_model();
}
//////////////////////////////////////////////////////////
//массив функций
typedef void (* TFunction)(void);
TFunction massiv_fun[]={zadanie_1};
//
void setup() {
pinMode(TFT_CS1, OUTPUT);
pinMode(TFT_CS2, OUTPUT);
pinMode(TFT_CS3, OUTPUT);
pinMode(TFT_CS4, OUTPUT);
on_disp();
tft.initR(INITR_BLACKTAB);
tft.setRotation(2);
off_disp();
ris_fon();//отрисовка фонового изображения на всех дисплеях
zadanie_1();// 1 задание
}
void loop() {
knopki();
delay(20);
}
/////////////////////////////////////////////////////////////////
void drawFoto(int x,int y, const uint8_t *bitmap,int w,int h) {//функция вывода фотокартинки
if(x<0||x+w>128||y<0||y+h>160){return;}
tft.setAddrWindow(x,y,x+w-1,y+h-1);
SPI.beginTransaction(SPISettings(40000000, MSBFIRST, SPI_MODE0));
digitalWrite(TFT_DC, HIGH);
digitalWrite(TFT_CS, LOW);
for(int j=0; j<h; j++) {
for(int i=0; i<2*w; i=i+2) {
SPI.transfer(bitmap[i+1+j*2*w]);SPI.transfer(bitmap[i+j*2*w]);
// SPI.transfer(pgm_read_byte(bitmap+i+1+j*2*w));SPI.transfer(pgm_read_byte(bitmap+i+j*2*w));
}
}
digitalWrite(TFT_CS, HIGH);
SPI.endTransaction();
///
}
///////////////////////////////////////////////////////////////
void on_disp(){//включить приём на все дисплеи
digitalWrite(TFT_CS1,LOW);
digitalWrite(TFT_CS2,LOW);
digitalWrite(TFT_CS3,LOW);
digitalWrite(TFT_CS4,LOW);
}
///////////////////////////////////////////////////////////////
void off_disp(){//отключить приём на все дисплеи
digitalWrite(TFT_CS1,HIGH);
digitalWrite(TFT_CS2,HIGH);
digitalWrite(TFT_CS3,HIGH);
digitalWrite(TFT_CS4,HIGH);
}
///////////////////////////////////////////////////////////////
void ris_scharik(int stroka,int stolbez){// функция отрисовки шарика или пусто-места на игровом поле по его положению в массиве-модели
if(stolbez==0||stolbez==1){digitalWrite(TFT_CS1,LOW);}
if(stolbez==2||stolbez==3){digitalWrite(TFT_CS2,LOW);}
if(stolbez==4||stolbez==5){digitalWrite(TFT_CS3,LOW);}
if(stolbez==6||stolbez==7){digitalWrite(TFT_CS4,LOW);}
if(stolbez%2==0){drawFoto(15,7+30*stroka,schar_[massiv_model[stroka][stolbez]].bitmap,35,25);}else{drawFoto(15+64,7+30*stroka,schar_[massiv_model[stroka][stolbez]].bitmap,35,25);}
off_disp();
}
//////////////////////////////////////////////////////////
void ris_model(){// функция отрисовки всей модели-массива
for(int i=0;i<5;i++){
for(int j=0;j<8;j++){
ris_scharik(i,j);
}
}
}
//////////////////////////////////////////////////////////
void ris_scharik(int stroka,int stolbez,byte cvet){// функция отрисовки шарика или пусто-места на игровом поле по значению его цвета
if(stolbez==0||stolbez==1){digitalWrite(TFT_CS1,LOW);}
if(stolbez==2||stolbez==3){digitalWrite(TFT_CS2,LOW);}
if(stolbez==4||stolbez==5){digitalWrite(TFT_CS3,LOW);}
if(stolbez==6||stolbez==7){digitalWrite(TFT_CS4,LOW);}
if(stolbez%2==0){drawFoto(15,7+30*stroka,schar_[cvet].bitmap,35,25);}else{drawFoto(15+64,7+30*stroka,schar_[cvet].bitmap,35,25);}
off_disp();
}
//////////////////////////////////////////////////////////
void ris_polet_scharik(int stolbez_1,int stolbez_2,byte cvet,int T){//функция анимации полёта шарика из стобца 1 в столбец 2 заданного цвета и скорости
while(stolbez_1!=stolbez_2){
if(stolbez_2>=stolbez_1){
ris_scharik(0,stolbez_1+1,cvet);ris_scharik(0,stolbez_1,0);delay(T);
stolbez_1++;
}
else{
ris_scharik(0,stolbez_1-1,cvet);ris_scharik(0,stolbez_1,0);delay(T);
stolbez_1--;
}
}
}
//////////////////////////////////////////////////////////
void knopki(){// функция отработки нажатия кнопок - игровая анимация шариков
//
int val=analogRead(34);//чтение кнопочной станции
int VAL=0;//
if(val<50){VAL=1;}
if(val>100&&val<400){VAL=2;}
if(val>400&&val<800){VAL=3;}
if(val>800&&val<1400){VAL=4;}
if(val>1400&&val<2400){VAL=5;}
if(val>2400&&val<3100){VAL=6;}
if(val>3100&&val<3500){VAL=7;}
if(val>3500&&val<3900){VAL=8;}
//
if(VAL!=0){
for(int w=0;w<8;w++){
if(VAL==w+1){
// massiv_model[0][0]=w+1;ris_scharik(0,0);
if(fl_scharik==false){
for(int k=1;k<5;k++){//ищем и поднимаем шарик из колбы
if(massiv_model[k][w]!=0){massiv_model[0][w]=massiv_model[k][w];massiv_model[k][w]=0;ris_scharik(0,w);ris_scharik(k,w);fl_scharik=true;st++;goto metka;}
}
}
else{
for(int k=0;k<8;k++){
if(massiv_model[0][k]!=0){//если нашли поднятый над колбой шарик
for(int s=4;s>0;s--){
if(massiv_model[s][w]==0){//если в выбранной колбе оказалось место
if(w!=k){
massiv_model[0][w]=massiv_model[0][k];massiv_model[0][k]=0; ris_polet_scharik(k,w,massiv_model[0][w],75);
// massiv_model[0][w]=massiv_model[0][k];massiv_model[0][k]=0;ris_scharik(0,w);ris_scharik(0,k);delay(250);
}
massiv_model[s][w]=massiv_model[0][w];massiv_model[0][w]=0;ris_scharik(s,w);ris_scharik(0,w);fl_scharik=false;goto metka;
}
}
for(int s=4;s>0;s--){
if(massiv_model[s][k]==0){massiv_model[s][k]=massiv_model[0][k];massiv_model[0][k]=0;ris_scharik(s,k);ris_scharik(0,k);fl_scharik=false;zd++;if(zd>3){zad_N();}goto metka;}//возврат шарика в исходную колбу если места в указанной не оказалось
}
}
}
}
}
}
metka:
delay(200);
}
delay(20);
}
//////////////////////////////////////////////////////////
void zad_N(){//функция смены задания
zd=0;
massiv_fun[millis()%(sizeof(massiv_fun)/sizeof(massiv_fun[0]))]();// псевдослучайный выбор задания-уровня
}
/////////////////////////////////////////////////////////////////
void ris_fon (){
on_disp();
// tft.fillScreen(tft.Color565(255,255,255));
drawFoto(0,0,ris_kolba,64,160);
drawFoto(64,0,ris_kolba,64,160);
off_disp();
int w=12;int h=107;int d=8;
digitalWrite(TFT_CS1,LOW);
tft.fillRect(1+d,50,w,h,tft.Color565(0,66,255));
tft.fillRect(64+d,50,w,h,tft.Color565(255,0,0));
digitalWrite(TFT_CS1,HIGH);
digitalWrite(TFT_CS2,LOW);
tft.fillRect(1+d,50,w,h,tft.Color565(50,30,20));
tft.fillRect(64+d,50,w,h,tft.Color565(250,200,0));
digitalWrite(TFT_CS2,HIGH);
digitalWrite(TFT_CS3,LOW);
tft.fillRect(1+d,50,w,h,tft.Color565(198,188,176));
tft.fillRect(64+d,50,w,h,tft.Color565(195,1,255));
digitalWrite(TFT_CS3,HIGH);
digitalWrite(TFT_CS4,LOW);
tft.fillRect(1+d,50,w,h,tft.Color565(28,200,22));
tft.fillRect(64+d,50,w,h,tft.Color565(0,193,184));
digitalWrite(TFT_CS4,HIGH);
}
/////////////////////////////////////////////////////////////////
Особенно без комментариев.