Witam,
mam pytanie jak usunąć hitboxy w pictureboxie? Chodzi mi o to, że jak kliknę obok obrazka to coś się dzieje. Tak jak na poniższym obrazku mam kaczkę i jak kilkne obok niej to mi nalicza punkty i jak zrobić by tylko naliczało jeżeli kliknę na obiekt kaczki, a nie na pictureboxa?
Wydaj mi się, że tak nie da rady. Bo zdarzenie clicknięcia dotyczy pictureboxa. Musiałbyś ewentualnie wyliczać poozycje kursora względem pictureboxa i wyeliminować te pozycje gdzie jest kaczka. ale to chyba dużo roboty
Albo lepszym rozwiązaniem byłoby sprawdzenie czy kliknąleś na pixel przeźroczysty. tu jest coś podobnego: https://stackoverflow.com/questions/2569538/detecting-if-a-png-image-file-is-a-transparent-image
Dzięki pomogłeś
A najlepszym rozwiązaniem jest zrobienie tego w Unity :)
Generalnie zależy od kaczki
Najtrywialniejszy hitbox, to chyba po prostu wysokość i szerokość obrazka z kaczką.
Dla tła dodajemy onclick zliczający nietrafione strzały, a obrazek z kaczką zalicza trafienia - i tyle
public Form1()
{
InitializeComponent();
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = Image.FromFile("woda.jpg");
pictureBox1.Click += PictureBox1_Click;
pictureBox2.Visible = false;
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox2.Height = 100;
pictureBox2.Width = 100;
pictureBox2.Image = Image.FromFile("kaczka.jpg");
pictureBox2.Location = new Point(15, 15);
pictureBox2.Click += PictureBox2_Click;
}
int score = 0;
int missedshoots = 0;
private void PictureBox1_Click(object sender, EventArgs e)
{
missedshoots++;
label2.Text = $"Missed: {missedshoots}";
}
private void PictureBox2_Click(object sender, EventArgs e)
{
score++;
label1.Text = $"Score: {score}";
}
async Task PutTaskDelay()
{
await Task.Delay(50);
}
async void GameLoop()
{
pictureBox2.Visible = true;
while (true)
{
await PutTaskDelay();
MoveKaczka();
}
}
void MoveKaczka()
{
pictureBox2.Location = new Point
(
pictureBox2.Location.X + 1,
pictureBox2.Location.Y + 1
);
}
private void Start_Click(object sender, EventArgs e)
{
GameLoop();
}
Pomysł Kolegi wyżej dot Unity jest najlepszy.
duzo gotowych mechanizmów (silników) + cross platform + C# :)
Wada że trochę słabe OOP jest wewnątrz (struktury, elastyczny wzorzec (nazwa mi uciekła) niestety wymusza częste rzutowania intancji klas ).
Sam nic nie robiłem ale dobry kolega w tym gry tworzy (mobilne) na zlecenia a także na codzień w tym pracuje... fajnie i ładnie to wygląda.
Proste gry, z podstawowa fizyka (mając grafiki) można zrobić w 1-2 tygodnie.
Czasem trzeba dopracować sterowanie/problemy sprzetowe dla konkretnej platformy ale i tak zajmuje to dużo mniej czasu niż pisanie "natywne" dla każdej platformy z osobna.
Pozdrawiam
P
@fprogrammer: zupełnie nie znając Unity i zupełnie nie znając Blendera (ani innych programów graficznych 3D) i pracując na etacie, zrobiłem w Unity prostą grę 3D (z zombiakami i zagadkami) w jakieś 3 tygodnie. Czyli potwierdzam - da się :D Pewnie zrobiłbym szybciej, gdybym umiał już wcześniej Blendera. Niestety niektóre modele musiałem sam sobie przygotować.