Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/992: Рейтинг темы: голосов - 992, средняя оценка - 4.61
1849 / 706 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
1

Несколько небольших игрушек

08.02.2010, 23:16. Просмотров 200466. Ответов 213
Метки нет (Все метки)

Я тут решил повылаживать некоторые примеры моего творчества на заре знакомства с Билдером. Некоторые я уже тут выкладывал, некоторые нет, но я решил выложить все в одном месте. Может быть кому-нибудь поможет, может быть кто-нибудь подчерпнет для себя что-то…
В общем, смотрите, берите если нужно.
52
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2010, 23:16
Ответы с готовыми решениями:

Несколько небольших вопросов
1) отличаются ли чем-нибудь A и B и если ничем не отличаются, то когда "красивее" что использовать?...

Несколько небольших вопросов по С++
Здраствуйте уважаемые форумчани. У меня есть несколько вопросов, на которые я ответить не смог, но...

Несколько небольших вопросов
1. Если у меня есть поле типа enum с несколькими значениями, то как я могу получить через php...

Несколько игрушек не устанавливаются
при установке игры через установщик windows , при распаковке вылетает- исходный файл повреждён....

213
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
03.07.2017, 09:49 181
Цитата Сообщение от Croessmah Посмотреть сообщение
я бы звук сделал потише.
Я поставил все звуки на 0.3, а выстрел на 0.2. Сейчас музыка сначала тихо звучит, потом громче.
0
Don't worry, be happy
16958 / 9839 / 1895
Регистрация: 27.09.2012
Сообщений: 24,392
Записей в блоге: 2
03.07.2017, 09:53 182
8Observer8, а музыка и звуки из каких источников? Или самописные?
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
03.07.2017, 10:13 183
Звуки - не знаю, а музыку сделал человек под ником HLG, как это написано на страничке под оригинальной игрой. Кстати, я показал свой порт автору игры, он добавил ссылку на мою версию под своей игрой. Я всего лишь подправил его код под TypeScript и добавил вывод 3D моделей вместо 2D спрайтов. Исходники залил на GitHub: https://github.com/8Observer8/Bitballoon3D
1
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
19.12.2017, 09:20 184
Перевёл код из тутора Создание игр на C++: Змейка на шейдерный OpenGL 3.0

youtube


Несколько небольших игрушек

  • Окно создаётся с помощью SDL2
  • Для транформаций и прочей математики используется библиотека GLM
  • Для расширений использутся GLAD

Проект для VS2015 со всеми подключёнными библиотеками: Snake_FamTrinliToOpenGL33.zip

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
#include <glad/glad.h>
#include <SDL.h>
 
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/transform.hpp>
 
#include <vector>
#include <string>
#include <iostream>
 
enum class GameState { PLAY, EXIT };
 
class Color
{
public:
    GLfloat r, g, b;
    Color(GLfloat r, GLfloat g, GLfloat b) :
        r(r), g(g), b(b)
    {
    }
};
 
class Point
{
public:
    GLfloat x, y;
    Point(GLfloat x, GLfloat y) :
        x(x), y(y)
    {
    }
};
 
void initVertexBuffers();
GLuint createShaderProgram();
 
void drawSquare(const glm::vec3 &pos, const Color &color, GLfloat size = 1.0f, GLfloat angle = 0.0f);
 
GameState g_gameState = GameState::PLAY;
SDL_Window *g_window;
GLuint g_vao;
GLuint g_program;
 
float g_frameTime;
float g_maxFPS = 3.0f;
float g_fps;
 
const int N = 30;
const int M = 20;
 
const int SCALE = 25;
 
const int W = SCALE * N;
const int H = SCALE * M;
 
int dir, num = 4;
 
struct
{
    int x, y;
} s[100];
 
class Fruits
{
public:
    int x, y;
 
    void createNew()
    {
        x = rand() % N;
        y = rand() % M;
    }
 
    void drawFruit()
    {
        drawSquare(glm::vec3(x * SCALE, y * SCALE, 0.0f), Color(0.0f, 1.0f, 0.0f), SCALE);
    }
} m[10];
 
const char *vertexShaderSource =
"#version 130 core\n"
 
"in vec2 a_position;"
 
"uniform mat4 u_mvp;"
 
"void main()"
"{"
"    gl_Position= u_mvp * vec4(a_position, 0.0, 1.0);"
"}";
 
const char *fragmentShaderSource =
"#version 130 core\n"
"precision mediump float;"
 
"in vec3 v_Color;"
"out vec4 fragColor;"
 
"uniform vec3 u_color;"
 
"void main()"
"{"
"    fragColor = vec4(u_color, 1.0);"
"}";
 
void fatalError(std::string errorString)
{
    std::cout << errorString << std::endl;
    std::cout << "Enter any key to quit..." << std::endl;
    int tmp;
    std::cin >> tmp;
    SDL_Quit();
    exit(1);
}
 
void processInput()
{
    SDL_Event event;
 
    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                g_gameState = GameState::EXIT;
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_w:
                        dir = 0;
                        break;
                    case SDLK_a:
                        dir = 1;
                        break;
                    case SDLK_s:
                        dir = 2;
                        break;
                    case SDLK_d:
                        dir = 3;
                        break;
                }
                break;
        }
    }
}
 
void setGeneralInfo(const glm::vec3 &pos, const Color &color, const glm::vec3 &scale, GLfloat angle)
{
    // Rotate
    GLfloat radian = glm::radians(angle);
    glm::mat4 xformRotateMatrix = glm::rotate(radian, glm::vec3(0.0f, 0.0f, 1.0f));
 
    // Translate
    glm::mat4 xformTranslateMatrix = glm::translate(glm::mat4(), pos);
 
    // Scale
    glm::mat4 xformScaleMatrix = glm::scale(glm::vec3((scale.x, scale.y, scale.z)));
 
    // Set Matrixes
    glm::mat4 projMatrix = glm::ortho(0.0f, (float)W, 0.0f, (float)H, 100.0f, -100.0f);
    glm::mat4 viewMatrix = glm::lookAt(
        glm::vec3(0.0f, 0.0f, 3.0f),    // Camera position
        glm::vec3(0.0f, 0.0f, 0.0f),    // Looks at the origin
        glm::vec3(0.0f, 1.0f, 0.0f));   // Head is up
    glm::mat4 modelMatrix = xformTranslateMatrix * xformRotateMatrix * xformScaleMatrix;
    //glm::mat4 modelMatrix = glm::scale(xformTranslateMatrix, glm::vec3(50.0, 50.0f, 50.0f));
 
    // Set MVP
    glm::mat4 mvp = projMatrix * viewMatrix * modelMatrix;
    GLint u_mvp = glGetUniformLocation(g_program, "u_mvp");
    glUniformMatrix4fv(u_mvp, 1, false, &mvp[0][0]);
 
    // Set Color
    GLint u_color = glGetUniformLocation(g_program, "u_color");
    glUniform3f(u_color, color.r, color.g, color.b);
}
 
void drawSquare(const glm::vec3 &pos, const Color &color, GLfloat size /*= 1.0f*/, GLfloat angle /*= 0.0f*/)
{
    setGeneralInfo(pos, color, glm::vec3(size, size, size), angle);
 
    // Draw
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
 
void drawLine(Point p1, Point p2, const Color &color)
{
    Point center(p1.x + (p2.x - p1.x) / 2.0f, p1.y + (p2.y - p1.y) / 2.0f);
 
    GLfloat a = p2.y - p1.y;
    GLfloat b = p2.x - p1.x;
    GLfloat tan = a / b;
    GLfloat angle = glm::degrees(glm::atan(tan));
    GLfloat length = glm::length(glm::vec2(b, a));
    
    setGeneralInfo(
        glm::vec3(center.x, center.y, 0.0f),
        color,
        glm::vec3(1.0f, 1.0f, length),
        angle);
    glDrawArrays(GL_LINES, 4, 2);
}
 
void drawField()
{
    Color color(0.0f, 1.0f, 0.0f);
 
    for (size_t i = 0; i < W; i += SCALE)
    {
        drawLine(Point(i, 0.0f), Point(i, H), color);
    }
 
    for (size_t j = 0; j < H; j += SCALE)
    {
        drawLine(Point(0.0f, j), Point(W, j), color);
    }
}
 
void drawSnake()
{
    for (size_t i = 0; i < num; i++)
    {
        drawSquare(glm::vec3(s[i].x * SCALE, s[i].y * SCALE, 0.0f), Color(0.0f, 0.0f, 1.0f), SCALE);
    }
}
 
void display()
{
    // Clear a screen
    glClear(GL_COLOR_BUFFER_BIT);
 
    // Set a viewport on whole screen
    glViewport(0, 0, W, H);
 
    for (size_t i = 0; i < 10; i++)
    {
        m[i].drawFruit();
    }
 
    drawField();
 
    drawSnake();
 
    SDL_GL_SwapWindow(g_window);
}
 
void calculateFPS()
{
    static const int NUM_SAMPLES = 10;
    static float frameTimes[NUM_SAMPLES];
    static int currentFrame = 0;
 
    static float prevTicks = SDL_GetTicks();
    float currentTicks;
    currentTicks = SDL_GetTicks();
 
    g_frameTime = currentTicks - prevTicks;
    frameTimes[currentFrame % NUM_SAMPLES] = g_frameTime;
 
    prevTicks = currentTicks;
 
    int count;
    currentFrame++;
 
    if (currentFrame < NUM_SAMPLES)
    {
        count = currentFrame;
    }
    else
    {
        count = NUM_SAMPLES;
    }
 
    float frameTimeAverage = 0;
    for (int i = 0; i < count; i++)
    {
        frameTimeAverage += frameTimes[i];
    }
    frameTimeAverage /= count;
 
    if (frameTimeAverage > 0)
    {
        g_fps = 1000.0f / frameTimeAverage;
    }
    else
    {
        g_fps = 60.0f;
    }
}
 
void tick()
{
    for (size_t i = num; i > 0; --i)
    {
        s[i].x = s[i - 1].x;
        s[i].y = s[i - 1].y;
    }
 
    if (dir == 0)
    {
        s[0].y += 1;
    }
    if (dir == 1)
    {
        s[0].x -= 1;
    }
    if (dir == 2)
    {
        s[0].y -= 1;
    }
    if (dir == 3)
    {
        s[0].x += 1;
    }
 
    for (size_t i = 0; i < 10; i++)
    {
        if ((s[0].x == m[i].x) && (s[0].y == m[i].y))
        {
            num++;
            m[i].createNew();
        }
    }
 
    if (s[0].y > M)
    {
        dir = 2;
    }
 
    if (s[0].x < 0)
    {
        dir = 3;
    }
 
    if (s[0].y < 0)
    {
        dir = 0;
    }
 
    if (s[0].x > N)
    {
        dir = 1;
    }
 
    for (size_t i = 1; i < num; i++)
    {
        if (s[0].x == s[i].x && s[0].y == s[i].y)
        {
            num = i;
        }
    }
}
 
void gameLoop()
{
    while (g_gameState != GameState::EXIT)
    {
        processInput();
        float startTicks = SDL_GetTicks();
 
        tick();
        
        display();
 
        calculateFPS();
        // Print only once every 10 frames
        static int frameCounter = 0;
        frameCounter++;
        if (frameCounter == 10)
        {
            std::cout << g_fps << std::endl;
            frameCounter = 0;
        }
 
        float frameTicks = SDL_GetTicks() - startTicks;
        // Limit the FPS to the max FPS
        if (1000.0f / g_maxFPS > frameTicks)
        {
            SDL_Delay(1000.0f / g_maxFPS - frameTicks);
        }
    }
 
    SDL_DestroyWindow(g_window);
 
    SDL_Quit();
}
 
int main(int argc, char **argv)
{
    SDL_Init(SDL_INIT_EVERYTHING);
 
    g_window = SDL_CreateWindow(
        "Snake FamTrinli To OpenGL 3.0",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        W, H,
        SDL_WINDOW_OPENGL);
 
    if (g_window == nullptr)
    {
        fatalError("SDL Window could not be created");
    }
 
    SDL_GLContext glContext = SDL_GL_CreateContext(g_window);
    if (glContext == nullptr)
    {
        fatalError("SDL_GL context could not be created");
    }
 
    if (!gladLoadGL())
    {
        fatalError("Could not initialize glad!");
    }
 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
 
    g_program = createShaderProgram();
    initVertexBuffers();
 
    for (size_t i = 0; i < 10; i++)
    {
        m[i].createNew();
    }
 
    s[0].x = 10;
    s[0].y = 0;
    for (size_t i = 1; i < num; i++)
    {
        s[i].x = s[0].x;
        s[i].y = s[i - 1].y - 1;
    }
 
    gameLoop();
    return 0;
}
 
GLuint createShader(const char *shaderSource, int shaderType)
{
    GLuint shader = glCreateShader(shaderType);
    glShaderSource(shader, 1, &shaderSource, NULL);
    glCompileShader(shader);
    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    if (status == GL_FALSE)
    {
        GLint maxLength = 0;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
        std::vector<GLchar> errorLog(maxLength);
        glGetShaderInfoLog(shader, maxLength, &maxLength, &errorLog[0]);
        glDeleteShader(shader); // Don't leak the shader.
        std::printf("%s\n", &(errorLog[0]));
        fatalError("Shader failed to compile");
    }
    return shader;
}
 
GLuint createShaderProgram()
{
    GLuint program = glCreateProgram();
    GLuint vShader = createShader(vertexShaderSource, GL_VERTEX_SHADER);
    GLuint fShader = createShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
 
    glAttachShader(program, vShader);
    glAttachShader(program, fShader);
    glLinkProgram(program);
    glUseProgram(program);
 
    return program;
}
 
void initVertexBuffers()
{
    GLfloat vertices[] = {
        0.0f, 1.0f,    // Square
        0.0f, 0.0f,
        1.0f, 1.0f,
        1.0f, 0.0f,
        -0.5f, 0.0f,    // Line
        0.5f, 0.0f
    };
 
    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    int numVertices = sizeof(vertices) / sizeof(vertices[0]);
    glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
 
    glGenVertexArrays(1, &g_vao);
    glBindVertexArray(g_vao);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
 
    GLint a_position = glGetAttribLocation(g_program, "a_position");
    glVertexAttribPointer(a_position, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(a_position);
}
1
77 / 78 / 48
Регистрация: 12.10.2013
Сообщений: 1,044
20.04.2018, 21:10 185
Otaka,охотно изучу ваши коды игр.Это всё интересно.Какую IDE Вы использовали для написания игр ??? А на C# у вас есть что-нибудь???
0
Evg
21.04.2018, 00:14
  #186

Не по теме:

Веселый, он уже три года на форуме не появлялся

0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
30.04.2018, 11:40 187
Текстовый тутор по Арканойду: 2D breakout game using pure JavaScript

Я переписал код на TypeScript.

Исходники на GitHub
Исходники в архиве: breakout-port-from-mozilla-to-typescript.zip

>> Игровая демка <<
0
0 / 0 / 0
Регистрация: 18.01.2017
Сообщений: 10
14.05.2018, 03:01 188
Ребят, а такой вопрос. Можете создать простейшую игру виселицу (буквы вводить с клавиатуры) для формы Builder С++?
Очень нужно, а у самой таких познаний нет. Если можно, то просто проект - грубо говоря Unit и Form.
0
0 / 0 / 0
Регистрация: 05.08.2018
Сообщений: 1
05.08.2018, 14:51 189
Я тоже сделал и выложил простейшую мобильную игру, название Seconder
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
03.12.2018, 11:32 190
Змейка 2D на WebGL 1.0 и TypeScript

Игровая демка и исходники в песочнице: >> Клик, чтобы поиграть <<<
Исходники на GitHub
Исходники в архиве: snake2d-perspective-camera-sounds.zip



Описание:
  • Музыка и звуки с помощью HTMLAudioElement
  • Графика с помощью WebGL 1.0 и GLSL
  • Трансформации с помощью математической библиотеки glMatrix
  • Язык программирования TypeScript
  • Настроена компиляция из TS в ES5
  • Настроена установка точек останова и пошаговое выполнение в среде VSCode с использованием Source Maps
  • Настроена загрузка AMD-модулей в браузер с помощью библиотеки RequireJS

Запуск игры локально из исходников, при условии, что установлен Node.js
  • Скачать архив по ссылкам выше
  • Перейти в папку с игрой из консоли
  • Набрать в консоле команду: npm install
  • Набрать в консоле команду: tsc
  • Запустить index.html по localhost с сервера
0
0 / 0 / 0
Регистрация: 15.12.2018
Сообщений: 3
16.12.2018, 00:02 191
Вот моя реализация пятнашек в динамике, кому интересно чекните
https://github.com/kremlev404/... **15shki.c
0
8 / 14 / 0
Регистрация: 24.07.2018
Сообщений: 103
22.02.2019, 10:23 192
Раз на то пошло, вот и моя C++ SFML игра, уже на GameJolt висит:
WhiteLight.zip
Никогда не было интересно создавать уже созданное.
1
1 / 1 / 0
Регистрация: 26.10.2016
Сообщений: 75
08.10.2019, 21:56 193
XONIX TETRIS

0
1 / 1 / 0
Регистрация: 26.10.2016
Сообщений: 75
19.10.2019, 18:18 194
Bejeweled [SDL2 C++]


пятнашки Fiften [SDL2 C++]


минер Minesweeper [SDL2 C++]


змейка Snake [SDL2 C++]
1
56 / 7 / 0
Регистрация: 26.01.2018
Сообщений: 143
25.10.2019, 16:36 195
Интересная тема!
0
0 / 0 / 0
Регистрация: 25.11.2019
Сообщений: 11
25.11.2019, 23:03 196
Цитата Сообщение от Otaka Посмотреть сообщение
Это вообще, наверное, моя п
Otaka, Можешь скинуть пожалуйста исходник с исполняемым файлом?)
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
25.11.2019, 23:17 197
_daunGigant_,
Последняя активность: 14.04.2015 21:28
Добавлено через 2 минуты
Цитата Сообщение от _daunGigant_ Посмотреть сообщение
Можешь скинуть пожалуйста исходник
Кстати, в том сообщении, которое вы цитировали, есть прикреплённый исходник под скриншотом.
0
0 / 0 / 0
Регистрация: 25.11.2019
Сообщений: 11
25.11.2019, 23:19 198
8Observer8, Извините , но мне нужен сам исходник и реализуемый файл ( если можете скинуть буду очень благодарен)
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
25.11.2019, 23:51 199
_daunGigant_, вы скачайте среду разработки, откройте проект и соберите EXE. По-моему, он писал код в среде "C++ Builder 6 и 2006". Можете почитать, как устанавливать среду, как компилировать проекты в книге Программирование в C++Builder 6 и 2006 (+ CD-ROM). У меня даже в бумажном виде эта книга есть. Я по ней учился, когда был студентом.
0
4176 / 2282 / 387
Регистрация: 05.10.2013
Сообщений: 6,385
Записей в блоге: 177
15.12.2019, 23:24 200
Я переписал Понг на TypeScript и WebGL 1.0 из текстового туториала от NoobTuts: https://noobtuts.com/cpp/2d-pong-game

Запустить в браузере Release версию: http://ivan8observer8.herokuap... -noobtuts/ Я использую бесплатный хостинг для Node.js/Express, поэтому иногда нужно подождать 10 секунд, чтобы разбудить сервер.

Скачать исходники: https://github.com/8Observer8/... typescript
На GitHub есть инструкция, как собрать Release и Debug версии.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2019, 23:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создать структуру данных. Найти количество названий игрушек, у которых цена меньше общей средней цены всех игрушек
помогите... Создать структуру с данными в которой должно происходить следующее: Добавить и...

6 небольших программок
Есть человек который может объяснить/просто написать как составить 6 небольших...

Есть 2 небольших вопроса...
Ребят,помогите пожалуйста. Вообщем есть 2 вопроса 1)Можно ли сделать так чтоб линки на документы...

Верстка небольших блочков
Помогите, как можно реализовать такую штуку, я примерно понимаю как, но на абсолютном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.