All streams
Search
Write a publication
Pull to refresh
77
0
Сергей Чибиряев @chibiryaev

Разработчик игр

Send message
вопрос по коллизиям: я так понял, что для каждой пары (пуля, астероид) происходит рендеринг обоих на канвас, получается, что один и тот же астероид будет отрендерен столько раз, сколько пуль попало в bounding box астероида, так?
А зачем освобождать device context, когда он не создается? Ведь GetDC возвращает уже готовый контекст окна
я конечно же перепутал LineTo и MoveToEx.
Вот так сократил код и без мерцания
static POINT t,old; static bool status=false; PAINTSTRUCT pt;
HDC hdc=GetDC(hWnd);
switch(msg) {
    case WM_LBUTTONUP: status = false;
        break;
    case WM_LBUTTONDOWN:
	status=true;
    case WM_MOUSEMOVE: 
	GetCursorPos(&t);
        ScreenToClient (hWnd, &t);
	if(status) msg==WM_LBUTTONDOWN?MoveToEx(hdc,t.x,t.y,NULL):LineTo(hdc, t.x, t.y);
        break;
}
Мерцание экрана при непосредственном рисовании

не использовать InvalidateRect и vector, а LineTo в WM_LBUTTONDOWN и MoveToEx в WM_MOUSEMOVE, не?
для x86 16-битный проц. А вот и код
Скрытый текст
.model small
.data
   snake dw ?,3,offset snake+18,-160,40,0,2000, 2160, 2320, 2480, 100 dup(0),0, -160,0,0,-2,0,2,0,0,160,25173,80*24*2
.stack 10h
.code      
draw_elem:  mov cx, 4
            mov bp, 2403h
while:      mov ax, snake
            imul snake[240]
            add ax, 13849
            mov snake, ax
            xor dx, dx
            div snake[242]
            mov si, dx
            cmp es:[si], word ptr 2500h
            jne while
            mov es:[si], bp
            mov bp, 200fh
            loop while
            ret
update:     mov si, snake[4]
            mov di, [si]
            mov es:[di], 2500h
            mov cx, snake[2]
for1:       mov ax, [si-2]
            mov [si], ax
            sub si, 2
            loop for1
            mov di, [si]
            add di, snake[6]
            mov [si], di
            cmp es:[di], 2403h
            jne endif3
            mov si, snake[4]
            mov bx, [si]
            mov [si+2], bx
            add snake[4], 2
            inc snake[2]
            call draw_elem
endif3:     cmp es:[di], byte ptr 0eh
            ja game_over
            cmp di, 0
            jl game_over
            cmp di, 80*25*2
            jg game_over
            mov es:[di], word ptr 06dbh
            ret
main:       cld
            mov ax, @data
            mov ds, ax
            mov ax, 3
            int 10h
            int 1ah
            mov snake, dx
            mov ax, 0b800h
            mov es, ax
            mov ax, 2500h
            xor di, di
            mov cx, 80*25
            rep stosw
            call draw_elem
begin:      xor ah, ah
            int 1ah
            cmp dx, snake[220]
            jb endif1
            add dx, 2
            mov snake[220], dx
            call update
endif1:     mov ah, 6
            mov dl, 0ffh
            int 21h
            mov bl, al
            cmp bl, 48h
            jb endif2
            cmp bl, 50h
            ja endif2
            xor bh, bh
            shl bx, 1
            mov ax, [bx+offset snake-2*48h+222]
            mov snake[6], ax
endif2:     cmp al, 1bh
            jne begin
game_over:  mov ax, 4c00h
            int 21h
            end main

4 года назад писал змейку на асме, получилось хоть и не 30 операторов, а 79, но без ужималок в одну строку нескольких строк
Первую же игру выиграл ноликами (синими)

уже после 28-го хода у крестов (красных) не было шансов. Изменение уровня сложности не нашел
нашел ошибку, да решение не правильное
А в for-е слабо объявить?

и правда, не подумал, так ещё короче
решил закодить эту задачу
int sum(int *m,int count,int s)       //s играет роль локальной переменной, минус одна строка
{
    for(int i=1;i<count;i++)
        if(m[i]<m[0]) s+=m[0]-m[i];
        else return s+sum(&m[i],count-i,0);
    return 0;
}

вызывать так
int m[]={1,5,3,3,5,2,1,8};
int s=sum(m,sizeof(m)/sizeof(int),0);
На самом деле в игре есть искусственная задержка.

А для чего? Мне было не комфортно ждать 15 секунд хода компа программы. А сколько, если не секрет, думает прога в среднем?
Еще на том же сэнсэе программа ходила не вполне адекватно: вместо слова скотЧ она почему-то сходила отавА (явно ведь Ч поставить выгоднее, чем А) — и это только то, что я запомнил
Поиграл с компьютерным игроком на сложности сэнсэй. Ваше приложение ходило от 3-х секунд (в начале партии) до 10-15 секунд (в середине) — считаю это неприлично долго, да на таком малом словаре
точнее по количеству точек на рендертаргете, разрешение которого я и выставлял 256х256.
Использовал ГЛ 2
Поделитесь информацией насчет анимированных шумов, может какую-то ссылку дадите?

Текстура шума у меня одна и она двухмерная, перед рендерингом воды есть отдельный рендер в текстуру 256х256, там-то как раз и создается анимация, а так же в эту текстуру рендерится реактивная струя (чтобы водоросли искажались на её фоне и для создания всплеска воды при выпрыгивании/нырянии). Анимация делается одной шумовой текстурой: производятся 4 выборки из неё с разными коэфами текстурных коорд (которые зависят от времени), эти выборки суммируются.
Воду я так понимаю вы воду рисуете фрагментным шейдером

да, вода рендерится в текстуру 256х256, отсюда нет просадки фпс, а качество не страдает, т.к. там нет мелких деталей
вообще не медленно, игра выдает 60 кадров даже на iphone 4. Если заготовить при сборке, то подводные водоросли уже не анимировать, на поверхности воды волны будут статичными, а памяти на такую текстуру потребуется примерно в 1165 раз больше (если я правильно посчитал)
Про какие манипуляции идет речь? Применение шума + фильтр — в рантайме в шейдере, а, например, размытие по Гауссу — при загрузке

Information

Rating
Does not participate
Location
Заволжье, Нижегородская обл., Россия
Registered
Activity

Specialization

Software Developer, Game Developer
Senior