Forum Sveta kompjutera  

Nazad   Forum Sveta kompjutera > Test Run > Programiranje > Pravljenje igara

Pravljenje igara Programski jezici, tehnike, alatke u službi pravljenja igara...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 15.6.2015, 13:07   #1
Borisav Živanović
Član
 
Član od: 11.5.2014.
Lokacija: Grocka
Poruke: 40
Zahvalnice: 12
Zahvaljeno 5 puta na 4 poruka
Slanje poruke preko Skypea korisniku Borisav Živanović
Određen forumom Objekat ubrzava umesto da se kreće stalnom brzinom

Pozdrav! Počeo sam da pravim jednostavnu igru u C#. Kockice se random pojavljuju na ekranu i vi trebate da ih upucate. Još nisam ni stigao do dela sa upucavanjem i skorom zato što je baklja koju ispaljuje igrač svaki put sve brža i brža (sve dok ne dostigne brzinu svetlosti). Evo koda:
Kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Begaj
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Cursor.Hide();
            FormBorderStyle = FormBorderStyle.None;
            WindowState = FormWindowState.Maximized;
            TopMost = true;
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.A)
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X - 5, pictureBox1.Location.Y);
            }
            if (e.KeyCode == Keys.S)
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y + 5);
            }
            if (e.KeyCode == Keys.D)
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X + 5, pictureBox1.Location.Y);
            }
            if (e.KeyCode == Keys.W)
            {
                pictureBox1.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y - 5);   
            }
        }
        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                const string message = "OCES DIZADJES";
                const string caption = "IZLAZ";
                var result = MessageBox.Show(message, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    Application.Exit();
                }
            }
            if (e.KeyCode == Keys.Space)
            {
                pictureBox7.Visible = true;
                Timer tajmer = new Timer();
                pictureBox7.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y - 30);
                tajmer.Interval = 100;
                tajmer.Tick += new EventHandler(tajmer_Tick);
                tajmer.Start();
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
           pictureBox2.Location = new Point((int)(new Random().Next(0, 1000)), (int)(new Random().Next(0, 600)));
           pictureBox3.Location = new Point((int)(new Random().Next(0, 600)), (int)(new Random().Next(0, 100)));
           pictureBox4.Location = new Point((int)(new Random().Next(0, 100)), (int)(new Random().Next(0, 60)));
           pictureBox5.Location = new Point((int)(new Random().Next(0, 1300)), (int)(new Random().Next(0, 500)));
           pictureBox6.Location = new Point((int)(new Random().Next(0, 400)), (int)(new Random().Next(0, 780)));
        }
        private void tajmer_Tick(object sender, EventArgs e)
        {
            pictureBox7.Location = new Point(pictureBox7.Location.X, pictureBox7.Location.Y - 30);
        }
    }
    public static class GlobalVariables
    {
        public static int a = 0;
    }
}
Borisav Živanović je offline   Odgovor sa citatom ove poruke
Stara 15.6.2015, 13:55   #2
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 10.161
Zahvalnice: 1.574
Zahvaljeno 4.371 puta na 2.445 poruka
Određen forumom Re: Objekat ubrzava umesto da se kreće stalnom brzinom

Možda zato što svaki put kad pritisneš spejs, tajmeru dodaješ još jedan tick handler a stari (koji su mu dodeljeni na prethodne pritiske) su i dalje aktivni.
Prvi put kad pritisneš space, tajmer dobija tick handler koji gura kontrolu za 30 piksela uvis u svakom trenutku. Sledeći put kad pritisneš space, dodaješ još jedan tick handler, tako da imaš dva koja guraju za po 30 piksela, odnosno kontrola ide uvis duplo brže, itd.

Rešenje:

1. Tajmer kreiraj i dodeli mu tick handler u konstruktoru forme, a ne na pritisak na space. Ne startuj ga još uvek.

2. U tajmer_Tick, pre nego što pomeriš pictureBox uvis, proveravaj da li je pictureBox premašio gornju koordinatu forme (if pictureBox.Top < 0) i ako jeste, stopiraj tajmer.

3. Pritiskom na Space samo nasetuj pictureBox na određenu lokaciju i aktiviraj tajmer sa Start, kako bi (ponovo) počeo da radi.

I čisto radi optimizacije, kontrolu pomeraj uvis dekrementiranjem Top-a, a ne kreiranjem novog Point-a svaki put.
voodoo_ je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci:
Borisav Živanović (15.6.2015)
Odgovor

Bookmarks sajtovi

Tagovi
igra

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno



Sva vremena su po Griniču +2 h. Sada je 4:01.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2019, vBulletin Solutions, Inc.
Hosted by Beograd.com