Rolando um WriteableBitmap

7

Preciso simular minha rolagem em segundo plano, mas quero evitar mover meu controle de imagem real. Em vez disso, eu gostaria de usar um WriteableBitmapmétodo blitting. Qual seria a maneira de simular uma imagem rolando para cima? Eu tentei várias coisas comprar, parece que não consigo entender minha lógica:

 //X pos, Y pos, width, height
 Rect src = new Rect(0, scrollSpeed , 480, height);
 Rect dest = new Rect(0, 700 - scrollSpeed , 480, height);

 //destination rect, source WriteableBitmap, source Rect, blend mode 
 wb.Blit(destRect, wbSource, srcRect, BlendMode.None);
 scrollSpeed += 5;

 if (scrollSpeed > 700) scrollSpeed  = 0;

Se heightfor 10, a imagem será bastante confusa e, mais ainda, se a altura for 1. Se a altura é mais alta, a imagem é mais nítida, mas parece apenas fazer uma cópia de um para um. Como posso 'rolar' a imagem para parecer que ela está subindo em um loop contínuo? (A altura da tela é 700).

Skoder
fonte
11
Realmente não entendo por que você gostaria de fazer isso. O que há de errado em mover as imagens de fundo?
Aaaaaaaaaaaa
@eBusiness - Estou tentando criar várias texturas de rolagem. Alguns se encaixam na tela, outros são menores. Eu posso estar fazendo isso da maneira errada, mas como você criaria uma textura de rolagem em uma superfície no Silverlight?
Skoder
Estamos falando de um plano de fundo, certo? Apenas posicionei as imagens onde elas precisam estar para criar o plano de fundo desejado. Você afirma especificamente que não deseja fazê-lo dessa maneira, mas não dá nenhuma razão.
Aaaaaaaaaaa
@eBusiness - Para criar um plano de fundo de rolagem, eu precisaria de dois controles de imagem. Eu moveria um para cima e, quando saísse da tela, redefiniria para ficar abaixo (enquanto o outro está fazendo o mesmo). Isso fornece um efeito de rolagem. Se eu fizer isso com um scroller que não seja de segundo plano, o controle da imagem desaparecerá diante dos olhos do usuário. Eu pedi um histórico da pergunta apenas porque era nisso que eu estava trabalhando, mas o princípio seria o mesmo para outras texturas de rolagem.
Skoder
Bem, diga-nos o que você quer, não o que você não quer. Em um ambiente 3D, você pode alterar as coordenadas UV para obter um efeito de rolagem. Não sei exatamente como o Silverlight funciona, mas em qualquer ambiente 2D sensível você pode desenhar uma fração de uma imagem na tela sem precisar passar por buffers de textura.
Aaaaaaaaaaa

Respostas:

1

Você não pode "rolar" um buffer sem um lugar para armazenar o bit que é empurrado para o final, então parece que você precisará ter um armazenamento separado para a troca ou um bitmap de origem separado. Eu escolheria o último por uma questão de simplicidade, para que você possa armazenar uma posição de rolagem e gerar suas rects usando isso.

Você precisará gerar duas rects, uma para a parte superior e outra para a parte inferior; a outra para a parte superior precisará começar na altura zero e aumentar até chegar à parte inferior; o retângulo de origem que emparelha com ela também começará na altura zero, mas começará da parte inferior da imagem de origem:

Rect src = new Rect(0, 700-scrollPos, 480, 700);
Rect dest = new Rect(0, 0, 480, scrollPos);

O seu retângulo inferior será o que você vê no início e ocupará a tela inteira no início, reduzirá de tamanho enquanto move a tela para fora do caminho do retângulo superior, o retângulo de origem que faria o procedimento mesmo, mas em vez de descer, apenas encolhe.

Rect src = new Rect(0, 0, 480, 700-scrollPos);
Rect dest = new Rect(0, scrollPos, 480, 700);

E usando essas duas blits, você tem um scroller.

Richard Fabian
fonte
@Richard Fabian. Cutucar. Veja a discussão acima, talvez você possa esclarecer a confusão. Você consideraria o uso de uma textura intermediária a maneira comum de obter um efeito de rolagem?
Aaaaaaaaaaaa
Para quase todas as situações, há uma textura de origem e um buffer de destino. Acho que no silverlight, a textura gravável é o buffer de destino e a fonte é o que pode ser misturado a ele. Só encontrei implementações melhores quando o buffer de destino é a tela (nesse caso, um shader foi usado para rolar uma textura) ou usando animação de paleta.
Richard Fabian
Quando eu misturo coisas no pygame, usava o mesmo tipo de retângulos para gerar um ícone / sprite de rolagem interna, mas não gravava em um buffer intermediário a menos que fosse usado várias vezes (como se o ícone rolado fosse o ícone para um membro de um exército de rolagem entidades ícone)
Richard Fabian
A cegueira, se é a sua única solução para o problema da rolagem, normalmente é apenas otimizada, reduzindo o número de vezes que você copia sobre um quadro; se você pode cegar diretamente na tela no silverlight, é melhor fazê-lo. De fato, se você pode ajustar a borda de recorte do buffer gravável que está sendo usado, poderá renderizá-lo duas vezes com retângulos diferentes para produzir o mesmo resultado que eu descrevi na minha resposta. no entanto, não sei se você pode fazer isso, então não pude assumir isso na minha resposta.
Richard Fabian
Obrigado, eu usei o método blitting. Não parece haver muito impacto no desempenho, e o jogo é bastante simples, portanto deve ser suficiente.
Skoder