edub13 Posted March 27, 2015 at 12:37 PM Report Share #580320 Posted March 27, 2015 at 12:37 PM (edited) Boas pessoal, comecei à pouco a fazer um gênero de um Arkanoid só por brincadeira, e deparei me com o seguinte problema, quando a "bola" acerta nos quadrados eles não desaparecem (aliás alguns desaparecem na margem direita como deveria ser). Aqui coloco as picturebox no form: private void Load_Bricks() { brick = new PictureBox[bRICK_HORIZONTAL_MAX * BRICK_VERTICAL_MAX]; for (int i = 0; i < BRICK_HORIZONTAL_MAX; i++) { for (int j = 0; j < BRICK_VERTICAL_MAX; j++) { brick[j] = new PictureBox(); brick[j].Visible = true; brick[j].Location = new Point(i * BRICK_WIDTH, j * BRICK_HEIGHT); brick[j].Size = new Size(BRICK_WIDTH, BRICK_HEIGHT); brick[j].Image = Resources.brick; this.Controls.Add(brick[j]); } } } Aqui está o código do Evento (Move) da "bola": void ball_Move(object sender, EventArgs e) { foreach (PictureBox obj in brick) { if (ball.Bounds.IntersectsWith(obj.Bounds)) { obj.Dispose(); } } } Como posso resolver isto ? Cumps. Edited March 27, 2015 at 12:47 PM by apocsantos geshi Learning: C++ Link to comment Share on other sites More sharing options...
nelsonr Posted March 27, 2015 at 12:43 PM Report Share #580322 Posted March 27, 2015 at 12:43 PM Talvez em vez de usares o dispose, possas esconder o objecto (visible=false) e nesse foreach verificar se o objecto está visivel antes de usares no teste de colisão Link to comment Share on other sites More sharing options...
edub13 Posted March 27, 2015 at 12:46 PM Author Report Share #580323 Posted March 27, 2015 at 12:46 PM (edited) Fiz o que disseste: foreach (PictureBox obj in brick) { if (obj.Visible) { if (ball.Bounds.IntersectsWith(obj.Bounds)) { obj.Visible = false; } } } Mas o efeito é o mesmo só desaparece os blocos que selecionei na imagem que coloquei ... Edited March 27, 2015 at 12:47 PM by apocsantos geshi Learning: C++ Link to comment Share on other sites More sharing options...
nelsonr Posted March 27, 2015 at 02:42 PM Report Share #580339 Posted March 27, 2015 at 02:42 PM Coloca um breakpoint no sitio onde estás a por visible = false e verifica se é o objecto correcto Link to comment Share on other sites More sharing options...
bioshock Posted March 27, 2015 at 03:23 PM Report Share #580345 Posted March 27, 2015 at 03:23 PM Não poderá o problema ser o facto de teres uma imagem atribuída ao controlo? if (ball.Bounds.IntersectsWith(obj.Bounds)) { obj.Image = null; obj.Dispose(); } Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 27, 2015 at 03:34 PM Report Share #580348 Posted March 27, 2015 at 03:34 PM eu não costumo vir a tópicos de c#, não porque não saiba a linguagem, mas porque não me sinto à vontade em relação a outras tecnologias. no entanto, o título foi o que me chamou. dei uma vista de olhos no problema e acho incrível de como o problema é tão simples, que passa despercebido por todos e viram o tópico ... vamos ver se chegas lá sozinho respondendo a esta questão: - quantas instâncias da classe PictureBox estão guardadas no array brick ? ps : isto noutra linguagem dava um segmentation fault ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
nelsonr Posted March 27, 2015 at 03:49 PM Report Share #580349 Posted March 27, 2015 at 03:49 PM Pois, reparei agora que o preenchimento repete sempre a posição Link to comment Share on other sites More sharing options...
edub13 Posted March 27, 2015 at 04:58 PM Author Report Share #580353 Posted March 27, 2015 at 04:58 PM Acho que já percebi ... No array estão guardadas 170 instâncias, mas só 10 é que estão "inicializadas" ? (Essas dez que desaparecem sem problema) Learning: C++ Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 27, 2015 at 06:08 PM Report Share #580358 Posted March 27, 2015 at 06:08 PM (edited) Acho que já percebi ... No array estão guardadas 170 instâncias, mas só 10 é que estão "inicializadas" ? (Essas dez que desaparecem sem problema) não ... o array só tem mesmo 10 instâncias ... (isto se BRICK_VERTICAL_MAX tiver o valor de 10) Edited March 27, 2015 at 06:08 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
edub13 Posted March 27, 2015 at 06:30 PM Author Report Share #580359 Posted March 27, 2015 at 06:30 PM (edited) Pois é tens razão for (int i = 0; i < BRICK_HORIZONTAL_MAX; i++) { for (int j = 0; j < BRICK_VERTICAL_MAX; j++) { brick[j] = new PictureBox(); brick[j].Visible = true; brick[j].Location = new Point(i * BRICK_WIDTH, j * BRICK_HEIGHT); brick[j].Size = new Size(BRICK_WIDTH, BRICK_HEIGHT); brick[j].Image = Resources.brick; this.Controls.Add(brick[j]); } } No segundo for só estou a instanciar 10 PictureBox, como é que eu mudo isso ? EDIT: Aliás vou tentar de outra maneira e já digo se resultou EDIT 2: Já consegui apenas mudei o array para multidimensional e funcionou perfeitamente, obrigado pela ajuda! for (int i = 0; i < BRICK_HORIZONTAL_MAX; i++) { for (int j = 0; j < BRICK_VERTICAL_MAX; j++) { brick[i,j] = new PictureBox(); brick[i, j].Visible = true; brick[i, j].Location = new Point(i * BRICK_WIDTH, j * BRICK_HEIGHT); brick[i, j].Size = new Size(BRICK_WIDTH, BRICK_HEIGHT); brick[i, j].Image = Resources.brick; this.Controls.Add(brick[i, j]); } } Edited March 27, 2015 at 06:31 PM by edub13 Learning: C++ Link to comment Share on other sites More sharing options...
bioshock Posted March 27, 2015 at 07:43 PM Report Share #580361 Posted March 27, 2015 at 07:43 PM A mim o que me chamou mais à atenção foram as imagens e a ajuda relativamente ao colocar como não visível a imagem, daí ter dado aquela sugestão de código porque já tive ocasiões onde precisei de limpar o resource da picturebox para poder eliminar a mesma. Acho que nem olhei para o código inicial e se olhei não percebi o erro à primeira. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now