Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > анимация


Автор: Mlix 1.6.2009, 22:22
привет всем, сразу сознаюсь, что асм знаю очень плохо, поэтому прошу помочь разобраться
нужно замутить движущегося человечка, вроде все работает, но движется он, если постоянно нажимать клавишу, а нужно чтоб сразу двигался или по нажатию клавиши начинал движение
кроме как грубо зациклить, нечего в голову не приходит, но тогда по нажатию q уже не выйдешь и выходит уже не человечек а просто хрень мерцающая, в общем, если грубый вариант, как можно сделать паузу, только sleep() и что-нибудь такое библиотечное использовать нельзя, а если не грубый, что еще можно с этим сделать?  
если у кого-нибудь есть какие-нибудь мысли или примеры, помогите плз

Код

code segment
        ASSUME CS:code, DS:DATA_SEG, ES:NOTHING, SS:STACK_SEG
start:
        MOV     AX,DATA_SEG
        MOV     DS,AX
        MOV     AX,STACK_SEG
        MOV     SS,AX
        MOV     SP, OFFSET TOP_OF_STACK
        

        MOV     AX,13h
        INT     10h

        MOV     AX,0A000h 
        MOV     ES,AX 
        CLD

        MOV     DI,320*12

        MOV     BH, 48
       

MOVE_MASK:
        MOV     AL, NOM_KADR
        CMP     AL,0
        JNZ     KADR2
        MOV     NOM_KADR, 1
        MOV     SI, OFFSET H1
        
        
        
        
        
        JMP     SHOW_KADR

        
KADR2:
        MOV     NOM_KADR, 0
        MOV     SI, OFFSET H2

SHOW_KADR:
        PUSH    DI        
        MOV     BL,13    


DRAW_H:
        MOV     CX,12     
        REP     MOVSB
        ADD     DI,320-12 
        DEC     BL
        JNZ     DRAW_H
        POP     DI        
        INC     DI        

READ_KEY:
      ;MOV     AH,08h
    ; INT     21h
      ; cmp     al,0 
       ;JZ      READ_KEY
        
           
        cmp     al, 'q'
        JMP     MOVE_MASK
       MOV     AX,3
        INT     10h                 

       MOV     AH,4Ch
       INT     21h



DATA_SEG SEGMENT

H1    DB 0,0,0,0,0,9,9,9,9,0,0,0
      DB 0,0,0,0,0,9,9,9,9,0,0,0
      DB 0,0,0,0,0,9,9,0,0,0,0,0
      DB 0,0,0,9,9,9,9,9,9,0,0,0
      DB 0,0,0,9,9,9,9,9,9,0,0,0
      DB 0,9,9,0,0,9,9,0,0,9,9,0
      DB 0,9,9,0,0,9,9,0,0,9,9,0
      DB 0,0,0,0,0,9,9,0,0,0,0,0
      DB 0,0,0,0,0,9,9,0,0,0,0,0
      DB 0,0,0,9,9,0,0,9,9,0,0,0
      DB 0,0,0,9,9,0,0,9,9,0,0,0
      DB 0,0,0,9,9,0,0,9,9,0,0,0
      DB 0,0,0,9,9,0,0,9,9,0,0,0
     
H2     DB 0,0,0,0,0,9,9,9,9,0,0,0
       DB 0,0,0,0,0,9,9,9,9,0,0,0
       DB 0,0,0,0,0,9,9,0,0,0,0,0
       DB 0,0,0,9,9,9,9,9,9,0,0,0
       DB 0,0,0,9,9,9,9,9,9,0,0,0
       DB 0,9,9,0,0,9,9,0,0,9,9,0
       DB 0,9,9,0,0,9,9,0,0,9,9,0
       DB 0,0,0,0,0,9,9,0,0,0,0,0
       DB 0,0,0,0,0,9,9,9,9,0,0,0
       DB 0,0,0,9,9,0,0,9,9,0,0,0
       DB 0,0,0,9,9,0,0,9,9,0,0,0
       DB 0,9,9,0,0,0,0,9,9,0,0,0
       DB 0,9,9,0,0,0,0,0,0,0,0,0
NOM_KADR DB 0
DATA_SEG ENDS

STACK_SEG SEGMENT
        DB 64 DUP('STACK')
TOP_OF_STACK DW ?
STACK_SEG ENDS

code ends
end start
end

Автор: Mikl_ 2.6.2009, 05:30
Mlix, здесь COM а не EXE -- человечек бежит по экрану -- правда выход из программы Ctrl+Ald+Del  smile 
но если захочешь, то доделаешь сам 
Код
.model tiny
.286
.code
org 100h
start:  mov    ax,0A000h 
        mov    ES,ax
        MOV     AX,13h; устанавливаем разрешение экрана 320*240
        INT     10h
        MOV     BX,2 ; счетчик кадров
        MOV    DI,320*12; выводим первый кадр с 0-ой позиции на 12 строку
MOVE_MASK: MOV  SI,tab[bx] ; в зависимости от счетчика кадров или картинка H1 или H2
SHOW_KADR: MOV  CX,13 ; в каждой картинке 13 строк
DRAW_H: push    cx    ; сохраняем значение CX в стеке
MOV    CX,20     ; в каждой строке 20 точек
        REP MOVSB ; выводим очередную строку
        ADD    DI,320-20 ; положение на экране следующей строки
        pop    cx; восстанавливаем счетчик строк
loop DRAW_H
xor bx,2 ; меняем значение в счетчике кадров или 0 или 2
sub di,320*13-10; сдвигаем картинку при рисовании следующего кадра -- предыдущий кадр сотрется
push bx   ; сохраняем в стеке счетчик кадров
; организуем задержку по времени на 1000/18,2=54,94 мСек
mov ah,0    ;Получить системное время
int 1Ah    ; Return: CX:DX=число тиков от полуночи 
mov bx,dx  ;1 секунда=18.2 тика        
delay:    int 1Ah    ;пропускаем 55 милисекунды
cmp bx, dx
jz delay
pop bx
jmp MOVE_MASK
H1 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0,9,9
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0,9,9
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0
     
H2 DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0,9,9
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0,9,9
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,0,0
tabl dw H1,H2; адреса картинок
end    start
 smile 

Автор: Mlix 2.6.2009, 20:07
спасибо, но там все сливается  smile 
в смысле очистка не происходит

Автор: Mikl_ 3.6.2009, 02:56
Mlix, где всё сливается? Я рабочий и проверенный пример прислал smile 

Автор: Mikl_ 3.6.2009, 03:57
Mlix, Вариант с выходом в DOS после прохождения указанного времени
Код
.model tiny
.286
.code
org 100h
start:  MOV AH,0Fh ;запомнить видеорежим -- видеорежим может быть не обязательно равным 3
    INT 10h
    MOV byte ptr VIDEOR,AL; запоминаем видеорежим чтобы потом его востановить
    mov    ax,0A000h 
        mov    ES,ax
        MOV     AX,13h
        INT     10h
    cld
        MOV     BX,2 ; инициализируем индекс фаз рисунка
        MOV    DI,320*12
    mov cx,200; время на экране -- ставь любое число
MOVE_MASK: push cx
    MOV  SI,tab[bx]
SHOW_KADR: MOV  CX,13; количество строк в рисунке
DRAW_H: push    cx    
    MOV    CX,10 ; количество точек в строке делим на 2    
        REP MOVSW; выводим сразу по 2 точки
        ADD    DI,320-20; переходим на следующую строку
        pop    cx
    loop DRAW_H
    xor bx,2; переключаем идекс фазы рисунка
    sub di,320*13-1; 1 - плавность перемещения по экрану чем больше число - тем быстрее
    push bx
    mov ah,0    ;Получить системное время
    int 1Ah    ; Return: CX:DX=число тиков от полуночи 
    mov bx,dx  ;1 секунда=18.2 тика        
delay:    int 1Ah    ;пропускаем 55 милисекунды
    cmp bx,dx
    jz delay
    pop bx
    pop cx
    loop MOVE_MASK
exit:   MOV     AX,VIDEOR; восстанавливаем первоначальный режим
        INT     10h                 
        INT     20h; выход в DOS
H1    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,9,9,0,9,9,0,9,9,0
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0,9,9
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,9,9,0,0
     
H2    DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,9,9,0,0
      DB 0,0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,9,9,0
      DB 0,0,0,0,0,0,0,0,0,0,9,9,0,0,0,0,0,0,9,9
tab dw H1,H2; адреса фаз рисунков
VIDEOR dw 0
end    start
 smile 

Автор: Mlix 3.6.2009, 10:56
как-то так 
http://i22.photobucket.com/albums/b320/Mlix/Untitled-1-4.jpg

Автор: Mikl_ 3.6.2009, 11:26
Mlix
код целиком скопировал? Приаттачь COM и исходник -- посмотрю в чем дело

Автор: Mlix 3.6.2009, 12:04
Mikl_
блин, я ужасно аццки натупил, все работает на самом деле
спасибо огромнейшее

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)