Chtela bych se zeptat jak nastavim aby kdyz podrzim mys my to delalo caru umim to udelat tak ze kdyz kliknu tak se objevi ctverecek a pak jako ze bych klikala pod sebe ale zajimalo by me to s drzenim (assembler vubec nechapu)
Fórum › Pascal
Mys drzeni
Napiš sem zdroják nebo dej odkaz na něj, ať víme, s jakou grafickou knihovnou pracuješ a jakým způsobem obsluhuješ myš.
V principu se ale problém s kreslením čáry řeší přes Line, kdy propojuješ momentální pozici myši s předchozí pozicí myši. Jednoduchý PutPixel použít nejde, protože při rychlém pohybu s myší by se nevykreslila čára, ale sled teček.
MysCti(pozice_x,pozice_y,stav_tlacitek);
sx:=pozice_x;
sy:=pozice_y;
repeat
MysCti(pozice_x,pozice_y,stav_tlacitek);
if stav_tlacitek<>0 then Line(sx, sy, pozice_x, pozice_y);
sx:=pozice_x;
sy:=pozice_y;
until konec=true;
Rutinu je vhodné vylepšit o testování shodnosti SX vůči Pozice_X a SY vůči Pozice_Y. Pokud jsou obě dvojice shodné, znamená to, že se myš v posledním cyklu nepohla a tudíž není třeba kreslit. To vede k velkému urychlení programu.
asm
mov ah,01h
mov cx,2000h
int 10h
end;
repeat
asm
mov dx,03DAh
@1: in al,dx
test al,8
jz @1
end;
textcolor(0);
textbackground(12);
gotoxy(5,10);
write('Konec');
asm
mov ax,01h
int 33h
end;
repeat
asm
mov ax,05h
mov bx,0
int 33h
mov mx,cx
mov my,dx
mov ax,06h
mov bx,0
int 33h
mov upclick,bx
end
until upclick=1;
asm
mov ax,02h
int 33h
end;
mx:=mx div 8+1;
my:=my div 8+1;
gotoxy(mx,my);
Randomize;
textbackground(Random(12));
write(' ');
if (mx>=5) and (mx<=9) and (my=10) then konec:=1
until konec=1;
A kurva!
Ty pracuješ v textovém režimu, tudíž nejsou k dispozici kreslicí funkce - v našem případě tedy Line. Není to nic, co by nás mohlo zastavit, ale znamená to komplikaci. Další věc - tvůj zdroják je dost nepřehledný, mísí se ti pascal a assembler. Je lepší snažit se je oddělovat.
A poslední poznámka - Randomize se správně volá jen jednou za program.
Jelikož nám chybí procedura Line, tak první verzi zdrojáku napíšu bez ní, kdy čáru budeme vykreslovat prostě pomocí jednotlivých znaků.
uses Crt;
Procedure Mys_init;assembler;
asm mov ax,0;int 33h;end;
Procedure Mys_On;assembler;
asm mov ax,1;int 33h;end;
Procedure Mys_Off;assembler;
asm mov ax,2;int 33h;end;
Procedure Mys_Stav(var x,y,stav:word);assembler;
asm
mov ax,3;int 33h
push es
shr cx,3;inc cx
shr dx,3;inc dx
les di,x;mov es:[di],cx
les di,y;mov es:[di],dx
les di,stav;mov es:[di],bx
pop es
end;
Procedure SchovejKurzor;assembler;
asm mov ah,1;mov cx,2000h;int 10h;end;
Procedure ObnovKurzor;assembler;
asm mov ah,1;mov cx,0607h;int 10h;end;
{------------------------------------HLAVNI PROGRAM---------------------------------------------}
var x,y,s:word;
begin
SchovejKurzor;
Mys_init;
Mys_On;
repeat
Mys_stav(x,y,s);
if s=1 then {S=1 znamena, ze je zmacknute leve mysitko}
begin
GotoXY(x,y);
write('*'); {nebo jakykoliv znak, ktery uznas za vhodne - treba plny obdelnicek}
end;
until s=2; {S=2 znamena, ze je zmacknute prave mysitko}
ObnovKurzor;
end.
No, a vymakanější verze s Line bude vypadat takto:
uses Crt;
Procedure Mys_init;assembler;
asm mov ax,0;int 33h;end;
Procedure Mys_On;assembler;
asm mov ax,1;int 33h;end;
Procedure Mys_Off;assembler;
asm mov ax,2;int 33h;end;
Procedure Mys_Stav(var x,y,stav:integer);assembler;
asm
mov ax,3;int 33h
push es
shr cx,3
shr dx,3
les di,x;mov es:[di],cx
les di,y;mov es:[di],dx
les di,stav;mov es:[di],bx
pop es
end;
Procedure SchovejKurzor;assembler;
asm mov ah,1;mov cx,2000h;int 10h;end;
Procedure ObnovKurzor;assembler;
asm mov ah,1;mov cx,0607h;int 10h;end;
Procedure NakresliZnak(x,y:byte);assembler;
{GotoXY a Write se na kresleni nehodi, protoze posouvaji kurzor}
{a muze dojit ke scrolingu. Proto to udelame jinak - pres BIOS}
asm
mov ah,2 {nastavi kurzor}
mov bx,0
mov dh,y {radka}
mov dl,x {sloupec}
int 10h {nastav pozici kurzoru}
mov ah,9
mov al,'*' {znak, ktery chceme zobrazit}
mov cx,1 {chceme zobrazit jeden}
mov bx,7 {jakou barvou - treba klasika, seda na cernem pozadi}
int 10h {kresli}
end;
procedure Line(x1,y1,x2,y2:word);
{Algoritmus na kresleni cary}
var dx,dy,krok,k,rx,ry:integer;
xprir,yprir,x,y:real;
begin
dx:=x2-x1;
dy:=y2-y1;
if (dx=0) and (dy=0) then NakresliZnak(x1,y1) else
begin
if abs(dx)>abs(dy) then krok:=abs(dx) else krok:=abs(dy);
xprir:=dx/krok;
yprir:=dy/krok;
x:=x1;
y:=y1;
for k:=1 to krok do
begin
x:=x+xprir;
y:=y+yprir;
rx:=round(x);
ry:=round(y);
NakresliZnak(rx,ry);
end;
end;
end;
{------------------------------------HLAVNI PROGRAM---------------------------------------------}
var x,y,s:integer;
sx,sy:integer;
begin
SchovejKurzor;
Mys_init;
Mys_On;
repeat
Mys_stav(x,y,s);
if s=1 then Line(sx,sy,x,y);
sx:=x;
sy:=y;
until s=2;
ObnovKurzor;
end.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Automatické držení titlebaru — založil code
Koupim myš — založil Tomáš
[c#][SDL] myš — založil Miro1701
Moderátoři diskuze