Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив. 
:(
    Опции темы
hafman
  Дата 26.5.2011, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Как должен выгледить массив если он состоит из 3 "обьектов". 
Думал что 
Код

int array[2]={x,y,obekt}

А сам обьект имеет вид:
Работаю с SDL => 
Код

SDL_Surface* obekt;
.
Что самое странное подобная штука не  работает, и выкидывает матные слова типо 
Код

error: too many initializers for ‘int [2]’
error: invalid conversion from ‘SDL_Surface*’ to ‘int’


PM MAIL   Вверх
triclosan
Дата 26.5.2011, 22:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Код

SDL_Surface* array[]={x,y,obekt};


Это сообщение отредактировал(а) triclosan - 26.5.2011, 22:48
PM MAIL   Вверх
bsa
Дата 26.5.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



hafman, обычно, разнородные объекты объединяют с помощью структур.
Но на твоем бы месте я описал задачу более глобально.
PM   Вверх
triclosan
Дата 26.5.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



hafman, x,y - это не SDL_Surface* ? smile 
PM MAIL   Вверх
bsa
Дата 26.5.2011, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



triclosan, логично предположить, что нет.  smile 
Скорее всего, он хочет сделать картинку с координатами относительно холста.
PM   Вверх
hafman
Дата 26.5.2011, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Цитата(bsa @  26.5.2011,  23:13 Найти цитируемый пост)
triclosan, логично предположить, что нет.  smile 
Скорее всего, он хочет сделать картинку с координатами относительно холста. 

Да, хочу сделать именно её smile . Просто надоело писать код без массивов,хочется компактности от него, думаю они мне помогут+ элементов с одинаковыми "картинками" много, надо как то это лечить, а не писать вечно новые координаты и наносы. 
 smile 
+
Имеются две функции:загрузки картинки для сюрфейса+ нанос на "окно".

Это сообщение отредактировал(а) hafman - 26.5.2011, 23:32
PM MAIL   Вверх
hafman
Дата 27.5.2011, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Каким образом  можно решить проблему повторяние обьектов, которые имееют одни характеристики? Просто дофига обьектов которые надо наносить на поверхность, а это ещё лишние строчки кода+это делать лень smile  smile 
PM MAIL   Вверх
hafman
Дата 27.5.2011, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



help
PM MAIL   Вверх
borisbn
Дата 27.5.2011, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Код

struct SurfaceAndCoords {
    int x;
    int y;
    SDL_Surface * surface;
};

SurfaceAndCoords array[] = { { x, y, objekt } };



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
hafman
Дата 27.5.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Цитата(borisbn @  27.5.2011,  13:38 Найти цитируемый пост)
код C++
struct SurfaceAndCoords {
    int x;
    int y;
    SDL_Surface * surface;
};
SurfaceAndCoords array[] = { { x, y, objekt } };

Если я правильно понял то тут идёт как бы"урезание кода"? А как можно сделать что бы количество таких масивов быо определенное количество, те  что бы не вечно писать структуру-массив, а как то определить сразу же  количество массивов. Может как то через переменную? Например перемеенная равна 5, то и количество таких массивов равно 5.Или это не реально?
PM MAIL   Вверх
hafman
Дата 27.5.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Может это аморально, но может быть массив структур?
PM MAIL   Вверх
bsa
Дата 27.5.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



hafman, пока что никто тебя толком не понял. попробуй рассказать еще проще, что ты в итоге хочешь получить. Пока что, из твоих сведений можно понять только то, что тебе нужен массив этих структур.
PM   Вверх
hafman
Дата 27.5.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Цитата(bsa @  27.5.2011,  18:28 Найти цитируемый пост)
hafman, пока что никто тебя толком не понял. попробуй рассказать еще проще, что ты в итоге хочешь получить. Пока что, из твоих сведений можно понять только то, что тебе нужен массив этих структур. 

Вот написал код, с массивом структур, но он не работает.Выдает ошибку сигментации, надо что бы он ВСЕ 9 элементов отрисова, а не 1. Писать каждый расс apply_surface уже тошнит  smile .Может есть варианты решить проблему?

Код

#include <SDL/SDL.h>
#include "uf.h"
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 100

struct Strukts {
    int x;
    int y;
    //SDL_Surface * surface;
}ona[9];
Strukts surface(int x, int y, SDL_Surface* src, SDL_Surface* dst, SDL_Rect* clip);
int main(){
    SDL_Surface* ono;
    SDL_Surface* screen;
    int i;
    ona[i].x=30;
    ona[i].y=40;
    ono=load_image("zamena.png");
    SDL_Event event;
    int quit = 0;
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
    while(!quit)
        {

        SDL_PollEvent(&event);    
        if (event.type == SDL_QUIT)
        {
            quit = 1;
        }
        else if (event.type == SDL_KEYDOWN) 
            {
            if (event.key.keysym.sym == SDLK_ESCAPE)
            {
                quit = 1;        
            }
            surface(ona[i].x,ona[i].y,ono,screen,0);
            
            SDL_Flip(screen);
    }
    }
    SDL_Quit();
    return 0;
}
Strukts surface(int x, int y, SDL_Surface* src, SDL_Surface* dst, SDL_Rect* clip){
    SDL_Rect obekt;
    obekt.x = x;
    obekt.y=y;
    SDL_BlitSurface(src, clip, dst, &obekt);
}

Выдается ошибка сегментированя, как ее убить можно?Задача такова  что нужно нанести 9 обьектов:c

Это сообщение отредактировал(а) hafman - 27.5.2011, 19:43
PM MAIL   Вверх
xvr
Дата 27.5.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Пока у вас нарисовано нечто непонятное, но явно неправильное. Можете внятно изложить, что же вам надо?

PM MAIL   Вверх
hafman
Дата 27.5.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Цитата(xvr @  27.5.2011,  19:40 Найти цитируемый пост)
Пока у вас нарисовано нечто непонятное, но явно неправильное. Можете внятно изложить, что же вам надо?

    В этом коде для наноса картинки (картинки, координат по х и у)  на screen используется  (apply_surface). Теперь представьте что нужно 20 штук одинаковых "картинок"==>нужно еще 20 раз напписать apply_surface , да и плю к этому еще координаты-это еще 40 строчек кода и ишний гемор. Я хочу избаавиться как нибудь от этих 60 строк кода, и переделать их в меньшее количество. Товарищи предлагают делать через структуры, как видите структура которую я написал работате только с "определённым значением", а мне надо что бы загружались все структуры в массиве (а не пятая,восьмая и тд), и соответсвенно они наносились с разными координатами(функцию рандома могу дать). Те вывод я так думаю что надо что то типо такого, как мне приставляется
Код

/////
ona[i],x=random(1,100);
ona[i],y=random(80,430);
..
..
..
for (i=0;i<20;i++){//для наноса 20 обьектов с характеристиками этой структуры.
      apply_surface(ona[i].x,ona[i].y,ono,screen,0);
      break;

В моём коде 9 обьектов, но разнецы не какой

Добавлено @ 20:17
Проблема ясна?
Help smile 

Это сообщение отредактировал(а) hafman - 27.5.2011, 20:23
PM MAIL   Вверх
hafman
Дата 27.5.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Вообщем надо обойти массив структур, и сделать на каждом шаге сделать сними одинаковые действия.
PM MAIL   Вверх
xvr
Дата 27.5.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Код

// somewhere at global level
struct Point {
 int x, y;
} points[]={
{1,2}, // x & y coordinate for first point
{1,4}, // the same for second 
{3,5}, // ... 3d
...   // and for all others
};



// somewhere in function
DL_Surface* ono=load_image("zamena.png");
for(int i=0;i<sizeof(points)/sizeof(points[0]);++i)
 {
  SDL_Rect r={points[i].x,points[i].y};
  SDL_BlitSurface(ono, clip, dst, &r);
 }


PM MAIL   Вверх
hafman
Дата 27.5.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Цитата(xvr @  27.5.2011,  21:05 Найти цитируемый пост)
1:

    
// somewhere at global level
struct Point {
 int x, y;
} points[]={
{1,2}, // x & y coordinate for first point
{1,4}, // the same for second 
{3,5}, // ... 3d
...   // and for all others
};
// somewhere in function
DL_Surface* ono=load_image("zamena.png");
for(int i=0;i<sizeof(points)/sizeof(points[0]);++i)
 {
  SDL_Rect r={points[i].x,points[i].y};
  SDL_BlitSurface(ono, clip, dst, &r);
 }

А как массив в функции наноса передать тогда?
PM MAIL   Вверх
xvr
Дата 27.5.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(hafman @  27.5.2011,  21:44 Найти цитируемый пост)
А как массив в функции наноса передать тогда? 

Тут массив глобальный. Можно его и параметром передать (но тогда понадобится 2 параметра - длинна массива тоже нужна)
Код

void draw(Point* pnts, int total_points)
{
 ...
 for(int i=0;i<total_points;++i)
 {
  SDL_Rect r={pnts[i].x,pnts[i].y};
  SDL_BlitSurface(ono, clip, dst, &r);
 }
...
}

// Call -
draw(points,sizeof(points)/sizeof(points[0]));
Или предусмотреть специальный завершающий элемент в массиве (например {-1,-1}). В таком случае размер массива передавать не надо

PM MAIL   Вверх
hafman
Дата 28.5.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.4.2011

Репутация: нет
Всего: нет



Код

#include "ufo.h"

#define SCREEN_WIDTH 700
#define SCREEN_HEIGHT 500

typedef struct {
    int x;
    int y;
    int a;
    int b;
    int c;
    int d;
    int e;
    int f;
    int g;
    int h;
} points;
int main(){
        int point=30;
    int quit=0, i;
    int ax1=30;
    int ax2=70;
    SDL_Surface* hero;
    SDL_Surface* screen;
    SDL_Event event;
    SDL_Surface* ufo_sur[point];
    points ufo[point];
    int hx=rand(10,250);
    int hy=45;
    hero=load_image("tarelka.png");
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
    for(i=0;i != point ;i++){
        ufo[i].x=ax1+ 100*i;
        ufo[i].y=300;
        ufo[i].a=ax2+100*i;
        ufo[i].b=340;
        ufo[i].c=ax1+100*i;
        ufo[i].d=380;
        ufo[i].e=ax2+100*i;
        ufo[i].f=420;
        ufo[i].g=ax1+100*i;
        ufo[i].h=460;
        ufo_sur[i]=load_image("image.png");
    }
    while(!quit){
        SDL_PollEvent(&event);

        if (event.type == SDL_QUIT)
        {    

            quit = 1;
        }
        else if (event.type == SDL_KEYDOWN) 
            {
            if (event.key.keysym.sym == SDLK_ESCAPE)
            {
                quit = 1;        
            }
        
            if (event.key.keysym.sym == SDLK_a)
            {
                hx-=1;


            }
            if (event.key.keysym.sym == SDLK_d)
            {
                hx+=1;

            }
            if (event.key.keysym.sym == SDLK_w)
            {
                hy-=1;

            }    
            if (event.key.keysym.sym == SDLK_s)
            {
                hy+=1;
            }            
        }
        
        SDL_FillRect(screen,&(screen->clip_rect),SDL_MapRGB(screen->format,0x00, 0x00, 0x00));
        
        if (ufo[i].x==hx&ufo[i].y==hy){SDL_FreeSurface (ufo_sur[i]);}
        for(i=0;i != point ;i++){
            apply_surface(ufo[i].x,ufo[i].y,ufo_sur[i],screen,0);
            apply_surface(ufo[i].a,ufo[i].b,ufo_sur[i],screen,0);
            apply_surface(ufo[i].c,ufo[i].d,ufo_sur[i],screen,0);
            apply_surface(ufo[i].e,ufo[i].f,ufo_sur[i],screen,0);
            apply_surface(ufo[i].g,ufo[i].h,ufo_sur[i],screen,0);
        }
        apply_surface(hx,hy,hero,screen,0);
            SDL_Flip(screen);
    }
    printf("dsfsdf");
    SDL_Quit();
    return 0;
}

Написал код, теперь ни худо бедно наносятся, возникла проблема "уничтожения" ufo. Как не крутил и не получилось :c,доходило до самого тупого 
Код

if (ufo[i].x==hx&ufo[i].y==hy){ufo[i].x+=100;}

Как их удалить можно?

Это сообщение отредактировал(а) hafman - 28.5.2011, 22:38
PM MAIL   Вверх
bsa
Дата 30.5.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



hafman, Если ты про убирание с экрана, то перед рисованием надо сохранить область экрана, а после восстановить ее. К сожалению, далеко не всегда это получается сделать просто. Поэтому, в современных графических приложениях экран рисуют полностью каждый кадр.
PM   Вверх
Dov
Дата 30.5.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(hafman @  28.5.2011,  22:37 Найти цитируемый пост)
if (ufo[i].x==hx&ufo[i].y==hy)

Может быть ты так хотел?
Код
if (ufo[i].x==hx && ufo[i].y==hy)




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.3785 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.