Kopírování objektu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kopírování objektu – C / C++ – Fórum – Programujte.comKopírování objektu – C / C++ – Fórum – Programujte.com

 

Peet
~ Anonymní uživatel
13 příspěvků
27. 5. 2012   #1
-
0
-

Zdravim,

můj problém spočívá v tom, že mám primitivní hru (nejsem příliš pokročilý uživatel, ale něco zvládnu a většinu kódů si přelouskám), princip je jednoduchý, pohybujete se s panáčkem a sbíráte kuličky, to vše funguje, můj kámen úrazu je v druhé části, kdy potřebuji z kuliček "stavět", neboli přepnu si do druhého formuláře a chci aby se tečka zobrazila na pozici panáčka (také funguje)

private void Form3_Paint(object sender, PaintEventArgs e)
        {
            
            kreslici_plocha = e.Graphics;
                kreslici_plocha.FillEllipse(Brushes.Red, xElipsy, yElipsy, 19, 19);  
        }

---
case Keys.Space:

                    xElipsy=xPanak;
                    yElipsy=yPanak;                  
                    Refresh();
                    break;

Ale teď přichází kámen úrazu -> když přejdu na jinou pozici a chci znovu vykreslit kuličku, kulička se jen překreslí, nevytvoří nová (změní se souřadnice). A zde potřebuji pokud možno radu. Pevně věřím že to bude něco jednoduchého (i když ne, děkuji za každou radu). Jak již jsem řekl, nejsem moc pokročilý, proto jsem zkoušel najít různé kódy, bez úspěchu. (Není tu nějaka možnost na vyřešení přes cyklus, pole, save obrazovky, nějaké zakomponování "new"?) Doufám, že jsem popsal problém rozumě a smysluplně a že mi někdo poradí, předem děkuji za pomoc. btw jazyk: C#

Nahlásit jako SPAM
IP: 62.168.1.–
Doomista+1
Stálý člen
27. 5. 2012   #2
-
0
-

možností je několik. já osobně bych si udělal celočíselné pole, které by mělo dva sloupce x a y a do nich zanesl souřadnice panáka ve chvíli, kdy bys chtěl kuličku "položit", zvednout o jedna ID řádku a následně vykreslovat. nevím úplně přes co to vykresluješ, na jakým principu to funguje, ale s tím už pak asi poradíš

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
Doomista+1
Stálý člen
27. 5. 2012   #3
-
0
-

ještě mě napad jeden způsob. předpokládám, že máš double buffering a všechno ukládáš do kreslici_platno, pak vyblitneš na obrazovku a obsah platna smažeš. můžeš použít triple buffering, kdy si uděláš ještě jedno plátno, do něj budeš ukládat vykreslené koule, jeho obsah vždy vyblitneš do kreslici_platno a nebudeš to druhý plátno mazat, ale má to nevýhodu, že už se nedá pracovat s daty. pak ještě můžeš udělat pole objektů, ale myslím, že pole hodnot je lepší a efektivnější

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
Peet
~ Anonymní uživatel
13 příspěvků
28. 5. 2012   #4
-
0
-

#2 Doomista
Nevim jestli si plně rozumíme, ale pokud ano tak toto jsem zkoušel. Jenže když

kreslici_plocha.FillEllipse(Brushes.Red, xElipsy, yElipsy, 19, 19);

xElipsy a yElipsy budou pole, a já posléze zvednu ID, stále se vykreslí pouze JEDNA tečka... Možná že to myslíš jinak, nebo by to šlo "ochcat" přes cyklus, ale nejsem tak zdatný abych to sám sesmolil.

K druhému příspěvku, ano používám double buffering, o triple b. jsem nic neslyšel, když by to fungovalo (vykreslování teček) plně by mi to stačilo, s těmito vykreslenými daty již nic dělat nebudu. (jestli jsem to správně pochopil.) Přidávám úplný kód formuláře:

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 Panacek
{
    public partial class Form3 : Form
    {
        
        
        int xElipsy = -300;
        int yElipsy = -300;
        
        int xPanak = 22, yPanak = 29;
        Image PANAK = Properties.Resources.panacek;
        Image PANAK_zada = Properties.Resources.panacek_zada;
        Image PANAK_bilej = Properties.Resources.panacek_white;
        Image PANAK_bilej_levo = Properties.Resources.panacek_white_left;
        Image PANAK_bilej_pravo = Properties.Resources.panacek_white_right;
        Graphics kreslici_plocha;
       

        public Form3()
        {
            InitializeComponent();
        }
        
        private void Form3_Load(object sender, EventArgs e)
        {
            label1.Text = Panacek.Form1.Score.ToString();
        }

        private void Form3_Paint(object sender, PaintEventArgs e)
        {
            
            kreslici_plocha = e.Graphics;
            kreslici_plocha.DrawImage(PANAK, xPanak, yPanak, 45, 45);
            
           
                kreslici_plocha.FillEllipse(Brushes.Red, xElipsy, yElipsy, 19, 19);
              
            
        }
 

        private void Form3_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.W:
                    yPanak -= 8;
                    PANAK = PANAK_zada;
                    
                    break;


                case Keys.S:

                    yPanak += 8;
                    PANAK = PANAK_bilej;
                    break;

                    

                case Keys.A:

                    xPanak -= 8;
                    PANAK = PANAK_bilej_levo;
                    break;


                case Keys.D:

                    xPanak += 8;
                    PANAK = PANAK_bilej_pravo;
                    break;

                case Keys.Space:

                    xElipsy=xPanak;
                    yElipsy=yPanak;
                    Refresh();
                    break;

                case Keys.F12:
                    Application.Exit();
                    break;

               

            }
            Refresh();
        }

Nejdůležitější části: Samotné vykreslení tečky + příkaz na mezerníku.

Pokud by mi někdo dal nějaký názorný příklad budu jedině rád. Předem dík za ochotu. Pokud budou potřeba ještě nějaké info. dodám.

Nahlásit jako SPAM
IP: 62.168.1.–
Doomista+1
Stálý člen
28. 5. 2012   #5
-
0
-

kód mé první verze:

na to abych napsal kód pro triple buffer neznám

const short MAX=10; // maximální počet teček, tohle číslo si upravuj dle chuti
short pole[MAX][2]={0}; //pole[ID][0] je X a pole[ID][1] Y
short pocitadlo=0;
....
case Keys.Space: //zapsání dat
pole[pocitadlo][0]=xPanak;
pole[pocitadlo][1]=yPanak;
pocitadlo++;
Refresh();
break;
....
//vykreslení elips
for(short a=0; a<pocitadlo; a++)
kreslici_plocha.FillEllipse(Brushes.Red, pole[a][0], pole[a][1], 19, 19);

 syntax tohodle vykreslování dostatečně, musel bys znát allegro abych ti mohl napsat kód, ale tohle ti snad postačí a je to do budoucna praktičtější

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
Doomista+1
Stálý člen
28. 5. 2012   #6
-
0
-

#5 Doomista
safryš, nějak se mi rozlezlo formátování, ale smysl je snad jasný  

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
Peet
~ Anonymní uživatel
13 příspěvků
31. 5. 2012   #7
-
0
-

#6 Doomista
Trochu jsem to musel predelat, ale zaklad je vicemene spravny. Vyuzivam k tomu cyklus i poli, ktere jsem konecne alepson castecne pochopil. Dekuji za uzitecne rady ;)

Nahlásit jako SPAM
IP: 62.168.1.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 71 hostů

Podobná vlákna

Kopírování — založil Paulí

Kopírování souborů z CD — založil Sebix

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý