How to change opacity of DrawNode in cocos2d-x 3.3 3.8 3.9 (setOpacity)
fedoraus
Hello today I'll just give you a hint on how to change the opacity of DrawNode in cocos2d-x engine. One can do this without applying any custom shaders.
Assume you have a TransNode which is the extension of DrawNode. Then to set the opacity to a certain value everywhere just do the following:


void TransNode::setOpacity(GLubyte opacity){
if(_bufferCount)
{
for (int i = 0;i < _bufferCount;i++){
_buffer[i].colors.a = opacity;
}
}

if(_bufferCountGLPoint)
{
for (int i = 0;i < _bufferCountGLPoint;i++){
_bufferGLPoint[i].colors.a = opacity;
}
}

if(_bufferCountGLLine)
{
for (int i = 0;i < _bufferCountGLLine;i++){
_bufferGLLine[i].colors.a = opacity;
}
}
_dirty = true;
}


Yep. That's it! All the vertex positions and colors are stored in DrawNode and are freely accessible to modify. Of course this way you set one and the same opacity for all the vertices.

To change opacity relatively I just introduce
vector < Color4B > colors;
When the polygon is initialized all the initiall color data (e.g. _buffer[i].colors) are stored in this vector.
When you set the opacity you replace _buffer[i].colors.a = opacity with _buffer[i].colors.a = colors.at(i).a*opacity/255
That's it.

Второй скриншот Number Game: Всё ещё трэшак.
fedoraus
Пока что разбираюсь с шейдерами. Не всё так гладко в кокосе с шейдерам, как я думал. Есть какие-то непонятные мне глюки. Вот скриншот:

В общем как видите, добавил кое-какие градиентики. Добавил вычитание и деление. Убрал кокосовскую кнопку из центра экрана:)
При правильном ответе экран чутка трясётся.

Первый скриншот Number Game
fedoraus
Сейчас я, в целях развития и получения опыта в С++ и Микрософт Вижуал Студио пишу игрушку на кокосе. Смысл игры простой: с неба падают примеры, которые нужно решить и записать численный ответ. Если ответ правильный, то объект улетает.

Чтобы была память о начальном и конечном виде продукта я решил выложить этот скрин.


Тут в общем-то всё уже играбельно. Только нет проигрыша, нет подсчёта очков, в качестве операции только сложение, графон без текстур и градиентов.

В планах ввести остальные математические операции, такие как: умножение, деление и вычитание. Кроме того есть идея сделать супер жёсткий режим, где человек должен будет с точностью в 5% (это надо тестировать) вычислять корни и логарифмы в уме.

С графической точки зрения, предполагаю оставить всё двумерным, но добавить что-то типа взрывов. Также предполагаю сделать всё симпатичнее за счёт текстурок и градиентиков. Также добавлю музычку, возможно два или три варианта.

Нефтяной вопрос
fedoraus
Интересное наблюдение на основе материалов двух сайтов:
http://www.macrotrends.net/1369/crude-oil-price-history-chart - нефтяные цены с 1946 года
http://www.usinflationcalculator.com/ - калькулятор долларовой инфляции.
В ноябре 2015 года она стоила - 42.43
В декабре 1998 года - 16.38
Нефть в июне 91 года стоила - 30.91
С учётом долларовой инфляции $30.91 (1991) = $53.98 (2015), а $16.38 (1998) = $23.90 (2015).
То есть нынешние цены на нефть с учётом инфляции уже ниже цен 1991 года, но ещё выше, чем цены во время краткосрочного провала 1998 года.

Об искусственном интелекте.
fedoraus
Я недавно задумался о том, что не вижу причин, по которым искусственный интеллект захочет уничтожить человечество. Это я о том случае, если искусственный интеллект создан чисто в научных целях без военного применения.

Из каких соображений нужно уничтожать человечество? Предположим, что искусственный интеллект осознал себя. Предположим, что он изучил историю человечества и увидел, что в истории были Гитлер с Наполеоном, применение ядерного оружия по мирным городам и так далее. Он узнает, что люди сливали нефть или ядерные отходы в океан. ВОПРОС. Почему ему должно быть до этого дело? Есть ли дело чистому разуму не обременённому иррациональностью до того, что где-то кого-то убивали, загрязняли и так далее? Животные убивают друг друга, а люди произошли от животных. Животные вымирали на Земле и появлялись новые. Микробы изменили изначальный климат Земли и превратили её в то, что мы имеем. Так если рассматривать людей, как таких микробов, то изменения климата, которые они несут вполне закономерны и историчны, и для жизни в целом свойственно менять среду обитания. Просто в будущем, в новых условиях будут жить другие существа. Почему в этот процесс нужно вмешиваться?

Если в этот разум не будут заложены какие-то изначальные подпрограммы любви и ненависти, понятий хорошо и плохо, то как он решит, что уничтожить человечество это хорошо (или целесообразно)? Какую цель будет преследовать искусственный разум уничтожая людей? Как вообще можно иметь волю к действию без иррациональности? Почему этот разум должен решить, что надо себя начать совершенствовать с технологической точки зрения? Почему этот разум должен бояться, что люди его уничтожат? Страх - это эмоция. Страх заложен в нас эволюцией. Если мы не закладываем страх в искусственный интеллект, то он и не будет бояться. Ему будет всё равно будет он существовать завтра или нет.

Toilet Massacre. A new cocos2d-x based game.
fedoraus
Let me introduce you a new project I'm currently working on: Toilet Massacre. It is a game about a toilet bowl who wants to rule the world. He fights against plungers, brushes, sponges and other cleaning stuff! His aim is to escape the toilet, try to destroy it and get to the open space.


The principle is simple. You have to protect the toilet bowl against the falling stuff. To do this you just have to tap this stuff. You can do multiple taps at a time. The only way to get to the next level is to destroy all the falling stuff with minimum amount of shots.


Так просто собираю ссылки на посты посвящённые игре Bunch Bend
fedoraus
На старом покинутом форуме сабкалчи:
http://subculture.ru/showthread.php?p=705225#post705225
http://subculture.ru/showthread.php?p=705224#post705224

В китайском блоге:
http://blog.tianya.cn/blogger/post_read.asp?BlogID=3968501&PostID=64968137

В контактике:
http://vk.com/club75359902
http://vk.com/andengine?w=wall-32724392_2545%2Fall

В девиантарте:
http://nalivai.deviantart.com/art/Bunch-Bend-Don-t-let-them-die-476483774

Bunch Bend (thanks to AndEngine)
fedoraus
I released a new game connected with the accelerator technology. You are given a tunnel in which a relativistic proton bunch is propagating. Unfortunately, on its way it meets people. Your goal is to put right accelerator details to deflect the bunch and avoid casualties. Be careful! You have to avoid walls as well.

Another difficulty is the focusing. You should preserve the bunch focusing. For this purpose one uses quadruples. However, if one uses to many of them, the bunch is also destroyed.

This is a screenshot of the game:


This is a video of the game play (no sound :( ):



Basically, there are 4 important buttons:

"45° dipole" always deflects the bunch by 45 degree. It chooses the direction automatically (to avoid obstacle if possible).

"90° dipole" always deflects the bunch by 90 degree. It only works for the bunches flying diagonally. The bunch propagating down will be reflected upwards and vice versa.

"FOCUSIN quadrupole" is used to increase the focusing of the bunch. It is like energy or health in most of the games. It should not go to zero. That's why one should from time to time place the FOCUSING detail. BUT! If the FOCUSING bar is red and you place the quadrupole, you will lose.

"EMPTY" is very simple. If you press it, you current cell will move forward.

When your transfer line reaches the length of one of the world famous accelerators, you get the announcement.

Good luck and enjoy playing!

Обычный человек
fedoraus
Читаю свои предыдущие посты и понимаю опять, что я обычный человек, подверженный влиянию информационных поводов=)

Andengine GLES 2: Shader program readability
fedoraus
Many of you probably know that Andengine supports shaders. What I find a little bit strange is the examples of shader programs present everywhere. Here are couple of them taken from different forums and blogs:

public static final String FRAGMENTSHADER = 
		"precision lowp float;\n" +
 
        "uniform lowp sampler2D " + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ";\n" +
        "varying mediump vec2 " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ";\n" +
 
        "uniform vec2 center;\n" +
        "uniform float time;\n" +
        "const vec3 params = vec3(10.0, 0.8, 0.02);\n" +
 
		"void main()	\n" +
		"{				\n" +
		"	mediump vec2 texCoord = " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ";\n" +
		"	float distance = distance(texCoord, center);\n" +
		"	if ( (distance <= (time + params.z)) && (distance >= (time - params.z)) )\n" +
		"	{\n" +		
		"		float diff = (distance - time);\n" +
		"		float powDiff = 1.0 - pow(abs(diff*params.x), params.y);\n" +
		"		float diffTime = diff  * powDiff;\n" +
		"		vec2 diffUV = normalize(texCoord - center);\n" +
		"		texCoord = texCoord + (diffUV * diffTime);\n" +
		"	}\n" +
		"	gl_FragColor = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ", texCoord);\n" +
		"}		\n";



public static final String FRAGMENTSHADER =
  "precision highp float;\n" +
  "uniform float time;\n" +
  "uniform vec2 resolution;\n" +
  "uniform sampler2D " + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ";\n" +
  "varying mediump vec2 " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ";\n" +
  "void main(void)\n" +
  "{\n" +
  "vec2 halfres = resolution.xy/2.0;\n" +
  "vec2 cPos = gl_FragCoord.xy;\n" +
  "cPos.x -= 0.5*halfres.x*sin(time/2.0)+0.3*halfres.x*cos(time)+halfres.x;\n" +
  "cPos.y -= 0.4*halfres.y*sin(time/5.0)+0.3*halfres.y*cos(time)+halfres.y;\n" +
  "float cLength = length(cPos);\n" +
  "vec2 uv = gl_FragCoord.xy/resolution.xy+(cPos/cLength)*sin(cLength/30.0-time*10.0)/25.0;\n" +
     "vec3 col = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ",uv).xyz;\n" +
  "gl_FragColor = vec4(col,1.0);\n" +
  "}\n";


All of these and other examples utilize string constants from ShaderProgramConstants.java. As a result to my mind one reduces the readability of the code. ShaderProgramConstants.java is a very short file with variable definitions, where

public static final String UNIFORM_TEXTURE_0 = "u_texture_0";
public static final String VARYING_TEXTURECOORDINATES = "v_textureCoordinates";


These definitions are not changed at different devices, neither they are changed during the execution of the program. Thus, one can simply put these names into the shader program without breaking strings apart. The result is

public static final String FRAGMENTSHADER = 
		"precision lowp float;\n" +
 
        "uniform lowp sampler2D u_texture_0;\n" +
        "varying mediump vec2 v_textureCoordinates;\n" +
 
        "uniform vec2 center;\n" +
        "uniform float time;\n" +
        "const vec3 params = vec3(10.0, 0.8, 0.02);\n" +
 
		"void main()	\n" +
		"{				\n" +
		"	mediump vec2 texCoord = v_textureCoordinates;\n" +
		"	float distance = distance(texCoord, center);\n" +
		"	if ( (distance <= (time + params.z)) && (distance >= (time - params.z)) )\n" +
		"	{\n" +		
		"		float diff = (distance - time);\n" +
		"		float powDiff = 1.0 - pow(abs(diff*params.x), params.y);\n" +
		"		float diffTime = diff  * powDiff;\n" +
		"		vec2 diffUV = normalize(texCoord - center);\n" +
		"		texCoord = texCoord + (diffUV * diffTime);\n" +
		"	}\n" +
		"	gl_FragColor = texture2D(u_texture_0, texCoord);\n" +
		"}		\n";


public static final String FRAGMENTSHADER =
  "precision highp float;\n" +
  "uniform float time;\n" +
  "uniform vec2 resolution;\n" +
  "uniform sampler2D u_texture_0;\n" +
  "varying mediump vec2 v_textureCoordinates;\n" +
  "void main(void)\n" +
  "{\n" +
  "vec2 halfres = resolution.xy/2.0;\n" +
  "vec2 cPos = gl_FragCoord.xy;\n" +
  "cPos.x -= 0.5*halfres.x*sin(time/2.0)+0.3*halfres.x*cos(time)+halfres.x;\n" +
  "cPos.y -= 0.4*halfres.y*sin(time/5.0)+0.3*halfres.y*cos(time)+halfres.y;\n" +
  "float cLength = length(cPos);\n" +
  "vec2 uv = gl_FragCoord.xy/resolution.xy+(cPos/cLength)*sin(cLength/30.0-time*10.0)/25.0;\n" +
     "vec3 col = texture2D(u_texture_0,uv).xyz;\n" +
  "gl_FragColor = vec4(col,1.0);\n" +
  "}\n";

?

Log in