Dynamiczne generowanie PictureBox

0

Witam, tworzę sobie skromny projekt, w którym potrzebuje coś co będzie mi dynamicznie generowało PictureBox'y po kliknięciu myszką. PictureBox'y te mają reprezentować pociski. Udało mi się stworzyć mechanizm dla jednego boxa, zdefiniowanego w kodzie jednak to mi nie wystarcza. Poniżej zamieszczam kod i mam nadzieję, że ktoś byłby wstanie mi pomóc i na bazie tego kodu stworzyłby dynamiczne generowanie boxów.

Dodam jeszcze, że przeszukiwałem internety w celu znalezienia rozwiązania ale niestety nic co znalazłem mi nie pomogło :/

 public Form1()
        {
            InitializeComponent();
            timer1.Enabled = true;
            Cursor.Hide();
            this.TopMost = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            player.Left = Cursor.Position.X - (player.Width / 2); // pozycja postaci zczytana z kordów kursora

            if (player.Left <= 0)
            {
                player.Left = 1;
            }
            if (player.Left >= 840)
            {
                player.Left = 822;
            }
            pocisk.Top = pocisk.Top - 10; // zmiana pozycji boxa, pocisk po wystrzeleniu leci do góry

        }

        private void Form1_MouseClick(object sender, MouseEventArgs e) // włączanie widoczności boxa po kliknięciu myszką i wczytanie jego pozycji z pozycji kursora
        {
            pocisk.Visible = true;
            pocisk.Left = player.Left + ((player.Width / 2) - (pocisk.Width / 2));
            pocisk.Top = 460;
        }

    }
0

Zamknij ten mechanizm jako klase i kazdy nowy pocisk bedzie nowy obiektem tej klasy. Albo napisz metode statyczna co jako parametr pobiera picuteerboksa i pozycje na której ma go ustawić i go na niej ustawia. Potem bedziesz mógł napisać klase GameBullet ktora zupełnie nie zaleznie od widoku zajmie się pociskami połączenie tej klasy z metodą stayczna i jakąs listą pocisków możn zrobić na tysiąc sposóbów.

0

A czy mógłbyś mi to przedstawić w postaci kodu? Chociaż takiego uproszczonego bo o ile rozumiem co tutaj napisałeś to nie potrafię tego zapisać :/

0

na pewno mozna zrobić to lepeij ale nie wiem co tam konkretnie robisz

public static MoveTo(PictureBox pocisk, double x, double y, double skala) 
{
   pocisk.Left =x*skala;
   pocisk.Top =y*skala;
}
public class Bullet
{
  private const MAX_LEFT =400;// jednostek względnych
  public int Id {protected set; get;}
  public int x {set; get;}
  public int y {set; get;}
  public void UpDateAfterTick()
 {
    // to co chcesz zrobić zrobić z pociskiem
  }  }
class Program 
{
const int SKALA;
 Main()
{
  Dictionary<int, picture box> p;
  List<Bullet> bulletes;
  foreach(var b in bullets)
  {
    b.UpDateAfterTick();
    MoveTo(p[b.id],b.x,b.y,SKALA);
  }
}
0

Napisałem coś takiego, program się kompiluje ale PictureBoxy się nie pojawiają, co tutaj jest źle?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace xDx_No._1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            timer1.Enabled = true;
            Cursor.Hide();
            this.TopMost = true;
        this.Controls.AddRange(Bullet);
        }
            int nr = 0;
            PictureBox[] Bullet = new PictureBox[100];
            
            

        private void timer1_Tick(object sender, EventArgs e)
        {
            player.Left = Cursor.Position.X - (player.Width / 2); // pozycja postaci zczytana z kordów kursora

            if (player.Left <= 0)
            {
                player.Left = 1;
            }
            if (player.Left >= 840)
            {
                player.Left = 822;
            }
            //pocisk.Top = pocisk.Top - 10; // zmiana pozycji boxa, pocisk po wystrzeleniu leci do góry
            //Bullet.Top = Bullet.Top - 10;
        }

        private void Form1_MouseClick(object sender, MouseEventArgs e) // włączanie widoczności boxa po kliknięciu myszką i wczytanie jego pozycji z pozycji kursora
        {
            /*pocisk.Visible = true;
            pocisk.Left = player.Left + ((player.Width / 2) - (pocisk.Width / 2));
            pocisk.Top = 460;*/
            Bullet[nr] = new PictureBox();
            
            Bullet[nr].Visible = true;
            Bullet[nr].BackColor = Color.Black;
            Bullet[nr].Top = 460;
            Bullet[nr].Size = new System.Drawing.Size(10, 10);
            Bullet[nr].Left = player.Left;
            
            nr++;
        }
    }
}
 
0

Niestety albo coś źle robię albo nie wiem bo cokolwiek bym nie dodał to nic nie pomaga i mimo, że program się kompiluje to boxy się nie pojawiają.

EDIT. Wydaje mi się, że program jako tako działa bo jako że tablica jest 10 elementowa to program zawiesza się w okolicy 11 kliknięcia czyli przy próbie dodania 11 pozycji do tablicy. Problem jednak nadal pozostaje z wyświetlaniem dodanych Pictureboxów.

Umieszczam link do całego projektu, może tak będzie łatwiej coś komuś z tym zrobić.
https://onedrive.live.com/redir?resid=673294BC69C869AA!15592&authkey=!ABbNQAQxfF4DUWc&ithint=folder%2csuo

0

Musisz stworzyć jakiś kontener typu flowlayoutpanel i pnl.Controls.Add().. pisalem to wyżej, i pierwszy wynik w google dla "add picturebox formkode winforms"tez to mowi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1